2009-07-06 83 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來保留舊的。

相關問題