gpt4 book ai didi

c# - 如何在不破坏现有客户端的情况下使用 C# 重新实现旧的 DCOM 服务器?

转载 作者:太空宇宙 更新时间:2023-11-03 11:54:18 25 4
gpt4 key购买 nike

过去,我使用 VC++ 7.x(Visual Studio 2003 和 .Net 1.1)和 ATL 库编写了进程外(即 EXE)COM 服务器。服务器使用多线程单元 (MTA) 模型并由 DCOM 调用(VB6 客户端)激活。多个客户端请求由单个进程满足——该进程由第一个请求激活(由 COM 基础结构自动激活)。

这是一段相当复杂的代码,我现在必须对其进行一些更改。不幸的是,我构建它的机器早已不复存在,甚至在使用 VS 2003 的新机器上编译项目时我也遇到了问题。几年前,我曾考虑过将这个项目转移到 VS 2005,但是有很多破坏 ATL 库的更改,我放弃了这项努力。

我没有解决构建这个旧的 VS 2003 C++ 项目时遇到的当前问题,而是尝试用 .NET 重写它。这将使它在我的小商店(我们不再使用 C++)更易于维护。 ATL 宏和 C++ 习语早已从我的内存中消失了,我想把它们留在那里。 :-)

因此,我正在探索在 C#/VS2008 中进行此重写的可行性。我知道您可以向 COM 客户端公开 .NET 类。事实上,我过去曾用一些简单的东西这样做过。然而,这要复杂得多。我不确定很多事情:

  1. 接口(interface)全部在客户端使用的类型库中定义(必须保持不变)。我是否可以假设我可以构建一个基于现有类型库实现这些接口(interface)的 .NET 服务器?

  2. 服务器实现了一些继承自 IDispatch 的接口(interface),并标有“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),这个服务器会使用多线程单元模型吗?

最佳答案

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

你应该看看ServicedComponent这是在 .NET 中实现 DCOM 服务器的官方方式。

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

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

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

关于c# - 如何在不破坏现有客户端的情况下使用 C# 重新实现旧的 DCOM 服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1088654/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com