【问题标题】:Creating a COM Automation Server in C#在 C# 中创建 COM 自动化服务器
【发布时间】:2010-12-17 21:52:47
【问题描述】:

我目前有一个用 C# 编写的 .NET 类库,它通过 COM 将其功能公开给 C++ 程序(.NET 之前的版本)。

我们现在想要将库移出进程以释放主应用程序中的地址空间(它是一个图像处理应用程序,大图像会占用地址空间)。我记得我在 VB6 的日子里可以创建一个“OLE 自动化服务器”。当对象被创建/销毁时,操作系统会自动启动和停止服务器 .exe。这看起来非常适合我们:据我所知,客户端不会发生任何变化,只是它会使用 CLSCTX_LOCAL_SERVER 而不是 CLSCTX_INPROC_SERVER 调用 CoCreateInstance。

如何在 C# 中创建这样的进程外服务器?要么网上没有关于它的信息,要么我的术语已经过时/过时了!

【问题讨论】:

  • 我一度得出结论,这不受支持,但我还没有看到任何地方明确说明。我已经尝试与 CoRegisterClassObject 互操作来为 C# COM 对象注册一个工厂,但我从来没有让它工作。好奇其他人有没有运气!
  • 在这里查看我的答案:stackoverflow.com/questions/24724784/…

标签: c# .net com automation


【解决方案1】:

您实际上可以在 .NET 中执行此操作(我之前已将其作为概念验证),但要让一切正常运行(进程生命周期、注册等)需要做一些工作。

创建一个新的 Windows 应用程序。在 Main 方法中,调用 RegistrationServices.RegisterTypeForComClients - 这是一个围绕 CoRegisterClassObject 的托管包装器,它为您处理类工厂。将托管 ComVisible 类的类型(您实际想要创建的类 - .NET 自动提供类工厂)以及 RegistrationClassContext.LocalServer 和 RegistrationConnectionType.SingleUse 传递给它。现在您有了一个非常基本的 exe,可以注册为 LocalServer32 以进行 COM 激活。您仍然需要计算出进程的生命周期(使用构造函数/终结器在托管对象上实现引用计数 - 当您达到零时,调用 UnregisterTypeForComClients 并退出)- 在所有对象都死之前,您不能让 Main 退出。

注册还不错:创建一个 ComRegisterFunction 属性方法,在 HKLM\CLSID(yourclsidhere) 下添加一个 LocalServer32 键,其默认值为您的 exe 的路径。运行 regasm yourexe.exe /codebase /tlb,一切顺利。

【讨论】:

  • 谢谢:原来生命周期管理不是问题:我们只是在主应用程序启动时启动进程外服务器,并在它完成时将其关闭。所以唯一的技巧就是调用 RegistrationServices.RegisterTypeForComClients - 简单!
【解决方案2】:

您始终可以使用 InteropServices 将 .NET 类公开为 COM 类,然后将库配置为 COM+ 应用程序。 .NET 库将在进程外运行并由 DLLHOST.EXE 实例托管。

【讨论】:

    【解决方案3】:

    这是 MSDN 中的一篇文章,涵盖了如何在 c# (.net) 中创建 COM 本地服务器的各个方面:link

    【讨论】:

      【解决方案4】:

      您的帖子是不久前开始的,我也遇到了同样的问题。以下链接是绝对的黄金,告诉你一切

      http://www.andymcm.com/blog/2009/10/managed-dcom-server.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-17
        • 2011-11-16
        • 1970-01-01
        • 2012-04-19
        • 2011-12-30
        相关资源
        最近更新 更多