2013-11-26 492 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路径。

相关问题