【问题标题】:Strongly naming a 3rd party assembly - Could not load file or assembly强烈命名第 3 方程序集 - 无法加载文件或程序集
【发布时间】:2012-12-18 23:15:34
【问题描述】:

我正在编写一个供内部使用的 Visual Studio 2012 扩展,它要求所有程序集都有一个强名称。我依赖于 RestSharp(和其他一些 dll),并且由于它没有强命名,因此我通过关注 this 为其添加一个强名称。一切都根据流程的输出进行,甚至 Visual Studio 声称如果我查看项目引用中 RestSharp.dll 的属性,它是强命名的。但是,当我使用我的扩展程序时,我得到一个 FileLoadException 声明:

无法加载文件或程序集“RestSharp,Version=104.1.0.0,Culture=neutral,PublicKeyToken=null”或其依赖项之一。需要强命名程序集。 (来自 HRESULT 的异常:0x80131044)

关于如何解决或解决此问题的任何想法?

【问题讨论】:

  • 来自PublicKeyToken=null,它正在寻找一个 unsigned 版本的程序集。我会删除您对 RestSharp 的所有引用,并将它们重新添加到已签名的程序集中。
  • 在预构建事件中,我执行 ildasm ilasm 步骤,然后构建项目。由于项目是从指定路径引用dll,新签名的dll在哪里,它不应该有签名的版本吗?项目参考实际上是否必须签名?我会假设在构建时签名的 dll 就足够了。
  • Does the project reference actually have to be signed? 是的。事后签字是不够的。 引用的程序集的程序集清单 RestSharp 跟踪完全限定的程序集名称,包括强名称(或没有强名称)。
  • @vcsjones 谢谢。我没有意识到这一点。很高兴知道。
  • 这对我来说效果很好:nuget.org/packages/strongnamer

标签: .net visual-studio-2012 strongname vsix


【解决方案1】:

我编写了一个 NuGet 解决方案级别包,以帮助使用您自己的密钥对 3rd 方程序集进行强命名。

这是为签署 NuGet 包的内容而设计的 使用未签名的程序集,以便能够链接到这些 强烈命名消费项目的包。访问 不需要原始源代码,您可以签署任何程序集 使用您自己的强命名密钥。如果需要,您也可以延迟签名。

https://nuget.org/packages/Nivot.StrongNaming

您可以在我的博客上阅读更多相关信息:

http://www.nivot.org/blog/post/2013/04/30/Signing-unsigned-assemblies-in-NuGet-packages

【讨论】:

  • 嗨 xOn,干得好。我有一个问题:当我使用您的工具从 nuGet 签署第 3 方程序集时,一切正常。但似乎在重新启动 VS 后我再次收到旧的错误消息,并且必须再次使用您的工具来签署程序集。我是在做错什么,还是我只需要在项目的预构建事件中输入用于登录的命令?感谢您的帮助!
  • 嗯,也许 VS 正在重建输出,因为它认为它已经过时了?我不确定……抱歉。
  • @x0n - 您的实用程序如何同时处理对一组 dll 的签名 - 当其中一些 dll 引用到 dll 组中的其他 dll 时?您的实用程序是否正确地将这些 dll 中的弱引用更改为强引用(新签名的 dll)?
  • @N73k 是的,确实如此。请参阅github.com/oising/strongnaming——它唯一不做的就是更新 internalsvisibleto 属性。
  • @x0n - 你打算修复内部可见的东西吗?也许现在您可以选择删除所有 internalsvisibletos?
【解决方案2】:

我尝试使用 VSPackage 中的 RestSharp,它可以工作。我添加 RestSharp 的步骤:

  1. 通过 NuGet 在我将使用它的项目中添加 RestSharp。为此,请在解决方案资源管理器中右键单击项目并选择“管理 NuGet 包...”,找到 RestSharp 并按安装按钮。

  2. 在这个项目中编写测试代码:

    
    var test = new RestSharp.RestClient("http://test.com");
    Logger.Log(Category.Info, "Test {0}", test.BaseUrl);
    
  3. 通过 NuGet 在安装程序项目中添加 RestSharp。同样第 1 段。我使用VSIX Deployment Package。要设置必要的程序集,只需在 VSIX 部署包中添加对程序集的引用。这使得“管理 NuGet 包...”命令。通过 VS Wizard 创建 VSPackage 时,VSPackage 的主项目是 VSIX 部署包。

    如果您使用其他方法安装 VS 扩展(例如,MSI 安装程序),则需要将 RestSharp.dll 显式添加到我们的安装包中。

结果,我在日志中得到了 "Test http://test.com" 行。

在您的情况下,最有可能的是 RestSharp.dll 没有安装,因此 VS 在加载您的模块时没有找到 RestSharp.dll。或者安装的 RestSharp 程序集的完全限定名称与项目参考中的完全限定名称程序集不同。要查看此内容,请检查扩展文件夹中的 RestSharp.dll 文件(对于 VSPackage,默认补丁为 "%LOCALAPPDATA%\MICROSOFT\VISUALSTUDIO\11.0EXP\EXTENSIONS\{YourCompanyName}\{YourProductName}\{YourProductVersion} \")。如果在调试器下运行扩展,您可以在模块窗口中看到扩展的绝对路径。

编辑:我刚才注意到来自 NuGet 的 RestSharp 程序集没有一个强名称。所以安装扩展的目录和项目的引用应该包含完全相同的程序集和一个强名称,一切都会正常工作。

【讨论】:

    【解决方案3】:

    您可以检查几件事:

    看来您的项目引用仍然是未签名的 dll .\RestSharp.dll。您应该针对已签名的 .\Signed\RestSharp.dll dll 编译您的项目。删除当前引用并再次添加。

    还要检查项目 bin 目录中的 dll。旧的 RestSharp.dll 可能仍然存在。删除它并检查所有构建目录。

    您还可以检查restsharp.dll 是否在您的GAC 中。如果是这样,请从您的 gac 中删除 dll。

    【讨论】:

      猜你喜欢
      • 2017-02-28
      • 1970-01-01
      • 1970-01-01
      • 2018-03-28
      • 1970-01-01
      • 2020-08-17
      相关资源
      最近更新 更多