强名称internalsvisibleto 32bit .net 4.0

时间:2015-04-14 15:58:24

标签: .net assembly-signing

我有3个DLL(外部系统的API),我可以在Windows 7 32bit .net 4上使用我的可执行文件。

然后我需要用强名称签署我的可执行文件。

如果我理解的话,它要求API DLL也使用相同的强名称进行签名。

我已经看过帖子如何做到这一点(ildasm / ilasm,或野蛮开发者,或Crypto Obfuscator)并尝试了我所做的一切。然而,仍然获得强名称签名程序集必须在其InternalsVisibleTo声明中指定一个公钥"。

还有人去过那里并设法安全出去吗?

此致 奥伦

PS 1,我确实设法使其在Windows 7 64bit上工作(3个API的DLL与前一个开发人员完成的Crypto Obfuscator签名)。我开始调查什么时候它不能在32位工作,我已经意识到我正在使用已签名的DLL。然后我找到了原始的DLL,但只能在没有"强名称的情况下运行"在我的程序集和API中都没有。任何其他组合,即使我的集会没有签署(或者所有内容都是根据我的知识签署)都没有用。

PS 2,我还有另一个我的DLL,它与可执行文件很好地兼容(我同时签名,所以我总共有5个程序集,2个我和3个),我不确定它是有关,但无论如何都把它带到了这里。

1 个答案:

答案 0 :(得分:2)

您的问题似乎是在使用未签名的第三方库时需要对应用程序进行签名。您试图通过签署第三方库来解决该问题,但这引入了新的错误。

考虑到这个假设,问题非常清楚 - 第三方库的各个DLL使用彼此的内部(至少其中一个对至少其中一个执行此操作),这就是为什么它&#39 ; s使用InternalsVisibleTo。您获得的错误是因为您已经以hacky方式对程序集进行了签名,并且没有确保程序集之间的所有引用都已更新 - 因此{{1}现在引用了一个无效的DLL,这意味着.NET将禁止目标DLL使用其他库的InternalsVisibleTo

要解决此问题,您需要更改第三方库中的internal声明。这在IL中很容易 - 只需查找属性声明,并更改程序集名称以包含公钥(例如从InternalsVisibleToInternalsVisibleTo("MyLibrary"))。

但是,我必须注意,这被视为逆向工程,并且可能被第三方的许可禁止。确保您所做的事情是合法的,如果没有,请直接与第三方提供商沟通,以找到合适的解决方案。