无法加载文件或程序集 'AssemblyName PublicKeyToken=null' 或其依赖项之一。

17
{"无法加载文件或程序集 'AssemblyName, PublicKeyToken=null' 或其某个依赖项。 找到的程序集清单定义与程序集引用不匹配。 (HRESULT 的异常: 0x80131040)":"AssemblyName,PublicKeyToken = null"}
当我尝试在签名未签名的第三方程序集后调试我的应用程序时,我会将上述消息作为InnerException.Message。 奇怪的是,我已经签署了消息中显示的程序集,但该程序集无法加载。
这里可能出现什么问题? 我该如何解决?
编辑
提供有关我所做的更多信息:
- 签署了项目正在引用的所有未签名的第三方程序集。 - 反汇编这些程序集以查看它们是否在内部引用任何外部未签名程序集(它们没有)。 - 从项目的引用列表中删除旧的未签名程序集,并重新添加新签名的程序集。 - 卸载项目并通过添加缺少的程序集引用的PublicKeyToken来编辑.sln XML样式文件中无法加载的程序集的引用。
这个抛出异常的程序集(顺便说一下,该项目构建没有问题,我在该程序集的InitializeComponent()中获取到了一个运行时异常),是一个带有WPF控件的开源组件(MahApps.Metro)。我找到了一个类似的问题,但那里的答案都没有解决这个问题。

如何强制WPF使用使用程序集强名称的资源URI? 哎呀!

5个回答

28

PublicKeyToken = null告诉你CLR正在寻找未签名的程序集。由于您已经对它们进行了签名,这将无法正常工作,因此出现了这种情况是预期的。

您需要重新构建程序,以便使用更新的签名程序集,并将非null PublicKeyToken嵌入清单中。如果您使用未签名的副本构建程序,则可能需要删除现有的程序集引用并添加回来,从问题中不清楚。

如果仍然存在问题,请使用Fuslogvw.exe实用程序。


1
.sln文件不包含任何程序集引用。如果在项目文件中看到null PublicKeyToken,则仍然有对未签名程序集的引用。编辑它是没有帮助的,你必须选择正确的文件。很难猜测为什么你在正确获取这个问题上遇到了困难。请让一个团队成员在你重新添加程序集引用时看着你的肩膀,他可能会看到你犯了一个错误。 - Hans Passant
实际上它确实是这样的 <Reference Include="MahApps.Metro"> <HintPath>..\Signed Third-Party Assemblies\MahApps.Metro\MahApps.Metro.dll</HintPath> </Reference>我刚刚注意到,签名后程序集的PublicKeyToken和版本都丢失了。这就是为什么我在.csproj文件中手动添加了PublicKeyToken。我使用Sn.exe来签名我的程序集,首先我用ildasm反汇编它们,然后再通过包含我的公钥/私钥对它们进行重新组装。 - Pantelis
抱歉,我是说 .csproj 文件! - Pantelis
Include属性肯定是错误的,应该是完全限定的程序集名称(例如Include="MahApps.Metro",Version=1.0.0.0,Culture=neutral,PublicKeyToken=8e7fe144c235f5c2,processorArchitecture=MSIL")。重新组装步骤很重要,你不应该在问题中遗漏它。似乎出了些问题,IDE似乎无法正确识别程序集。提出另一个问题,并仔细描述您使用的确切命令行。 - Hans Passant
在重新添加签名引用后,include属性被自动生成。正如我之前提到的,某种方式下,在程序集签名后,它的版本和PublicKeyToken丢失了。我在Visual Studio命令行上使用的命令来重新组装反汇编二进制文件是:ilasm /dll /key=strongNameKeyPair.snk /MahApps.Metro.il。我将开始一个新的较小项目并尝试重现异常,然后再次发布问题。感谢您的时间。 - Pantelis

1
也许您的“未签名第三方程序集”中有一个引用了另一个“未签名第三方程序集”,因此在对它们进行签名后,引用就出现了问题。
也许这个工具可以帮助您:https://github.com/brutaldev/StrongNameSigner - 它可以更新程序集(可能也可以使用命令行完成,但我不知道如何操作)。

0
  1. 先将所有生产环境的dll和文件备份到另一个文件夹,以防需要回滚
  2. 将当前进程正在运行的所有生产环境dll复制到您的本地项目中
  3. 在所有相关的本地项目上引用这些dll
  4. 编译并再次复制项目dll以尝试启动窗口服务

仍然无法正常工作。

  1. 先将所有生产环境的dll和文件备份到另一个文件夹,以防需要回滚
  2. 从本地项目中复制所有新编译的dll并覆盖到生产环境的文件夹中
  3. 启动窗口服务

0

我注意到您确实说过您签署了第三方库,但不要忘记也签署使用这些第三方库的自己的程序集。最重要的是使用已签名库的程序集。这是我最近为自己解决此问题的方法。

Visual Studio 有时会过于宽容,允许我们做更多的事情。其他时候呢? 不一定。

确保在进行更改后清理项目。然后重新构建解决方案。希望这能使您更进一步。


0

我把解决方案从远程驱动器移动到本地驱动器,问题得以解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接