2010-02-22 70 views
1

我在動態加載.dlls,我想從我的.exe所在的 子目錄中加載它們。AppDomain.CurrentDomain.AppendPrivatePath(「myPath」);備擇方案?

要達到這樣的Assembly.Load("SomeAssembly");其中SomeAssembly.dll位於下「的DLL \」,我已經做了

AppDomain.CurrentDomain.AppendPrivatePath("DLLs"); 

這工作得很好,但顯然AppendPrivatePath已被棄用。 有人告訴我它是什麼代替放置這在我的app.config

<runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <probing privatePath="DLLs"/> 
    </assemblyBinding> 
    </runtime> 

然而,這沒有任何影響。 Assembly.Load("SomeAssembly")將拋出一個例外,即SomeAssembly找不到。那麼我如何才能做到這一點?

我可以ofcourse:

  • 繼續使用AppDomain.CurrentDomain.AppendPrivatePath("DLLs");,即使它否決。在同一目錄中的.exe
  • 將所有我的插件.DLL文件(MEH ...)
+1

探測元素應該工作,你確定你爲可執行文件(即YourExecutable.exe.config)創建了一個app.config文件,而不是在一個DLL文件(即YourDll.dll.config)上? – 2010-02-22 15:43:55

回答

2

可以使用手工組裝的分辨率做到這一點。

您需要提供一個代表對AssemblyResolve事件在當前的AppDomain

AppDomain currentDomain = AppDomain.CurrentDomain; 
currentDomain.AssemblyResolve += assemblyResolver.ResolveEventHandler; 

當應用程序有它無法解決它會調用該委託得到解決大會的任何組件引用。然後,您可以簡單地返回從代表要求大會:

Assembly assembly = Assembly.LoadFrom (assemblyPath); 
return assembly; 

希望這有助於

1

沒有,<probing>元素是衆所周知的工作。在調試器中運行代碼時,您可能會發現這不起作用。這是因爲「Visual Studio託管流程」,這是CLR的自定義版本,它改進了調試。

將yourapp.exe.config複製到yourapp.vshost.exe.config。或者禁用主機進程:Project + Properties,Debugging選項卡。

相關問題