2011-07-15 21 views
2

我希望有人能指出我正確的方向。我通過幾個步驟列出了問題,希望能夠澄清問題。無法使用REGASM刪除COM [PrimaryInteropAssemblyName] typelib的值/ u

  1. 我使用regsvr32將C++ DLL註冊到COM中。
  2. 然後,我使用tlbimp與C++ DLL上的/primary屬性創建可供C#使用的程序集文件。
  3. 然後我將新生成的程序集註冊到GAC中。
  4. 我在生成的程序集上調用regasm,以便C++類型庫包含對GACed程序集的引用。

問題是,當我使用regasm/u時,它說它是「未成功註冊」。但是,當我使用OLEVIEW檢查COM中的typelib時,它仍然顯示對GACed程序集的PrimaryInterop引用。

我一直在使用regasm/U/TLB藏漢試過,但我得到一個警告,說這個:

RegAsm : warning RA0000 : Type library not un-registered since the assembly was 
imported from COM 

Screen of the typelib in OLEVIEW

感謝您的任何援助,因爲這是推動我瘋了;)

回答

3

步驟4錯誤,COM服務器已在步驟1中註冊。當您僅使用Regasm.exe 創建您自己的COM服務器([ComVisible]屬性),而不是當您僅僅使用時e one。在步驟2中使用/ primary也是如此,當您公開在您自己的公共接口中導入的COM類型時,您只需要一個PIA。最好避免。修復您可能通過重複步驟1所造成的損害。

由tlbimp.exe生成的interop程序集只是一個小型的幫助程序集,它只包含從類型庫自動生成的聲明。幫助CLR爲COM接口方法生成thunk,而無需解析類型庫。如果您擁有該版本,請務必使用VS2010中提供的Embed Interop Types功能。

+0

現在它變得更有意義!非常感謝清理我的困惑:) – silentfrost