簡體   English   中英

從另一個DLL引用DLL

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM