如何用這篇文章解決我們的工程對普通COM組件的引用:《引用ActiveX/COM組件時的Strong Name》

來源:互聯網
上載者:User
active|activex|解決  CSharp Tips:引用ActiveX/COM組件時的Strong Name     選擇自 Mittermeyer 的 Blog  問題DotNet平台下提供了比較完備的類庫,但是第一個版本總歸不可能面面俱到,而且由於曆史遺留問題,經常會和COM/ActiveX的組件之間進行互操作。筆者碰到的問題就是在一個Assembly中調用到了Excel的對象,但是該Assembly需要封裝成為一個ActiveX的Control,供IE的用戶端指令碼調用。簡而言之,我在C#中用到了一個COM組件,還需要把自己封裝成一個COM組件,聽起來有點多餘不過想不到更好的辦法。在這樣的封裝模式下碰到了一個問題,如果一個Assembly希望封裝成為ActiveX/COM組件,那麼它必須擁有強名(Strong Name),也就是說在編譯的時候需要指定SNK(Strong Name Key)。但是當一個Assembly如果以擁有強名的方式編譯的話,它又要求所以自身所引用的其他Assembly都必須擁有強名,否則不能夠成功編譯。而當我們在工程中直接引用一個COM組件(例如:Excel 10 Object Library),VS.Net能夠協助我們自動匯入類型庫,但是此時的參考型別庫是沒有強名的,在筆者所期望的環境下無法編譯成功。 解決碰到這個問題覺得很棘手,似乎陷入和死迴圈,不過查閱一下文檔,發現還是非常容易解決的,DotNet Framework中提供了相應的工具能夠轉換COM的類型庫,他就是TlbImp.exe(大家可以在類似“C:\Program Files\Microsoft Visual Studio .NET 2003 DK\v1.1”的目錄中找到)。TlbImp能夠將一個COM組件封裝成為DotNet可以使用的類庫的形式,VS.Net的自動轉換想必也是以來這個工具。該工具有很多參數開關,需要支援強名只要額外開啟一個開關即可。一下介紹筆者認為最可能用到的參數:/out:Filename:類型庫轉換之後輸出檔案的名稱。/namespace:Namespace:類型庫轉換所使用的名稱空間。/keyfile:FileName:指定轉換時使用的SNK檔案,指明該參數,構造之後的類型庫就擁有了強名。完整的例子如下:tlbimp excel.exe /out:interop.excel.dll /namespace:Excel /keyfile:excel.snk其中snk檔案可以通過DotNet中的另一個工具SN產生,此處不再贅述。完成上述工作,在工程中直接引用我們自己構造的類型庫,就可以成功的編譯擁有強名的DLL了。 如果是控制項,而不是普通的Component,那麼就不能夠使用tlbimp,而需要使用aximp.exe這個工具,使用方法與tlbimp類似,他會產生兩個檔案:一個是類型庫的代理檔案,另一個是Windows Form的代理檔案。 進一步解決然而還有更加簡單的解決辦法,就是在工程屬性中設定“Wrapper Assembly Key File”(Common Properties\General\Wrapper Assembly Key File),這個屬性。設定了該屬性之後通過Add Reference添加的COM/ActiveX組件,都將被標識,擁有強名。這需要一次設定就可以了,應該更加方便。  參考文檔Tlbimp相關:http://msdn.microsoft.com/library/en-us/cptools/html/cpgrfTypeLibraryImporterTlbimpexe.aspSN相關:http://msdn.microsoft.com/library/en-us/cptools/html/cpgrfStrongNameUtilitySNexe.aspAximp相關:http://msdn.microsoft.com/library/en-us/cptools/html/cpgrfwindowsformsactivexcontrolimporteraximpexe.aspC#工程的屬性說明:http://msdn.microsoft.com/library/en-us/cscon/html/vcurfCProjectGeneralPropertyPage.asp

相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。