. net在运行时添加依赖项目录
本文关键字:项目 依赖 添加 运行时 net | 更新日期: 2023-09-27 17:52:46
在我的c#主应用程序中,我通过反射实例化了另一个应用程序。
assembly.CreateInstance( ... )
但是,这个程序集依赖于位于执行程序集以外的另一个目录中的dll。如何将此目录添加到查找路径中?
下面是我们如何在standalone . powertools中实现这个需求的。这是一组基于独立api的工具。DLL ndependency . api . DLL 在.'Lib
目录下,而 ndependency . powertools .exe程序集在.'
目录下。
[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是可行的。