在C#中创建COM自动化服务器

我目前有一个用C#编写的.NET类库,它通过COM将其function暴露给C ++程序(pre -.NET)。

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

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

你实际上可以在.NET中做到这一点(我以前做过它作为一个概念validation),但是让一切正常工作(流程生命周期,注册等)是一项工作。

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

注册也不错:创建一个ComRegisterFunction属性方法,在HKLM \ CLSID(yourclsidhere)下添加一个LocalServer32键,其默认值是exe的路径。 运行regasm yourexe.exe / codebase / tlb,你很高兴。

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

以下是MSDN中的一篇文章,其中介绍了如何在c#(。net): link中创建COM localserver的所有方面