2010-08-09 206 views
1

我有2個.net dll,我使用REGASM公開給COM。爲了簡化COM客戶端內的引用,我希望將這些內容合併到一個文件中。將兩個.IDL文件或兩個.tlb文件合併到一個文件中

我已經嘗試將兩個文件轉換爲IDL,然後將其中一個庫的部分內容複製到另一箇中,然後使用MIDL編譯回.tlb。這對於第二個IDL中的TypeDefs來說工作得很好,但是當它涉及到我複製的接口時它似乎失敗了.OLE/COM查看器可以看到接口定義,但是當我嘗試通過COM使用TLB時,找不到接口我複製了。

我想確保在我花費太多時間之前,實際上可以通過這種方式微薄的IDL。

回答

0

好吧,事實證明,我遇到的問題與合併idl的無關。

如果你想合併到idl的話,你可以通過簡單地將一個idl中庫部分的內容拷貝到另一個idl中來實現。然後在合併的文件上運行midl將其變成tlb。

1

您可以使用ILMerge首先組合.NET程序集,然後在生成的程序集上使用REGASM?

ILMerge是用於合併多個 .NET組件成單個 .NET組件的實用程序。它適用於可執行文件 和DLL,並附帶幾個 選項用於控制處理 和輸出格式。

+0

嗨米奇,這似乎是一個不錯的選擇,但是當合並DLL的我得到一個錯誤 「合併期間發生異常:ILMerge.Merge:程序集'Sim.Common'沒有正確合併。仍然列爲目標程序集中的外部引用。 at ILMerging.ILMerge.Merge() at ILMerging.ILMerge.Main(String [] args)「 我在猜測這是因爲第一個dll引用了第二個dll一個在源代碼中。但是這個參考是必需的。 – Jambobond 2010-08-09 11:33:20

+0

好吧,我用固定上述問題的/關閉選項,但現在我似乎無法使用regasm創建新的dll。我收到一個錯誤「RegAsm:error RA0000:不支持給定路徑的格式。」 任何想法? – Jambobond 2010-08-09 11:55:33

+0

@Jambobond:我從來沒有組合過2個.NET程序集,然後試圖重新獲得它們。 – 2010-08-09 12:05:23

1

我沒有看到一個明顯的方式,這將失敗。你說你合併了庫部分,但你沒有說你複製粘貼來自其他.idl的接口聲明。這將是一個明顯但不太可能的解釋。

一種失敗模式是當客戶端應用程序使用類型庫來封送跨越公寓邊界或進程外的接口指針時。然而,這需要HKCR \ Interfaces中的註冊表項。 .NET不創建它們,你必須自己做。你會知道如果你做了,也沒有太多的解釋。

+0

對於糟糕的解釋,我對IDL和COM的理解相當有限(您在回答我所有關於它的問題時都知道)。你是對的我做了一個直接複製並粘貼而沒有添加註冊表項,我希望由於其他程序集的GUID已經註冊了,它會爲我解決註冊表問題? – Jambobond 2010-08-09 13:27:09

+0

同意,只要您在兩個DLL上使用了Regasm.exe,就應該可以工作。但是註冊與編譯器使用類型庫沒有任何關係。沒有線索,你應該把.tlb和.idl文件放在文件共享服務上,這樣我們才能看看它。 – 2010-08-09 13:53:15