[英]Reference a DLL from another DLL
我有一個C#應用程序,我們稱之為App.exe。 它引用了一個名為A.dll的DLL,后者又引用了另一個DLL,即B.dll。 然而,它們被引用的方式有點不同。 在A.dll的代碼中,它直接引用了B.dll(通過轉到Project> References> Add B.dll)。 但是我的App.exe有代碼在運行時使用Assembly.Load()等加載A.dll。
所以回顧一下,
App.exe ----(運行時加載)---> A.dll ----(直接引用)---> B.dll
所有這三件事(App.exe,A.dll和B.dll)都在同一個目錄中,比方說ExeDir。 現在我想要做的是,將A.dll和B.dll放在ExeDir的子目錄中。 我可以通過使用指定A.dll路徑的App.config文件並要求App.exe從該路徑加載A.dll來完成此操作。 到現在為止還挺好。
然而問題是,當我這樣做時,.NET給我一個錯誤,說它無法找到與A.dll在同一目錄中的B.dll。 如果我將其移回原始目錄(與App.exe相同的目錄),那么它可以正常工作。 這意味着,我可以將A.dll放在子目錄中,但B.dll需要位於原始目錄中。
有什么方法可以將兩個DLL保存在子目錄中?
在app.config中添加<probing>
元素:
http://msdn.microsoft.com/en-us/library/823z9h8w.aspx
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="bin;bin2\subbin;bin3"/>
</assemblyBinding>
</runtime>
</configuration>
您可以通過為當前AppDomain的AppDomain.AssemblyResolve
事件提供事件處理程序來手動解析B.DLL
程序集。
currentDomain.AssemblyResolve += ResolveLostAssemblies;
然后提供ResolveEventHandler
的實現:
private Assembly ResolveLostAssemblies(object sender, ResolveEventArgs args)
{
// Find the assembly referenced by args.Name, load it dynamically, and return it.
}
我發現這可以最大程度地控制加載哪些程序集以及何時加載。 它特別適用於您的應用程序是可插入的情況,並且每個插件都位於“plugins”文件夾(不一定是應用程序目錄)的子目錄中。 從技術上講,程序集甚至不必是使用此方法的物理文件。 雖然D Stanley的方法通常被認為是更標准的。
一種選擇是嘗試在全局程序集緩存中注冊程序集。 http://msdn.microsoft.com/en-us/library/4a9t8a9a.aspx但這可能不是D Stanley的回答。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.