C# .NET在运行时为依赖项添加目录
在我的主C#应用程序中,我通过反射实例化了另一个应用程序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()方法如
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。