无法通过 Assembly.LoadFrom() 加载强名称程序集,调用失败并显示0x80004005 (E_FAIL)



我有一个Adobe acrobat插件,它在AssemblySolve事件中使用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 事件进行解决。
  • 已验证我在AssemblySolve事件中提供的dll的SignalR版本和公钥令牌是否与ResolveEventArgs中请求的内容完全匹配
  • 已验证我的所有程序集(包括插件 dll)都面向 .Net Framework v4.6,插件 dll 是为 x86 构建的,其他程序集是为任何 CPU 构建的。
  • 尝试了程序集::LoadFrom(路径)而不是LoadFile(path),加载程序集时出现相同的错误。
  • 从源代码中重新生成 SignalR,并删除了强名称,即在 AssebmlyResolve 事件中成功加载的 SignalR 程序集。 将强名称添加回 SignalR 程序集,并再次收到上述错误。
  • 向我的 C# 程序集添加了强名称,遇到了与上述相同的错误,就像 SignalR 程序集一样。
  • 查看了融合日志查看器,但没有记录任何 Acrobat 的内容。
  • 创建了一个C++控制台应用程序,该应用程序包含相同的 CLI 桥包装器类,该类使用使用 SignalR 的同一 C# 程序集,错误与上述相同。 查看了融合日志,但没有Microsoft.AspNet.SignalR.dll在我的控制台应用程序.exe文件夹下的日志。 查看了使用 SignalR 的 C# 程序集的 fusino 日志,并且没有任何引用/提及尝试在日志文件中加载的 SignalR dll。

Adobe Reader 有一个选项/首选项 Edit->Preferences->Security (增强)->在启动时启用保护模式,用于在受保护的沙箱中启动应用程序。 此保护阻止了名为 dll 的强的加载。

相关内容

  • 没有找到相关文章

最新更新