Assembly 有一个强名称,但我收到的错误提示是需要一个强名称

Assembly has a strong name, but I"m getting the error that says a strong name is needed

我正在尝试将第三方 COM dll 加载到我的应用程序中。一切都很好,但是当我 运行 应用程序时,我不断从我的应用程序中收到此消息:

Could not load file or assembly '"assembly", Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. A strongly-named assembly is required. (Exception from HRESULT: 0x80131044).

当我执行 sn -vf "assembly" 时,它说程序集有效。有人见过这种行为吗?

尝试加载的程序集没有强名称。这可以从你的消息中看到,上面写着PublicKeyToken=null。如果它有一个强名称,它将有一个 public 密钥标记。

如果您在编译或引用它后给它起了一个强名称,请尝试在您的项目中再次引用它。也许您的项目仍然有旧的引用,并且正在尝试加载未签名的版本。

我以前在使用 Mongo CSharp 驱动程序时见过这种行为。从版本 1.10.0 开始,他们停止提供强命名的程序集,所以你必须自己签名。

当我签署提供的 3 个 dll 时; MongoDB.Bson、MongoDB.Driver 和 MongoDB.Driver.Core,我忽略了这些程序集的内置依赖结构。 MongoDB.Driver 依赖于 MongoDB.Driver.Core,后者依赖于 MongoDB.Bson。这意味着尽管我的代码引用了签名程序集,但预编译程序集引用了它们所依赖的签名程序集。

一般来说,当你有一个像这样的依赖树时,你会观察到这种行为

Assembly1 -------> Assembly2
   |                   |
   |---> Assembly3 <---|

程序集 1 和 2 都依赖于程序集 3,但程序集 1 也依赖于程序集 2。它比循环依赖差一步,因此非常罕见。

我在 5 部分系列的 part 4 中讨论了可用于签署第 3 方 DLL 和解决此问题的过程和 SDK 工具。 .NetFU 也有一篇关于该过程的好文章,但他们的页面已被删除。

我在使用新的 csproj 格式的项目中遇到了这个问题,形成了文件的顶部:

<Project Sdk="Microsoft.NET.Sdk">

连同 PackageReference 只是包的名称。因此,没有本地包文件夹。查看 Visual Studio 中包的属性,我可以在 .nuget 文件缓存中看到 DLL 的完整路径:

%USERPROFILE%\.nuget\packages

我不确定链接/引用是如何工作的,但即使将应用程序和包的签名版本放在同一目录中,仍然无法工作。应用程序正在引用 nuget 缓存中 DLL 的信息。

所以我的解决方法是用 DLL 的签名版本替换 nuget 缓存中的 DLL。

如果您有不同的项目,它们都需要签名。您不能用证书签署一个而不签署其他证书。