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