2013-08-28 41 views
2

我有一個作爲第三方API的一部分提供的TLB。我使用TLBIMP.exe來生成DLL程序集包裝程序。但是,在開發時,程序集似乎需要使用regsvr32進行註冊。TLB到部署時沒有Regsrv32的託管.NET程序集

然而這在開發時並不是問題;我在生產環境中使用託管實例並手動註冊DLL將是一個痛苦,如果不是不可能的話,當我部署。有沒有辦法在部署過程中以不需要註冊步驟的方式使用託管的DLL程序集?

我一直在網上閱讀,並找到一些關於使用app.manifest的免註冊COM的文獻。這可能是一個可行的解決方案嗎?

+0

嘗試[隔離COM](http://qualapps.blogspot.com.au/2007/06/isolated-com.html?m=1) – Noseratio

+0

互操作程序集*從不*註冊。只有與你互操作的COM組件需要它。使用供應商推薦的部署程序。 –

回答

0

不幸的是,沒有。您的目標DLL是一個COM DLL,因此必須在其部署到的每個盒子上註冊。假設您正在構建一個部署安裝包,好消息是,大多數值得使用的安裝程序工具套件應支持開箱即用的COM註冊。檢查您的安裝程序的文檔。

如果你通過xcopy部署到大量的盒子,我會說現在是時候重新考慮你的策略了。你可能需要的唯一的安慰就是每個部署的版本只需要在一個盒子裏註冊一次COM DLL。但是,現在安裝xcopy通常是一個糟糕的主意。

更新:我站在更正 - 我投票了Noseratio。這些日子顯示了我很少關注COM集成。

+0

在這個階段,我們只是簡單地生成一個我們直接推送到AWS Elastic Beanstalk的Web部署。這非常簡單,我試圖保持它的'一鍵式'方面,並繼續使用Beanstalk作爲應用服務,而不是直接深入實例。 –

+0

@EricLloyd,謝謝。我仍然開發一些非託管代碼,儘管大部分代碼都是由「母親」.NET項目使用的。在可能的情況下,我更願意將其形成爲COM DLL,而不是在C#中進行互操作。 – Noseratio

1

如果類型庫也應該嵌入第三方COM DLL,那麼Isolated COM確實可以用於此目的(您可以使用OleView來驗證)。使用VS2010/2012,以這種方式使用COM DLL非常容易。 DLL必須在開發機器上註冊。然後,你只需添加它到你的.NET項目的引用,並打開其Embed Interop TypesIsolated屬性:

enter image description here

互操作程序集將與消費.NET程序集進行合併,而且你只需要確保COM DLL,.NET程序集和生成的文件在部署時一起復制。

考慮客戶端應用的COM公寓模型非常重要。您應該沒有與STA客戶端的問題。不過,對於MTA模型,默認的基於類型庫的編組器可能不適用於由隔離DLL創建的COM對象(更多信息請參見here)。如果DLL帶有COM代理/存根代碼實現,這也不應該是一個問題。