【问题标题】:Load individual instances of DLL to application: AppDomain, Threads, or something else?将 DLL 的单个实例加载到应用程序:AppDomain、线程还是其他?
【发布时间】:2012-02-21 19:09:21
【问题描述】:

我正在编写基于来自第三方(无源)的 COM 对象的应用程序,包含在我的应用程序引用中。 COM 对象创建了某些会计数据的镜像,因此可以以另一种格式(专有格式->MSSQL)读取它。该应用程序是 COM 对象的包装器,允许在其中进行交互; COM 对象本身会定期检查专有文件以查看它们是否已更新,如果有则复制它们。

我们有很多客户,每个客户都有自己的专有格式帐户。我们正在从以前的应用程序转换,一旦完成,我们将有大约 50 个客户端以这种方式运行。我已经有一个仅适用于一个客户端的应用程序,而且我认为让 50 个应用程序的副本不断运行是没有好处的,尤其是当 COM 似乎存在缓慢的内存泄漏时 (argh)。因此,我正在尝试编写的程序将以一种或另一种方式将各种客户端分组,并在后台为每个客户端运行 COM,而前台允许额外的交互,并在需要时重新启动 COM 对象。

起初我尝试使用 Threads/BackgroundWorker,这似乎工作正常,但经过一番摸索后发现,尽管在为客户端创建的每个类上都将 COM 对象声明为 New,但所有客户端都共享相同的COM 实例,所以只有最新加载的客户端才会做任何事情。

虽然肯定是我做错了(如果可能,请说出来!如果有帮助,我会发布我的代码),但似乎我需要一种加载方法为程序中的每个客户端提供一个单独的 .DLL 实例;可悲的是,这比我现在的水平更高。我一直在阅读应用程序域和反射,但从我所能发现的一点点来看,我似乎无法轻松调用方法并且可能无法使用事件(我依靠它来更新信息在应用程序中。)

tl;dr: 加载单独的 DLL 实例以便我可以操纵信息并监听来自 COM 对象的事件的最佳方法是什么?

【问题讨论】:

    标签: .net multithreading dll appdomain


    【解决方案1】:

    我建议加载到单独的AppDomains。这将为您在整个系统上提供相当好的隔离和可靠性。最重要的一点 - 处理故障,使用 AppDomains 您可以卸载任何特定的AppDomain,以防出现未处理的错误。否则,一个组件 (DLL) 中的问题可能会导致整个系统崩溃,同时将多个组件加载到单独的线程/程序集中。

    有用的链接:

    【讨论】:

    • 酷,很高兴知道我走在正确的轨道上。看着this question,似乎我唯一需要做的就是将它放在域中是使用 CreateInstanceAndUnwrap,通过 MarshalByRefObject 扩展所有类(我怀疑 COM 实现了这一点,所以我正在制作一个包装器让 COM 通过域)。我还需要做些什么来保持事件处理程序和此类工作,或者从那里照常营业吗?
    • 我相信这将是你提到的 BAU,至少在一般情况下,否则看到更具体的案例会很有趣
    • 好的。另外,AppDomains 是否像线程一样并行工作,还是我需要设置包含线程来为每个 appdomain 执行更长的进程?
    猜你喜欢
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多