我正在尝试将第三方COM dll加载到我的应用程序中。一切都很好,但是当我运行应用程序时,我不断从我的应用程序中收到此消息:
无法加载文件或程序集'" assembly",Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'或其中一个依赖项。需要一个强名称的程序集。 (来自HRESULT的异常:0x80131044)。
当我执行sn -vf "assembly"
时,它表示程序集有效。有没有人见过这种行为?
答案 0 :(得分:8)
您尝试加载的程序集没有强名称。这可以通过您的消息看到,它显示PublicKeyToken=null
。如果它有一个强名称,它将有一个公钥令牌。
如果您在编译或引用之后给它一个强名称,请尝试在项目中再次引用它。也许您的项目仍然是旧的引用,并且正在尝试加载未签名的版本。
答案 1 :(得分:2)
我在使用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&amp; 2取决于组件3,但组件1也取决于组件2.它的一个步骤缺乏循环依赖性,这使得它非常罕见。
我将讨论可用于签署第三方DLL的流程和SDK工具,并在5部分系列的part 4中解决此问题。 .NetFU也有一篇关于这个过程的好文章,但他们的页面已被删除。
答案 2 :(得分:0)
在使用新的csproj格式的项目中,我遇到了这个问题,形成了文件的顶部:
<Project Sdk="Microsoft.NET.Sdk">
与PackageReference一起仅表示包的名称。因此,没有本地包文件夹。在Visual Studio中查看包的属性,可以在.nuget文件缓存中看到DLL的完整路径:
%USERPROFILE%\.nuget\packages
我不确定链接/引用的工作方式,但是即使将应用程序和签名版本的软件包放在同一目录中,也仍然无法工作。该应用程序正在从nuget缓存中的DLL中引用信息。
所以我的解决方法是将nuget缓存中的DLL替换为DLL的签名版本。
答案 3 :(得分:0)
如果您有其他项目,则都需要签名。您不能使用证书签名,也不能签署其他证书。