【问题标题】:Error: A strongly-named assembly is required错误:需要强命名程序集
【发布时间】:2020-12-02 20:55:33
【问题描述】:

我有一个 Windows 窗体项目(VS 2005,.net 2.0)。该解决方案引用了 9 个项目。在我的一台计算机上一切正常并编译良好。当我将它移到第二台计算机时,9 个项目中有 8 个编译没有问题。当我尝试编译第 9 个项目(应用程序的主项目 - 生成 .exe 文件来执行应用程序)时,我收到以下错误:

'Error 3: A strongly-named assembly is required. (Exception from HRESULT: 0x80131044)'

错误的文件位置列为“C:\PATH-TO-APP\LC”。

我已经检查了项目属性,并且所有项目都设置为在调试模式下构建,它们都不应该被签名。在失败的项目中,它引用的唯一一个不在任何其他项目中的程序集是 Microsoft.VisualBasic(一个 .net 2.0 程序集)。所以我不知道是什么 id 导致了这个错误(上面错误消息中引用的文件 - “LC” - 不存在。

任何人都知道我可以如何强制项目接受所有未签名的程序集,或者确定哪个程序集是罪魁祸首?

这个工作的开发环境和当前的开发环境之间唯一有意义的区别是第一个是 XP 而这是 Vista64。但是,我的一位使用 XP 的同事遇到了同样的错误。

正在使用的第三方程序集:

  • ComponentFactory.Krypton.Toolkit
  • ComponentFactory.Krypton.Navigator
  • VistaDB.NET20

所有这些都在解决方案中的其他项目中引用,这些项目构建没有问题,所以看起来这些不是问题。

到目前为止,我已尝试删除 suo 文件、全部重建、从解决方案中卸载和重新加载项目、删除和读取引用的程序集。没有任何效果。

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    错误是什么意思

    “强名称:表示引用已使用密钥对进行签名。”

    如果您当前项目的程序集已签名,那么您的所有参考程序集必须也已签名。 否则将导致此错误。


    如何检查

    解决方案资源管理器 > 参考 > [单击有问题的参考] > 属性


    如何解决

    方法 1:取消对当前项目程序集的签名。

    项目属性 > 签名 > 签署程序集(复选框)

    方法二:对参考项目的程序集进行签名。 (如果您自己构建它)

    【讨论】:

      【解决方案2】:

      还有一个可能的原因:

      (对于绝望的疑难解答者)

      Solution Explorer 窗口中,如果您在参考列表中向下走并检查 Properties 窗口中的每个,看到属性 Strong Name = False 点到潜在的问题。

      【讨论】:

      • 对此有什么可以做的吗? =-\如果是假的,我们有什么选择?
      • @Janet - 那是很久以前的事了,但请记住我将值改回 true (如果我没记错的话,可能直接通过编辑值)和这立即解决了问题。如果这样的直接改变是不可能的,那么找出需要采取什么行动来以某种间接的方式获得 true 价值。
      【解决方案3】:

      我只是通过执行以下操作来构建它:

      相关项目的“属性”中有一个许可证文件。删除文件(不再需要)后,项目能够成功构建。所以看起来那是罪魁祸首。

      【讨论】:

      • 我还需要从我的 *.vbproj 或 *.csproj 文件中删除
      【解决方案4】:

      我已经从我的项目文件夹中删除了许可证文件,并再次重新构建,它已成功构建。

      【讨论】:

        【解决方案5】:

        在解决方案资源管理器中检查每个项目的参考部分...查找对第三方供应商程序集(如 Infragistics 或 Data Dynamics 等)的参考,这些程序可能未安装在您遇到问题的计算机上

        【讨论】:

        • 使用的第三方程序集见上文。来自 ComponentFactory 的两个都内置在解决方案中,没有任何问题。如果我没记错的话,VistaDB.NET20 是强签名的。但是这个项目中肯定有一些东西需要一个强命名的程序集,对吧?
        • 是否有任何强名称程序集试图引用您的未强名称程序集之一?这也会导致此错误...
        • 不 - 没有第三方程序集试图引用另一个程序集。并且所有其他程序集也在其他项目中引用,没有问题。
        【解决方案6】:

        好的,不确定这是否会有所帮助,但如果您可以访问 ildasm,请检查三个第三方程序集并检查以下内容:

        (我在你的错误消息中发现了以下谷歌搜索)它来自另一个人的帖子,所以忽略名称,但关键是清单内的行应该是“.publickeytoken”而不是“.publickey” 该主题的链接位于:

        http://social.msdn.microsoft.com/Forums/en-US/clr/thread/56e13ab1-4c03-4571-92f1-759081bcc78b/

        Public Key or Token: ab 1a 81 37 f9 79 0c 88 
        

        看起来不错,对吧?该序列确实是 Reflex.dll 的公钥标记。

        如果我们使用 ildasm gui 并点击“manifest”,可以看到问题:

        .assembly extern Reflex
        {
        .publickey = (2F 5A 20 3A 86 D3 5F 71 ) // /Z :.._q
        .ver 1:0:0:0
        }
        

        注意.publickey 行。

        应该是.publickeytoken!!!

        问题是 Cecil 模块在创建修改后的程序集时,将公钥令牌放在公钥字段中(或者忘记打开一些标志,表明这是一个令牌,而不是完整的公钥。我'我不知道细节)。

        所以这相当于 Cecil 中可能存在的错误。我应该改用盖尔的东西。 :)

        无论如何,现在我知道原始脚本的唯一问题(在我搬到 Cecil 之前)是它在强命名程序集 (FXCOP) 中引用了非强命名程序集 (Reflex) .

        所以我现在解决了这个问题并重新运行了我的原始脚本和...中提琴!有效!!

        【讨论】:

          【解决方案7】:

          我一直在使用许多第三方库 (MS Ent Lib),并决定将一些 dll 移至“未使用”文件夹。这给了我有问题的错误。我相信我引用的其中一个库实际上引用了另一个需要放在它旁边的库(即使您的项目中不需要引用 dll)。

          在将库移回后编译的所有内容均未出现此错误。

          【讨论】:

            【解决方案8】:

            您可能必须明确指定目标平台并将其设置为 x86。 64位版本可能存在问题。

            另一件事:您是否以管理员身份运行 VS? VS2005 在 Vista 上没有以海拔高度运行时会出现问题,也许这个奇怪的编译错误就是其中之一。

            【讨论】:

              【解决方案9】:

              对我来说这是一个奇怪的修复,但我刚刚从源代码管理中提取了这个解决方案。

              遇到此错误,查看了上面的大部分答案,然后删除了解决方案并从源代码管理中重新提取了解决方案。

              工作。

              只适用于少数人,但我想我是少数人之一,所以会有更多人。不知道第一次发生了什么,但不知何故,当我把它们拉过来时,某些组件一定有一些问题。

              基本上将其关闭然后重新打开。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2017-02-28
                • 2023-03-07
                • 1970-01-01
                • 1970-01-01
                • 2023-03-18
                相关资源
                最近更新 更多