2012-02-21 29 views
1

我正在写一个基于来自第三方(无源)的COM对象的应用程序,包含在我的应用程序参考中。 COM对象创建一个特定记帐数据的镜像,以便能够以另一种格式读取(专有格式 - > MSSQL)。该应用程序是COM对象的包装器,允许在其中进行交互; COM对象本身会定期检查专有文件以查看它们是否已更新,然后复制它们(如果有)。将DLL的单个实例加载到应用程序:AppDomain,线程或其他东西?

我们有很多客户,每个客户都有自己的专有格式帐户。我们正在转换之前的应用程序,一旦完成,我们将有大约50个客户端以这种方式运行。我已经有一个只适用于一个客户端的应用程序,我认为这不会有利于持续运行50个应用程序副本,尤其是当COM似乎缓慢的内存泄漏(argh)时。因此,我试图编写的程序将采用不同的客户机以不同的方式进行分组,并在后台为每个客户机运行COM,而前台允许进行额外的交互,并且如果需要的话,可以重新启动COM对象。

起初我尝试使用Threads/BackgroundWorker,而且看起来工作正常,但经过一番讨论后发现,尽管COM对象在为客户端创建的每个类中声明为New,但所有客户端都共享相同的COM实例,所以只有最新加载的客户端才会执行任何操作。虽然它可能肯定是我只是做错了(如果我可以,请说出来!我会发布我的代码,如果它会有所帮助),似乎我需要有办法为程序中的每个客户端加载一个单独的.DLL实例;可悲的是,这比我所处的位置要高。我一直在阅读应用程序域和反思,但从我已经能够发现的事情来看,似乎我可以轻松地调用方法,并且可能无法使用事件(我依赖它来更新信息在应用程序中。)

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

回答

1

我会建议加载到单独的AppDomains。这将使您在整个系统中获得相当好的隔离和可靠性。最重要的一点 - 处理失败,使用AppDomains,您将能够卸载任何特定的AppDomain以防未处理的错误。否则,一个组件(DLL)中的问题可能会导致整个系统崩溃,并且多个组件加载到单独的线程/组件中。

相关链接:

+0

酷,很高兴知道我是在正确的轨道上。看看[这个问题](http://stackoverflow.com/questions/1277346/net-problem-with-raising-and-handling-events-using-appdomains),似乎唯一我必须做的特别与关于把它放在一个域中是使用CreateInstanceAndUnwrap,通过MarshalByRefObject扩展所有的类(我怀疑COM实现了这个,所以我为COM通过域来做一个包装)。还有什么我需要做的,以保持事件处理程序和这样的工作,或从那里是它像往常一样业务? – Tukaro 2012-02-21 20:11:41

+0

我相信这将是一个BAU,正如你所提到的,至少在一般情况下,否则有趣的是看到更具体的情况 – sll 2012-02-21 20:20:56

+0

好吧。另外,AppDomain是否像线程一样并行工作,还是需要设置包含线程来为每个AppDomain执行更长的进程? – Tukaro 2012-02-21 21:24:04