C#:自定义程序集目录

Svi*_*ish 14 c# assemblies assembly-resolution

假设我们有一个由一个可执行文件和5个库组成的应用程序.通常所有这些都将包含在一个目录中,并且将从那里加载库.

是否有可能这样做,例如我可以在一个名为Lib的目录中拥有一些库,其余的名为Lib2?这样应用程序目录只包含可执行文件本身,其他程序集将包含在各种逻辑目录中.

我怎样才能做到这一点?我想知道如何加载程序集,以及如何使应用程序的构建将程序集放在正确的目录中.

小智 31

您可以向app.config添加其他搜索路径,以便加载程序集.例如

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <probing privatePath="lib;thirdParty" />
  </assemblyBinding>
</runtime>
Run Code Online (Sandbox Code Playgroud)

你可以在这里看到更多细节.


Lu5*_*u55 11

如果您想手动管理从何处获取组件,您有两种可能性:

  1. 处理AppDomain.AssemblyResolve事件(由SLaks描述).这是代码片段:

    static void Main(string[] args)
    {
       ...
       AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
       ...
    }
    
    static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
    {
       string assembliesDir = "your_directory";
       Assembly asm = Assembly.LoadFrom(Path.Combine(assembliesDir, args.Name + ".dll"));
       return asm;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用您自己的设置创建域(通过设置AppDomainSetup对象的ApplicationBasePrivateBinPath属性).

因此,如果您想继续在当前域中工作,则必须使用方法1.