C# .NET在运行时为依赖项添加目录

C# .NET在运行时为依赖项添加目录,c#,.net,dll,dependencies,C#,.net,Dll,Dependencies,在我的主C#应用程序中,我通过反射实例化了另一个应用程序 assembly.CreateInstance( ... ) 但是,此其他程序集依赖于DLL,这些DLL位于执行程序集之外的另一个目录中。如何将此目录添加到查找路径?以下是我们如何在NDepend.PowerTools中实现这一需求。这些是一组基于的工具。DLLNDepend.API.DLL位于目录\Lib中,而NDepend.PowerTools.exe程序集位于目录\中 NDepend.PowerTools.exeMain()方法如

在我的主C#应用程序中,我通过反射实例化了另一个应用程序

assembly.CreateInstance( ... )

但是,此其他程序集依赖于DLL,这些DLL位于执行程序集之外的另一个目录中。如何将此目录添加到查找路径?

以下是我们如何在NDepend.PowerTools中实现这一需求。这些是一组基于的工具。DLLNDepend.API.DLL位于目录
\Lib
中,而NDepend.PowerTools.exe程序集位于目录
\

NDepend.PowerTools.exeMain()方法如下所示:

[STAThread]
static void Main() {    
   AppDomain.CurrentDomain.AssemblyResolve += AssemblyResolverHelper.AssemblyResolveHandler;
   MainSub();
}

// MainSub() is here to avoids that the Main() method uses something
// from NDepend.API without having registered AssemblyResolveHandler
[MethodImpl(MethodImplOptions.NoInlining)]
static void MainSub() {
   ...
AssemblyResolverHelper
类是:

using System;
using System.Diagnostics;
using System.Reflection;


namespace NDepend.PowerTools {
   internal static class AssemblyResolverHelper {
      internal static Assembly AssemblyResolveHandler(object sender, ResolveEventArgs args) {
         var assemblyName = new AssemblyName(args.Name);
         Debug.Assert(assemblyName != null);
         var assemblyNameString = assemblyName.Name;
         Debug.Assert(assemblyNameString != null);

         // Special treatment for NDepend.API and NDepend.Core because they are defined in $NDependInstallDir$\Lib
         if (assemblyNameString != "NDepend.API" &&
             assemblyNameString != "NDepend.Core") {
            return null;
         }
         string binPath =
              System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) +
              System.IO.Path.DirectorySeparatorChar +
              "Lib" +
              System.IO.Path.DirectorySeparatorChar;

         const string extension = ".dll";

         var assembly = Assembly.LoadFrom(binPath + assemblyNameString + extension);
         return assembly;
      }
   }
}
这在单个AppDomain中工作。如果不需要,我不会在这里使用额外的AppDomain。AppDomain是一个非常昂贵的工具(就性能而言)+跨越AppDomains边界的线程必须序列化/非序列化输入/输出数据以提供汇编代码,这可能是一个令人头痛的问题


AppDomain的唯一优点是它允许卸载加载的程序集。因此,如果您希望在主AppDomain的生命周期内定期加载/卸载程序集,那么使用一些额外的临时AppDomain是一个不错的选择。

非常模糊,也非常危险。最好使用AppDomain来实现这一点以提供某种程度的隔离,AppDomainSetup允许您设置路径。是的,我已经尝试使用AppDomain来实现这一点,但在新域中创建实例时,它总是提供FileLoadException。