2014-03-26 85 views
2

我有一個帶有Shared屬性的VB.NET COM類,比如ABC。問題是這個組件被幾個C++ COM exe使用,所以我的理解是它們每個都會得到它們自己的程序集加載,並且Shared屬性對於每個EXE都是唯一的。有沒有辦法讓這個程序集交叉EXE共享屬性?需要我的COM服務器實例的共享屬性

Tx。

回答

1

通過創建一個進程外COM服務器(通常也稱爲ActiveX EXE),您所描述的內容將在本地COM中「輕鬆」完成。顧名思義,一個進程外COM服務器運行在它自己的進程中,並通過一個COM接口提供它的方法。如果多個客戶端同時使用COM服務器,則它們共享相同的服務器進程,因此該進程中的全局數據將在所有客戶端之間共享。

不幸的是,.NET不提供任何創建進程外COM服務器的機制。所有COM可見的.NET程序集都充當進程內COM庫,因此使用它的每個客戶端都擁有自己的一組全局數據。

唯一的選擇是創建一個標準的進程內COM可見庫,但它只是一個傳遞包裝器,它會調用某個其他進程。 .NET中的進程間通信通常由WCF處理,所以典型的解決方案是在後端運行一個WCF服務,與COM可見庫進行通信。如果你不想使用WCF,你也可以看看.NET Remoting或原始的TCP/IP套接字。

這裏有一個雞劃傷圖,以幫助可視化我的意思:

enter image description here

2

創建Windows Service application,要麼在ROT註冊你的共享單一對象或簡單地使用RegisterActiveObject/RevokeActiveObject了一個獨特的註冊它GUID。

因此,使用ROT或GetActiveObject從任何其他地方獲取此對象的COM代理。如果對象尚未註冊,則需要手動啓動Windows服務。

更新,它也有可能實現IClassFactory單身人士對象(這將返回自己)。該服務將通過CoRegisterClassObject註冊單身人士,類似於失去服務器的服務器行爲。最初的服務激活仍然是必需的。

最後,也許最簡單的解決方案是將程序集註冊爲程序外DLL surrogate。我還沒有嘗試過,但使用自定義互操作註冊時,它應該很容易。

更新,這裏是使用代理過程的example

+1

這真的很有趣。我從來沒有聽說過這個。 [這是一個鏈接](http://www.codeproject.com/Articles/17490/Running-Object-Table-Provider-in-NET-consumer-in-M)到C#中的一個示例項目,該項目通過ROT。它與標準的進程外COM服務器不完全相同,但它完成了同樣的事情。無可否認,這有點混亂,但我可以想象它可能值得的情況。 –

+0

謝謝。我會研究這個。 –

+1

@StevenDoggart,它實際上也可以在C#Windows服務中實現一個單例,這會暴露'IClassFactory'並返回它自己。該服務將通過'CoRegisterClassObject'註冊單例,類似於超級服務器的行爲。這只是當初的服務激活問題。 – Noseratio