2

过去,我使用 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 类。事实上,我过去曾用一些简单的东西这样做过。然而,这要复杂得多。我不确定很多事情:

  1. 这些接口都在客户端使用的类型库中定义(必须保持未修改)。我可以假设我可以构建一个基于现有类型库实现这些接口的 .NET 服务器吗?

  2. 服务器实现了许多从 IDispatch 继承并标有“dual”和“oleautomation”的接口。举个例子:

    [odl, uid(...), dual, oleautomation]
    interface IKDFTSearchManager : IDispatch {
    
            HRESULT Method1(...);
            HResult Method2(...);
    }
    

    我不相信任何客户端使用 IDispatch 方法,但我会假设互操作生成的 VTable 必须匹配。如何从 .NET 服务器公开这一点?

  3. 什么类型的项目应该容纳这些组件?控制台应用程序?

  4. 如果使用其中一种互操作工具正确注册 DCOM,它可能会激活 EXE。是这样吗?基础设施的行为是否与 C++/ATL 服务器的行为一样——即导致激活单个 EXE 来为多个客户端请求提供服务?

  5. 与 (4) 相关,该服务器会使用多线程单元模型吗?

4

2 回答 2

2

首先,我建议您阅读这篇文章 (曾经用 C# 完全重写过大型 C++ 应用程序吗?)

您应该查看ServicedComponent,它是在 .NET 中实现 DCOM 服务器的官方方式。

该项目将是一个由 COM+ 托管的类库,您可以将项目作为服务托管,您也无需编写主机 COM+ 将负责这一点。

您可以引用旧的 tlb(但我建议在您的项目中编写 p/invoke 接口)并实现接口。

您将需要使用ProgIdAttribute来保留旧的。

于 2009-07-06T19:05:29.850 回答
0

我来自类似的背景,我可以想象会付出巨大的努力来做到这一点,特别是如果你根本不想接触客户。

有一个名为Tlbexp.exe的 .Net sdk 工具,它将在 .Net 程序集上为您导出类型库。我假设您需要使用此工具来针对您的新 c# 程序集 (dll) 运行以生成与旧 COM 服务器相同的类型库。

于 2009-07-06T19:04:50.303 回答