首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Box-API:如何将强名称添加到为.NET可移植子集编写的第三方程序集中

Box-API:如何将强名称添加到为.NET可移植子集编写的第三方程序集中
EN

Stack Overflow用户
提问于 2013-07-24 15:03:23
回答 1查看 390关注 0票数 1

我试图强命名一个第三方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文件。基本上,我这样做:

  1. 我可以运行ILDASM来获取这个第三方EXE的.il文件: Nito.AsyncEx.dll /out:Nito.AsyncEx.il
  2. 然后,我可以运行ILASM来获得签名的DLL: Nito.AsyncEx.il /dll /resource=Nito.AsyncEx.res /key=NPSAssemblyKeyNoPassword.snk

效果很好,我得到了这样的结果:

方法实现(总计):118个解析本地成员推荐:0 -> 0 defs,0 refs,0个未解析写入PE文件签名文件,强名称操作成功完成

所以现在我有了一个签名的DLL。我回到我的第三方API代码中,删除了对NitoAsyncEx.dll的旧引用,并给它添加了一个新的引用。我试着编译,然后得到这样一个错误:

代码语言:javascript
复制
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并让它从我的项目中引用的问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-24 19:34:10

更新

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

正如您提到的,不幸的是,NitoAsyncEx库没有强命名,这超出了我们的控制范围。这个库提供了在异步/等待调用期间正确锁定资源的能力,我认为目前没有更好的选择。

尽管如此,我可能有一个(希望是暂时的)解决办法给你。我已经从https://nitoasyncex.codeplex.com/下载了源代码,并能够编译它。以下是我执行的步骤:

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

下面是得到的解决方案:https://cloud.box.com/s/7ikurtyajqmhq9p8q52x

我已经通过SDK的测试成功地运行了最终的dll,所以希望这能满足您的需要。我不能保证这个方法的稳定性,但是有一个工作源应该允许您做任何您需要的签名。从那里开始,您应该能够将已签名的程序集放到SDK源代码中,并对该程序集进行签名。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17837868

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档