我正在尝试强烈命名我拥有代码的第 3 方 API,但它使用的第 3 方 DLL/NuGet 包也没有强烈命名,我遇到了很多麻烦。
我使用的是 Box Windows SDK,API 是用 .NET 可移植子集编写的,支持 .NET 用于 Windows 应用商店应用程序、.NET Framework 4 及更高版本、SL4 及更高版本以及 Windows Phone 7 及更高版本。当然,我不需要所有这些,但我确实需要 .NET 4 和 Silverlight 版本。该 API 已经可以很好地运行,并且可以自行运行良好。如果我的所有项目都未签名但它们没有签名,我的应用程序也会如此。我们为 Silverlight 应用程序使用强命名程序集,以便利用应用程序库缓存。
无论如何,我有 API 的源代码,所以我只是将我的 PFX 文件添加到项目中以对其进行签名。然后我收到一个错误,该 API 使用的名为 NitoAsnycEx.dll 的依赖项未签名。我没有 Nito.AsyncEx.dll 的代码,但通常这不是问题,更多的是烦恼。所以现在我有一个古老的问题,需要获取我没有代码的第 3 方 DLL 并用我的 PFX 或其他 SNK 文件对其进行签名。
我可以做任何一个,通常我会使用 Ian Picknell 在这篇文章中精彩解释的过程之一:http: //ianpicknell.blogspot.com/2009/12/adding-strong-name-to-third-party.html。所以我遵循了这个过程,IL 签名工具似乎可以很好地签署 DLL。
长话短说,让我们使用最简单的签名过程版本,我已经准备好一个简单的 SNK 文件。基本上,我这样做:
我可以运行 ILDASM 来获取此第 3 方 EXE 的 .il 文件:
ILDASM Nito.AsyncEx.dll /out:Nito.AsyncEx.il
然后我可以运行 ILASM 来获取签名的 DLL:
ILASM Nito.AsyncEx.il /dll /resource=Nito.AsyncEx.res /key=NPSAssemblyKeyNoPassword.snk
它工作得很好,我得到了这个结果:
Method Implementations (total): 118 Resolving local member refs: 0 -> 0 defs, 0 refs, 0 unresolved Writing PE file Signing file with strong name Operation completed successfully
所以现在我有一个签名的 DLL。我回到我的第 3 方 API 代码并删除对 NitoAsyncEx.dll 的旧引用,并为此添加一个新引用。我尝试编译,然后出现如下错误:
Error 44 The base class or interface 'System.Object' in assembly 'System.Runtime, Version=1.5.11.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' referenced by type 'Nito.AsyncEx.AsyncLock' could not be resolved r:\Data\GM\Source\GrantManagement\GrantManagement\3rd Party\Nito\Nito.AsyncEx.dll
我认为在此处使用可移植 .net 库存在一些问题,但我不确定它是什么。对于 Silverlight 4+ 和完整的 .NET 4.5 框架库,同样的过程通常适用于我。是否在某个地方设置了另一个 ILASM 或 ILDASM 可以正确反汇编和重新组装可移植代码?这甚至可能吗?
我还尝试去获取 NitoAsyncEx.dll 的源代码,这是开源的顺便说一句,并编译它,但该源代码将无法编译,因为它缺少一些文件。所以目前我坚持将此 API 集成到我的项目中,需要社区中任何专家的一点帮助。
有没有办法正确签署这个 DLL,这样我们就不会丢失对 System.Object 等基本类的引用?
有没有办法绕过需要签署这个 DLL 并从我的项目中引用它?