2013-11-26 329 views
0

我有6個需要使用我的應用程序的舊VB6 DLL。爲了讓他們在.NET領域工作,他們被轉換爲Interop DLL。強命名命名程序集清單中的.net程序集

其中一個Interop DLL(稱爲Master.DLL)引用了其他5個DLL。

我想強名Master.DLL所以我用反彙編/ ILASM與.SNK文件

當我打開新強命名Master.DLL與ILDASM,並期待在清單中,它的五個引用沒有強命名,導致FileLoadExceptions。

我的問題:是否可以使用ildasm/ilasm強制命名Interop DLL及其清單中所有程序集引用的相同.SNK文件?

回答

1

這需要使用ildasm.exe對互操作庫進行反編譯,然後對DLL進行強命名,然後使用ilasm.exe將輕微的dumpty放在一起,以便它們在.assembly指令中使用強名稱。

這很痛苦,不容易自動化。不要強烈地考慮這樣做的有用性,它相當低。只有當您需要生成PIA並將其安裝到GAC中時,纔會真正需要它。如果使用這些互操作庫的客戶端程序集自己公開VB6接口,並且這些客戶端程序集反過來被另一個應用程序使用,則這是唯一必需的。這很少見。

更優越的解決方案是使用VS2010及更高版本中的「Embed Interop Types」功能。否則稱爲「無PIA」解決方案。這完全消除了對這些互操作庫的需求,[ComImport]類型嵌入到客戶端程序集中。 .NET 4.0及以上版本中的「類型等價」功能確保將這些類型嵌入到多個程序集中並不會導致問題,無論它們來自哪個程序集,[Guid]匹配時它們都被認爲是相同的。當然,你不會有任何強大的麻煩命名這些問題。這對於降壓來說有很長的路要走。

+0

謝謝,漢斯。我同意 - 我認爲我的公司正在努力以數字方式簽署他們的組件,並一直在嘗試不同的方法。無論如何,我將Master.DLL的「嵌入Interop類型」更改爲True,並且我沒有再發生任何異常。歡呼聲, – ryrich

+0

這是一個常見的錯誤,代碼簽名與完全命名完全不同。 .NET不關注一個AuthentiCode證書。 –

0

您可以嘗試通過自己調用tlbimp來創建interop dll。它會爲你節省ilasm/ildasm路徑。

相關問題