2016-01-18 42 views
1

我有一个Adobe Acrobat插件,它在AssemblyResolve事件中使用System.Reflection.Assembly.LoadFile(path),随时会失败尝试加载已签名的程序集。该错误是无法通过Assembly.LoadFrom()加载强名称程序集,调用以0x80004005(E_FAIL)失败

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程序集一样得到了与上面相同的错误。
  • 看着融合日志查看器,但没有记录Acrobat。
  • 创建了一个C++控制台应用程序,它包含相同的CLI桥包装类,该类使用与上述相同的错误消耗SignalR的相同C#程序集。看着融合日志,但没有在我的ConsoleApplication.exe文件夹下的Microsoft.AspNet.SignalR.dll日志。看着我使用SignalR的C#程序集的fusino日志,并且没有任何参考/提及SignalR dll尝试加载日志文件。
+1

不要盲目提供能够加载*任何*缺少的程序集,首先检查它是否实际存在于您的插件目录中。 *总是*使用LoadFrom,*从不*使用LoadFile。你必须得到fuslogvw.exe,确保从提升的命令提示符(以管理员身份运行)启动它。 –

+0

感谢您的建议汉斯。在尝试Assembly.LoadFrom(path)之前,我添加了一个File.Exists(path)检查。我的Acrobat Reader和Acrobat Pro都安装在我的开发机器上。我决定卸载Reader并尝试让它与Pro一起工作。有了Pro,强大的名字dll加载没有问题,融合日志被创建,一切都很好。在第二天左右,我会卸载Pro,并尝试只安装Reader。当我理清它时,我会添加一条评论。谢谢。 – Byron

回答

1

Adob​​e Reader有一个选项/首选项编辑 - >首选项 - >安全(增强) - >在启动时启用保护模式启动受保护的沙箱中的应用程序。这种保护防止了Strong命名的dll被加载。

相关问题