. net在运行时添加依赖项目录

本文关键字:项目 依赖 添加 运行时 net | 更新日期: 2023-09-27 17:52:46

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

assembly.CreateInstance( ... )

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

. net在运行时添加依赖项目录

下面是我们如何在standalone . powertools中实现这个需求的。这是一组基于独立api的工具。DLL ndependency . api . DLL .'Lib目录下,而 ndependency . powertools .exe程序集在.'目录下。

ndependence . powertools .exe Main()方法如下:
[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是一个非常昂贵的工具(就性能而言)+线程跳过AppDomain边界,必须序列化/反序列化输入/输出数据以提供汇编代码,这可能是一个令人头痛的问题。

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