如何指定我的 .NET 互操作应该使用哪个 COM 服务器?

Posted

技术标签:

【中文标题】如何指定我的 .NET 互操作应该使用哪个 COM 服务器?【英文标题】:How to specify which COM server my .NET interop should use? 【发布时间】:2011-12-06 14:23:02 【问题描述】:

我有一个使用 COM 服务器的 .NET 应用程序。 COM 服务器在我运行它的机器上注册,所以当我的代码到达new MyInterop.SomeObject() 时,相应的MyComServer.exe 就会启动。

但是,在我调试时,MyComServer.exe 的多个副本位于具有不同配置文件的不同文件夹中。我想指定我的应用应该加载哪个。

我知道的两种解决方法是:

每次使用前我都可以重新注册(MyComServer.exe /regserver)。但我不喜欢对局部问题使用全局解决方案。 我手动启动MyComServer.exe(然后它作为独立应用程序运行),COM 基础架构将重用这个现有进程。但这不是很自动化。

还有什么更合适的吗?

【问题讨论】:

【参考方案1】:

COM 服务器 .exe 由您的 new MyInterop.SomeObject() 调用启动。毫无疑问,您运行了这么多 .exe,因为您在调试时终止了程序,而没有让 .NET 正确关闭并减少终结器线程中的引用计数。 COM 没有清除这些丢失引用的机制。只需使用 Taskmgr.exe,进程选项卡即可终止正在运行的实例。

COM 具有通过 ROT(运行对象表)附加到服务器运行实例的机制。但是,这不是您以后可以附加的东西,它必须得到服务器的明确支持。如果您确实必须选择修补服务器,那么请考虑将其设置为进程内服务器。麻烦少了很多。

【讨论】:

【参考方案2】:

您可以尝试根据调试版本动态创建配置文件。

【讨论】:

嗯?如果我想并行运行我的应用程序的多个实例,每个实例都连接到不同的服务器,该怎么办? 啊,如果您有并发应用程序,您将需要那些不同的服务器 .. 最初建议构建服务器的多个调试版本 .. 虽然可能会出现注册表混乱 .. 如果我了解您的最后的评论不知道你有什么选择。 嗯,目前这只是一个假设场景,我希望我永远不必这样做......但我喜欢做好准备。所以你是说 - COM 不允许这种变态? 好吧,如果您必须为每个配置文件重新构建您的 COM 服务器,那么您将拥有比在运行时从配置中读取更少的选项。我确信后者会提供解决方案,但 COM 可能会变得非常混乱。 这更像是在我们的测试服务器上有多个版本的 COM 服务器(“服务器”在物理机中),所以最好指定使用哪一个。此外,这些 COM 服务器中的每一个都有自己的数据库(因此配置不同),因为数据库版本和软件版本必须匹配。哦,因为我们的软件同时支持MSSQL和Oracle,所以每个版本也有两个副本。

以上是关于如何指定我的 .NET 互操作应该使用哪个 COM 服务器?的主要内容,如果未能解决你的问题,请参考以下文章

如何将聚合 .NET COM 互操作添加到 ATL EXE 服务器?

COM Interop .NET 程序集 - 一个术语问题

如果它们不在 COM 互操作中执行,我应该将 LayoutKind.Auto 用于我的结构吗?

如何通过 COM 互操作在 .NET 对象上调用静态方法?

我可以将 .NET 5 COM 互操作对象与 VB6 连接起来吗?

64 到 32 位互操作 - 如何?