2016-01-18 39 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被加載。

相關問題