2009-07-06 48 views
2

回到当天,我使用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客户端。事实上,我过去一些简单的东西就是这样做的。但是,这更复杂。我不知道的一些事情:

  1. 的接口在由客户所消耗的类型库中的所有规定(即必须保持未改性)。我可以假设我可以构建一个基于现有类型库实现这些接口的.NET服务器吗?

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

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

    我不相信任何一个客户端使用IDispatch方法,但我会假设,通过互操作产生的虚函数表必须匹配。如何从.NET服务器公开这个?

  3. 什么类型的项目应该包含组件?控制台应用程序?

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

  5. 与(4)相关,该服务器是否将使用多线程模型?

回答

0

我来自相似的背景,我可以像会有显著努力做到这一点,特别是如果你不想碰客户都没有。

有.NET创建名为Tlbexp.exe SDK工具,这将导出类型库为你的.NET程序集。我假设你需要使用这个工具来运行你的新的c#程序集(dll)来生成与旧的COM服务器相同的类型库。

2

开始我会推荐阅读this(曾经在C#中完成一个大型C++应用程序的重写?)

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

该项目将是一个类库,将由COM +承载,您可以将该项目作为服务托管,而且您不需要编写主机COM +会照顾到这一点。

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

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

相关问题