我正在编写一个基于来自第三方(无源)的COM对象的应用程序,包含在我的应用程序引用中。 COM对象创建某些记帐数据的镜像,因此可以以其他格式(专有格式 - > MSSQL)读取。该应用程序是COM对象的包装器,允许在其中进行交互; COM对象本身会定期检查专有文件以查看它们是否已更新,如果有,则复制它们。
我们有许多客户,每个客户都拥有自己的专有格式帐户。我们正在从之前的应用程序进行转换,一旦完成,我们将有50个客户端以这种方式运行。我已经有一个只适用于一个客户端的应用程序,我不认为有50个应用程序副本不断运行是有利的,特别是当COM似乎有缓慢的内存泄漏(argh)时。因此,我正在尝试编写的程序将采用以某种方式分组的各种客户端,并在后台运行每个客户端的COM,而前台允许进行额外的交互,如果需要,还可以重新启动COM对象。
起初我尝试使用Threads / BackgroundWorker,这看起来工作正常,但经过一番讨论后发现,尽管COM对象在为客户端创建的每个类中都声明为New,但所有客户端都共享相同的COM实例,所以只有最新加载的客户端才会做任何事情。
虽然肯定是我做错了(如果可以的话,请说出来!如果有帮助我会发布我的代码),似乎我需要有一种方法来加载程序中每个客户端的单独的.DLL实例;可悲的是,这比我现在的水平更高。我一直在阅读应用程序域和反射,但从我能找到的一点点来看,似乎我不能轻易调用方法,也可能无法使用事件(我依赖它来更新信息)在申请中。)
tl; dr:加载DLL的单独实例的最佳方法是什么,以便我可以操作信息并侦听来自COM对象的事件?
答案 0 :(得分:1)
我建议加载到单独的AppDomains
。这将在整个系统中为您提供相当好的隔离和可靠性。最重要的一点 - 处理失败,使用AppDomains,您可以在未处理的错误的情况下卸载任何特定的AppDomain
。否则,一个组件(DLL)中的问题可能会使整个系统崩溃,并将多个组件加载到单独的线程/程序集中。
有用的链接: