我有6个需要使用我的应用程序的旧VB6 DLL。为了让它们在.NET域中工作,它们被转换为Interop DLL。
其中一个Interop DLL(称为Master.DLL)引用其他5个DLL。
我想强烈命名Master.DLL,所以我使用了ildasm / ilasm和.SNK文件
当我用ildasm打开新命名的Master.DLL并查看清单时,它的五个引用没有强名称,导致FileLoadExceptions。
我的问题:是否可以使用ildasm / ilasm强制命名一个Interop DLL及清单中所有的汇编引用与.SNK文件相同?
答案 0 :(得分:1)
这需要使用ildasm.exe反编译互操作文件库,然后强烈命名DLL,然后将humpty dumpty与ilasm.exe重新组合在一起,这样他们就可以在.assembly指令中使用强名称。
这很痛苦,并不容易自动化。强烈考虑这样做的有用性,它相当低。当您需要生成PIA并将其安装在GAC中时,它才真正需要。如果使用这些互操作库的客户端程序集本身暴露VB6接口并且这些客户端程序集又由另一个应用程序使用,则这是必需的。那很少见。
更优越的解决方案是使用VS2010及更高版本中提供的“嵌入互操作类型”功能。否则称为“无PIA”解决方案。这完全消除了对这些互操作库的需求,[ComImport]类型嵌入在客户端程序集中。 .NET 4.0及更高版本中的“类型等效”功能可确保将这些类型嵌入到多个程序集中不会导致问题,当[Guid]匹配时,它们被认为是相同的,无论它们来自哪个程序集。当然,你也不会有任何强大的命名。这是一个很大的收获。
答案 1 :(得分:0)
您可以尝试自己调用tlbimp来创建interop dll。它会为你节省ilasm / ildasm路径。