回到当天,我使用ATL库,使用VC++ 7.x(Visual Studio 2003和.Net 1.1)编写了一个进程外(即EXE)COM服务器。服务器使用多线程公寓(MTA)模型,并由DCOM调用(VB6客户端)激活。多个客户端请求由单个进程满足 - 由第一个请求激活(由COM基础结构自动启动)。如何在不破坏现有客户端的情况下使用c#重新实现旧的DCOM服务器?
这是相当复杂的一段代码,我现在必须对它进行一些更改。不幸的是,我建立的机器早已不存在了,甚至在使用VS 2003的新机器上编译项目时也遇到了问题。几年前,我玩弄了将这个项目迁移到VS 2005,但有很多打破ATL库的变化,我放弃了这一努力。
我没有去解决当前构建这个旧的VS 2003 C++项目的问题,而是在.NET中重写这个东西。这将使我的小商店更容易维护(我们不再使用C++)。 ATL宏和C++习惯早已从我的记忆中消失了,我想将它们留在那里。 :-)
所以我正在探索在C#/ VS2008中做这个重做的可行性。我知道你可以将.NET类暴露给COM客户端。事实上,我过去一些简单的东西就是这样做的。但是,这更复杂。我不知道的一些事情:
的接口在由客户所消耗的类型库中的所有规定(即必须保持未改性)。我可以假设我可以构建一个基于现有类型库实现这些接口的.NET服务器吗?
服务器实现了许多从IDispatch继承的接口,并标有“dual”和“oleautomation”。举个例子:
[odl, uid(...), dual, oleautomation] interface IKDFTSearchManager : IDispatch { HRESULT Method1(...); HResult Method2(...); }
我不相信任何一个客户端使用IDispatch方法,但我会假设,通过互操作产生的虚函数表必须匹配。如何从.NET服务器公开这个?
什么类型的项目应该包含组件?控制台应用程序?
如果DCOM正在使用其中一个互操作工具正确注册,则DCOM可能会激活EXE。是这样吗?基础架构的行为是否与C++/ATL服务器一样 - 即导致单个EXE被激活,从而为多个客户端请求提供服务?
与(4)相关,该服务器是否将使用多线程模型?