我试图强命名一个第三方API,我有这个代码,但是它使用的是一个第三方DLL/NuGet包,这个包也没有强命名,而且我遇到了很多麻烦。
我使用的是Box Windows,API是在.NET便携子集中编写的,支持Windows应用程序、.NET Framework4及更高版本、SL4和更高版本以及Windows 7及更高版本的.NET。当然,我不需要所有这些,但我确实需要.NET 4和Silverlight版本。这个API已经很好地工作了,并且自己运行得很好。如果我的所有项目都没有签名,但它们没有签名,它也会与我的应用程序一起使用。为了使用应用程序库缓存,我们在Silverlight应用程序中使用了强命名的程序集。
无论如何,我有API的源代码,所以我简单地将我的PFX文件添加到项目中来签名。然后,我得到一个错误,即这个API使用的一个名为NitoAsnycEx.dll的依赖项没有签名。我没有Nito.AsyncEx.dll的代码,但通常情况下,这不是一个问题,更麻烦。因此,现在我有一个老问题,需要获取一个第三方DLL,而我没有它的代码,并签署我的PFX或其他SNK文件。
我可以做到这两种方法之一,并且通常我使用Ian:http://ianpicknell.blogspot.com/2009/12/adding-strong-name-to-third-party.html在这篇文章中非常精彩地解释了其中一个过程。因此,我遵循了这个过程,IL签名工具似乎对DLL进行了很好的签名。
为了缩短篇幅,让我们使用签名过程中最简单的版本,我已经准备好了一个简单的SNK文件。基本上,我这样做:
效果很好,我得到了这样的结果:
方法实现(总计):118个解析本地成员推荐:0 -> 0 defs,0 refs,0个未解析写入PE文件签名文件,强名称操作成功完成
所以现在我有了一个签名的DLL。我回到我的第三方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并让它从我的项目中引用的问题?
发布于 2013-07-24 19:34:10
更新
Box SDK已经更新,现在在nuget上有了强大的名称。这要归功于最近对AsyncEx的更新,它强命名为程序集。
正如您提到的,不幸的是,NitoAsyncEx库没有强命名,这超出了我们的控制范围。这个库提供了在异步/等待调用期间正确锁定资源的能力,我认为目前没有更好的选择。
尽管如此,我可能有一个(希望是暂时的)解决办法给你。我已经从https://nitoasyncex.codeplex.com/下载了源代码,并能够编译它。以下是我执行的步骤:
下面是得到的解决方案:https://cloud.box.com/s/7ikurtyajqmhq9p8q52x
我已经通过SDK的测试成功地运行了最终的dll,所以希望这能满足您的需要。我不能保证这个方法的稳定性,但是有一个工作源应该允许您做任何您需要的签名。从那里开始,您应该能够将已签名的程序集放到SDK源代码中,并对该程序集进行签名。
https://stackoverflow.com/questions/17837868
复制相似问题