2012-05-04 54 views
0

我們有一個完全在.NET 4.0(C#)中開發的三層應用程序。作爲企業應用服務器,我們使用COM + 1.5(我知道這有點遺憾......)。在C#中爲.NET 4.0開發了一個服務器部分和一個客戶端部分。在沒有代理安裝的情況下調用COM +中的遠程.NET DLL

服務器部分公開服務繼承ServicedComponent類並返回實現「Serializable」屬性的對象。客戶端通過組件的COM +導出代理調用遠程類。我們通過ClickOnce分發客戶端應用程序,並且必須使用管理員權限將COM +生成的代理安裝到每臺客戶端計算機上。這是不好的一點。

因此,我們正試圖評估其他技術,使我們能夠消除這種代理安裝,但它不怎麼清楚如何做到這一點。我們希望找到一種低影響的方式,使我們能夠使用相同的COM +部分,並以某種方式將Proxy包括在客戶端代碼中。

我們試圖在客戶端部分使用這樣的代碼,但仍需要COM註冊。

Type comObjectType = Type.GetTypeFromProgID("SumNameSpace.SumClass", "servercomplus", true); 
SumInterface comObject = Activator.CreateInstance(comObjectType) as SumInterface; 

我們認爲使用在客戶端部分接口,而不是類將有工作,但我們有例外:

Runtime.InteropServices.COMException (0x800401F3): Invalid class string (Exception from HRESULT: 0x800401F3 (CO_E_CLASSSTRING)) 

如果沒有正確的信息應該發生這種錯誤關於Windows註冊表中的界面,但我們不知道...

任何想法?

非常感謝

+0

您是否檢查過潛在的32/64位問題? –

+0

我已經嘗試了32位Windows VISTA,並有同樣的錯誤! tnx – robob

+0

您可以使用免註冊的COM:http://msdn.microsoft.com/en-us/library/ms973913.aspx? –

回答

2

毫無疑問,您需要在所有客戶端計算機上安裝COM +代理,並且您希望使用代理安裝包進行安裝。您收到的錯誤是註冊表中HKEY_CLASSES_ROOT配置單元下缺少ProgID條目的結果。此註冊表條目等由安裝包提供。這不是代理安裝程序提供的全部內容;我發現一個很好的概述here

這聽起來像你真正想要的是爲你的ClickOnce部署創建一個自定義的應用程序清單。這應該允許您將代理安裝程序作爲引導先決條件捆綁到您的ClickOnce部署中。但是,安裝仍然需要管理權限;我沒有看到解決辦法(見下面的註釋)。這裏是a link to a tool,它與Stackoverflow用戶Greg Jackman創建的ClickOnce清單一起使用。我對此沒有任何經驗,但是基於Greg的帖子,它看起來對您可能會有所幫助。

最後一個注意事項:即使您確實找到了以非升級用戶身份運行安裝軟件包的方法,您也不希望這樣做。運行非提升會改變程序包與註冊表的交互方式。短篇小說,它會默默地失敗。

+0

感謝您的回覆,但我記得一些關於HKLC註冊表部分的內容,可以在註冊表的HKCU路徑中「模擬」。它與無REG的COM模式有關...看看這個網址:http://msdn.microsoft.com/en-us/magazine/cc188708.aspx 但是可能我混合了不同的東西..我不能相信微軟在ClickOnce流程中沒有考慮COM +代理整合。唯一的解釋可能是它的遺留問題,並且不再受支持 – robob

+0

另一個問題是:爲什麼當我僅使用接口時,需要在註冊表中使用CLSID? – robob

+0

由於Activator使用COM實例化對象,並且COM必須在註冊表中查找ProgID SumNameSpace.SumClass的COM服務器二進制文件(通過ClassID,它也在註冊表中) –

1

使用組策略分配組件?

+0

我們使用分發產品來部署代理組件,但我們更願意將代理部分包含到客戶端應用程序中,並使用ClickOnce部署整個部分 – robob

+0

Ben我剛剛看到您的分數......可能您知道答案,所以我們走吧! :) – robob

+0

@robob,如果你已經有一種方法來分發組件 - 只需繼續使用它!無論如何,這是我的建議。 – Ben

相關問題