2010-12-23 26 views
1

我有一個圖像編輯器用戶控件(c#.net v2.0)。它在數千臺計算機中用作activex組件。我希望組件也可用於Windows窗體和其他可能的用途。如何創建通用庫

對於activex用法,我在html代碼中添加<object>標記並用clsid(靜態guid)調用組件。所以如果我構建併發佈一個更新的版本,它不會改變任何客戶端代碼。

我希望Windows窗體能夠使用相同的分佈式庫。而且他們不應該引用特定的版本,所以我可以在不更改使用它的程序的情況下更新組件。

我使用regasm註冊com。但我不知道如何引用它從視覺工作室(如引用與clsid?)

可能在視覺stuido當我選擇添加引用並選擇COM選項卡我shuld看到我的組件在列表中。

注:我嘗試使用這些線路的assemly添加到全局緩存,但它沒有工作,或者我coulnt明白如果有什麼改變了:)

"C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\tlbexp" ImageEditorComp.dll /out:ImageEditorComp.tlb 
regasm /tlb:ImageEditorComp.tlb ImageEditorComp.dll 
"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\gacutil" /I ImageEditorComp.dll 

任何建議表示讚賞, 問候

回答

0

我想出了一個解決方案。

爲了通過步驟解釋步驟:

1-創建與COM所有需要的特性的成分(註冊組件,用於玉米使用的接口,使組件COM可見)

在客戶機上

2-註冊裝配regasm(我建議添加安全標誌)。

3-組件添加到全局緩存使用GACUTIL(或MSI安裝程序)

我想通了,當你調用的組件GAC的特定版本中搜索擺在首位,所以如果它安裝在GAC,引用的代碼庫路徑從不使用。

使用作爲activeX時,您使用GUID尋址組件。由於regasm添加了GUID所代表的程序集名稱和版本,因此Web瀏覽器直接使用來自GAC的組件。

從桌面應用程序使用時,直接引用assebmly並將copylocal屬性設置爲false。同樣,在客戶機窗口中會找到位於GAC本身的程序集。

以下是有關該主題的有用鏈接。

http://www.simple-talk.com/dotnet/visual-studio/build-and-deploy-a-.net-com-assembly/

希望這樣可以節省其他人的時間:)

2

這是不可能的,你會調用臭名昭着的和可怕的DLL地獄問題。 COM中一個嚴格的硬規則是,當你在公開可見的接口或者它們的實現中進行重大更改時,來更改公共接口上的[Guid]屬性值。更改GUID可確保在使用Regasm.exe時不會覆蓋舊版組件的註冊表項。使用您的組件並且未重新編譯爲使用最新版本的現有程序將繼續運行而不會出現問題。 DLLHell的典型結果是一個討厭的硬件異常,如AccessViolation,很難難以排除故障。

這些都不適用於你的具體情況。嘗試通過COM使用組件沒有任何意義。這是一個.NET程序集,只需直接添加引用即可。 IDE實際上會阻止您添加對interop庫的引用。但不是.tlb。假設你正確地增加了[AssemblyVersion],GAC讓你遠離DLL地獄。

+0

感謝您的回答是我保存的時間找出解決方案。 – honibis 2010-12-27 14:10:19