我有一个 Adobe acrobat 插件,它在 AssemblyResolve 事件中使用 System.Reflection.Assembly.LoadFile(path) ,只要我尝试加载签名的程序集,它就会失败。错误是
The assembly with display name 'Microsoft.AspNet.SignalR.Client' failed to load in the 'Load' binding context of the AppDomain with ID 1. The cause of the failure was: System.IO.FileLoadException: Could not load file or assembly 'Microsoft.AspNet.SignalR.Client, Version=2.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. Unspecified error (Exception from HRESULT: 0x80004005 (E_FAIL))
我必须使用 AssemblyResolve 事件,因为所需的程序集将位于 Acrobat exe 下几级的文件夹中。这是 AssebmlyResolve 调用的代码。
Assembly^ TeamMateIntegrationManagedWrapper::ResolveAssembly(Object^ sender, ResolveEventArgs^ args){
try
{
// This method will be called if an assembly cannot be found.
// The assembly should be 2 folders below the current working directory where the Adobe Acrobat executable lives.
AppDomain^ appDomain = static_cast<AppDomain^>(sender);
String^ path = appDomain->BaseDirectory;
path += "plug_ins\\MyAppName\\" + args->Name->Split(',')[0] + ".dll";
return System::Reflection::Assembly::LoadFile(path);
}
catch (Exception^ ex)
{
String^ msg = ex->Message;
}
return nullptr;}
Acrobat 插件主要使用 C 语言,但有一个 CLI 桥接类来包装使用 SignalR 的托管 C# 程序集。
我尝试过的事情。
- 将所有必需的 dll 与 Acrobat 的可执行文件放在同一个文件夹中,以绕过使用 AssemblyResolve 事件。
- 验证了我在 AssemblyResolve 事件中提供的 dll 的 SignalR 版本和 PublicKeyToken 与 ResolveEventArgs 中请求的内容完全匹配
- 已验证我的所有程序集(包括插件 dll)都针对 .Net Framework v4.6,并且插件 dll 是为 x86 构建的,而其他程序集是为任何 CPU 构建的。
- 尝试了 Assembly::LoadFrom(path) 而不是 LoadFile(path),同样的错误加载程序集。
- 从源代码重建 SignalR 并删除 Strong Name,SignalR 程序集在 AssebmlyResolve 事件中成功加载。将强名称添加回 SignalR 程序集并再次出现上述错误。
- 向我的 C# 程序集添加了强名称,得到了与上面相同的错误,就像 SignalR 程序集一样。
- 查看融合日志查看器,但没有为 Acrobat 记录任何内容。
- 创建了一个 C++ 控制台应用程序,该应用程序包含相同的 CLI 桥接包装类,该类使用使用 SignalR 的相同 C# 程序集,与上述相同的错误。查看了融合日志,但在我的 ConsoleApplication.exe 文件夹下没有 Microsoft.AspNet.SignalR.dll 的日志。查看了我使用 SignalR 的 C# 程序集的 fusino 日志,并且没有任何参考/提及尝试在日志文件中加载的 SignalR dll。