1

我正在尝试强烈命名我拥有代码的第 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 文件。基本上,我这样做:

  1. 我可以运行 ILDASM 来获取此第 3 方 EXE 的 .il 文件:

    ILDASM Nito.AsyncEx.dll /out:Nito.AsyncEx.il

  2. 然后我可以运行 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 并从我的项目中引用它?

4

1 回答 1

1

更新

Box SDK 已更新,现在在 nuget 上具有强名称。这要归功于最近对 AsyncEx 的更新,它对程序集进行了强命名。


正如您所提到的,不幸的是,NitoAsyncEx 库没有强命名是我们无法控制的。这个库提供了在 async/await 调用期间正确锁定资源的能力,我认为目前没有更好的选择。

话虽这么说,我可能有一个(希望是临时的)解决方法给你。我已经从https://nitoasyncex.codeplex.com/下载了源代码,并且能够对其进行编译。这些是我执行的步骤:

  • 删除了 csproj 中对 MSBuild 的引用
  • 从包文件夹中复制了缺失的 Dequeue.cs 文件
  • 解决了缺失的 nuget 引用
  • 重新生成了 AssemblyInfo.cs
  • 从项目中排除 .tt 模板文件
  • 卸载 SDK 不使用的所有其他项目

这是最终的解决方案: https ://cloud.box.com/s/7ikurtyajqmhq9p8q52x

我已经通过 SDK 的测试成功地运行了生成的 dll,所以希望这可以满足您的需求。我不能保证这种方法的稳定性,但是有一个工作源应该可以让你做任何你需要的签名。从那里,您应该能够将已签名的程序集放入 SDK 源并对该程序集进行签名。

于 2013-07-24T19:34:10.570 回答