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

时间:2016-01-18 16:26:45

标签: c# .net c++-cli fileloadexception

我有一个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(路径)而不是LoadFile(路径),同样的错误加载程序集。
  • 从源代码重建SignalR并删除强名称,在AssebmlyResolve事件中成功加载SignalR程序集。将强名称添加回SignalR程序集并再次出现上述错误。
  • 为我的C#程序集添加了强名称,得到了与上面相同的错误,就像SignalR程序集一样。
  • 查看了Fusion日志查看器,但没有记录任何Acrobat。
  • 创建了一个C ++控制台应用程序,该应用程序包含相同的CLI桥接器包装类,它使用与SignalR相同的C#程序集,与上面相同。查看了Fusion日志但没有登录我的ConsoleApplication.exe文件夹下的Microsoft.AspNet.SignalR.dll。查看使用SignalR的C#程序集的fusino日志,并且没有任何参考/提及SignalR dll尝试加载日志文件。

1 个答案:

答案 0 :(得分:1)

Adob​​e Reader有一个选项/首选项Edit-&gt; Preferences-&gt; Security(Enhanced) - &gt;启动时启用保护模式,在受保护的沙箱中启动应用程序。这种保护阻止了强名称dll的加载。