Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# “如何修复”;引用的程序集没有强名称;错误_C#_Visual Studio_Visual Studio 2005_Assemblies_Strongname - Fatal编程技术网

C# “如何修复”;引用的程序集没有强名称;错误

C# “如何修复”;引用的程序集没有强名称;错误,c#,visual-studio,visual-studio-2005,assemblies,strongname,C#,Visual Studio,Visual Studio 2005,Assemblies,Strongname,我已经向我的项目(强名称)添加了一个弱名称程序集。我现在得到一个错误: “引用的程序集'xxxxxxxx'没有强名称” 是否需要对此第三方程序集进行签名?为避免此错误,您可以: 动态加载程序集,或 在第三方程序集上签名 您将在中找到有关对第三方程序集进行签名的说明 签署第三方程序集 签署第三方协议的基本原则是: 使用ildasm.exe反汇编程序集并保存中间语言(IL): 重新生成并签署程序集: ilasm /dll /key=myKey.snk thirdPartyLib.il 固定

我已经向我的项目(强名称)添加了一个弱名称程序集。我现在得到一个错误:

“引用的程序集'xxxxxxxx'没有强名称”


是否需要对此第三方程序集进行签名?

为避免此错误,您可以:

  • 动态加载程序集,或
  • 在第三方程序集上签名
您将在中找到有关对第三方程序集进行签名的说明

签署第三方程序集 签署第三方协议的基本原则是:

  • 使用
    ildasm.exe
    反汇编程序集并保存中间语言(IL):

  • 重新生成并签署程序集:

    ilasm /dll /key=myKey.snk thirdPartyLib.il
    
  • 固定附加引用 除非您的第三方程序集(A.dll)引用另一个也必须签名的库(B.dll),否则上述步骤可以正常工作。您可以使用上述命令反汇编、重建和签署A.dll和B.dll,但在运行时,加载B.dll将失败,因为A.dll最初是通过引用未签名的B.dll版本生成的

    解决此问题的方法是修补上面步骤1中生成的IL文件。您需要将B.dll的公钥令牌添加到引用中。你打电话就可以得到这个代币

    sn -Tp B.dll 
    
    这将为您提供以下输出:

    Microsoft (R) .NET Framework Strong Name Utility  Version 4.0.30319.33440
    Copyright (c) Microsoft Corporation.  All rights reserved.
    
    Public key (hash algorithm: sha1):
    002400000480000094000000060200000024000052534131000400000100010093d86f6656eed3
    b62780466e6ba30fd15d69a3918e4bbd75d3e9ca8baa5641955c86251ce1e5a83857c7f49288eb
    4a0093b20aa9c7faae5184770108d9515905ddd82222514921fa81fff2ea565ae0e98cf66d3758
    cb8b22c8efd729821518a76427b7ca1c979caa2d78404da3d44592badc194d05bfdd29b9b8120c
    78effe92
    
    Public key token is a8a7ed7203d87bc9
    
    最后一行包含公钥令牌。然后,您必须搜索A.dll的IL以查找对B.dll的引用,并添加令牌,如下所示:

    .assembly extern /*23000003*/ MyAssemblyName
    {
      .publickeytoken = (A8 A7 ED 72 03 D8 7B C9 )                         
      .ver 10:0:0:0
    }
    

    如果程序集也未签名,则可以使用未签名的程序集。

    展开使用不“具有强名称键”的项目的项目文件,并查找
    .snk
    文件(.StrongNameKey)

    在中浏览到此文件(以便您知道它在哪里)

    回到VisualStudio中没有“强名称键”的项目中,请执行以下操作:

    • 右键单击项目文件
    • 选择属性
    • 选择“签名选项卡”(在左侧)
    • 单击复选框“为部件签名”
    • 然后
      到前面找到的
      .snk
      文件
    这应该能奏效。这解决了我在同一个解决方案中使用另一个项目中的表单的一个项目的问题


    我希望这会有所帮助。

    我遇到了一个应用程序的问题,该应用程序名为强名称,然后不得不更改它以引用非强名称程序集,因此我在“项目属性签名”部分取消了“对程序集签名”,但它仍然抱怨。我想它一定是某个地方的人工制品导致了问题,因为我正确地做了其他事情,就是这样。我找到并从其assemblyInfo.cs文件中删除了行:[assembly:AssemblyKeyFile(“yourkeyfilename.snk”)]。
    然后就没有构建投诉了。

    我已经编写了一个工具来自动对程序集进行强名称签名,包括那些您没有源代码的程序集或已放弃的项目。它以一种简单的方式使用了答案中描述的许多技术,没有现有工具或过时说明的任何缺陷或缺点


    我希望这能帮助那些需要签署第三方程序集而无需跳转到那里的人。

    我正在寻找解决同一问题的方法,取消勾选“签署程序集”选项对我很有效:


    (您可能会注意到,该屏幕截图来自Visual Studio 2010,但希望它能帮助某些人。)

    签署第三方程序集对我来说很有用:

    我了解到,如果链接的文章不再有效,发布步骤是很有帮助的。所有功劳都归于:

  • 运行Visual Studio命令提示符并转到DLL所在的目录

    例如,我的DLL位于
    D:/hiren/Test.DLL

  • 现在使用下面的命令创建文件

    D:/hiren>ildasm/all/out=Test.il Test.dll
    (此命令生成代码库)

  • 生成新密钥以对项目进行签名

    D:/hiren>sn-k mykey.snk

  • 现在使用
    ilasm
    命令对库进行签名

    D:/hiren>ilasm/dll/key=mykey.snk Test.il

  • 删除“签名”选项卡下的“为组件签名”复选标记,就像@Michal Stefanow所说的那样

    在此处添加是对您自己的文件和/或其他人的文件进行签名的最简单方法。您只需在“生成后事件命令行”下添加此行:

    您可以签署其他人的文件或您自己的文件,并且可以签署任意数量的文件

  • 打开Visual Studio的开发人员命令提示符。此工具在Windows程序中可用,可以使用默认的Windows搜索找到
  • 通过执行一次,确保提示符可以访问以下工具:
    sn
    ildasm
    ilasm
  • 导航到Cool.Library.dll所在的文件夹
  • sn–k Cool.Library.snk
    创建新密钥对
  • ildasm Cool.Library.dll/out:Cool.Library.il
    反汇编库
  • 移动Cool.Library.dll Cool.Library.unsigned.dll
    以保留原始库作为备份
  • ilasm Cool.Library.il/dll/resource=Cool.Library.res/key=Cool.Library.snk
    使用强名称重新组装库
  • powershell-command“&{[System.Reflection.AssemblyName]::GetAssemblyName($args.FullName}Cool.Library.dll”
    获取程序集的完全限定名。如果必须在外部配置文件(如web.config或app.config)中引用DLL,则需要此位

  • 对我来说,我的问题是我有两个相同的NuGet软件包,安装了不同的版本。

    我在运行时遇到了一个与NuGet一起安装的ServiceStack DLL文件。原来还有另一个s
    .assembly extern /*23000003*/ MyAssemblyName
    {
      .publickeytoken = (A8 A7 ED 72 03 D8 7B C9 )                         
      .ver 10:0:0:0
    }
    
    "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\signtool.exe" sign /f "$(ProjectDir)\YourPfxFileNameHere.pfx" /p YourPfxFilePasswordHere /d "Your software title here" /du http://www.yourWebsiteHere.com /t http://timestamp.verisign.com/scripts/timstamp.dll /v "$(BaseOutputPath)$(TargetFileName)"
    
    PM> Install-Package ilmerge
    
    ilmerge assembly.dll /keyfile:key.snk /out:assembly.dll /targetplatform:v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319 /ndebug
    
    sn -k key.snk
    
    Update-Package -reinstall