2

我无法导入程序集,据说是因为强名称验证失败,尽管即使我将程序集注册为不被检查也会发生这种情况。有人能发现我在这里做错了吗?

以下是成绩单。作为参考,sn.exe 的开关是:

  • -v:验证签名。
  • -Vr:注册程序集以跳过验证。

    PS C:\temp> .\sn.exe -v .\my.dll

    Microsoft (R) .NET Framework 强名称实用程序版本 3.5.30729.1 版权所有 (c) Microsoft Corporation。版权所有。

    程序集 '.\my.dll' 有效

    PS C:\temp\Cmdlets> Import-Module .\my.dll Import-Module:无法加载文件或程序集'my,Version=4.0.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35'或其依赖项之一。强名称验证失败。(来自 HRESULT 的异常:0x8013141A)在 line:1 char:14

    • 导入模块 <<<< .\Microsoft.Rtc.Management.Core.dll
      • CategoryInfo : NotSpecified: (:) [Import-Module], FileLoadException
      • FullyQualifiedErrorId : System.IO.FileLoadException,Microsoft.PowerShell .Commands.ImportModuleCommand

    PS C:\temp\Cmdlets> .\sn.exe -Vr *

    Microsoft (R) .NET Framework 强名称实用程序版本 3.5.30729.1 版权所有 (c) Microsoft Corporation。版权所有。

    为程序集 ' , '添加了验证条目

    PS C:\temp\Cmdlets> Import-Module .\my.dll Import-Module:无法加载文件或程序集'my,Version=4.0.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35'或其依赖项之一。强名称验证失败。(来自 HRESULT 的异常:0x8013141A)在 line:1 char:14

    • 导入模块 <<<< .\Microsoft.Rtc.Management.Core.dll
      • CategoryInfo : NotSpecified: (:) [Import-Module], FileLoadException
      • FullyQualifiedErrorId : System.IO.FileLoadException,Microsoft.PowerShell .Commands.ImportModuleCommand

我应该提一下,我已经通过 Reflector 验证了所有必需的依赖程序集都存在于同一目录中。

4

1 回答 1

5

您的程序集可能是延迟签名或测试密钥签名的,看起来 PowerShell 只允许加载完全签名的程序集(即它忽略跳过验证设置)。这可以解释为什么 sn.exe 说程序集具有有效的强名称签名,而在技术上它没有。sn -vf(您可以通过运行而不是 来确定程序集是否确实具有有效签名,即使它已注册为跳过验证也是如此sn -v)。

我认为您的困惑的主要来源源于对验证跳过如何工作的错误假设。注册程序集以跳过验证并不能保证永远不会验证程序集的强名称签名。验证跳过专门用于允许延迟签名和测试密钥签名程序集在此类情况下无缝工作,但没有什么可以阻止某人(如 PowerShell)覆盖它并强制验证。

于 2010-10-01T09:48:52.450 回答