假设我们有一个由一个可执行文件和 5 个库组成的应用程序。通常所有这些都将包含在一个目录中,并且将从那里加载库。
是否可以这样做,例如,我可以将一些库放在一个名为 Lib 的目录中,而将其余库放在一个名为 Lib2 的目录中?这样应用程序目录将只包含可执行文件本身,而其他程序集将包含在各种逻辑目录中。
我怎样才能做到这一点?而且我想知道如何加载程序集,还想知道如何使应用程序的构建将程序集放在正确的目录中。
假设我们有一个由一个可执行文件和 5 个库组成的应用程序。通常所有这些都将包含在一个目录中,并且将从那里加载库。
是否可以这样做,例如,我可以将一些库放在一个名为 Lib 的目录中,而将其余库放在一个名为 Lib2 的目录中?这样应用程序目录将只包含可执行文件本身,而其他程序集将包含在各种逻辑目录中。
我怎样才能做到这一点?而且我想知道如何加载程序集,还想知道如何使应用程序的构建将程序集放在正确的目录中。
您可以将其他搜索路径添加到您的 app.config,它会在其中查找以加载程序集。例如
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="lib;thirdParty" />
</assemblyBinding>
</runtime>
您可以在此处查看更多详细信息。
如果您想手动管理从何处获取组件,您有两种可能性:
处理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;
}
使用您自己的设置创建一个域(通过设置AppDomainSetup 对象的ApplicationBase或PrivateBinPath属性)。
因此,如果您想继续在当前域中工作,则必须使用方法 1。
要自动将程序集复制到您希望它们所在的文件夹,您可以将Copy Local
所有引用设置为 true,并进行构建后步骤将它们移动到子目录中。
或者,您可以设置Copy Local
为 false,并将引用的 DLL 文件添加为项目中相应子目录中的文件,并设置Build Action
为复制到输出目录(这将保留子目录)
让运行时找到它们的最灵活方法是处理AppDomain.AssemblyResolve事件并使用Assembly.LoadFile手动加载程序集。您需要某种方式让您的代码知道哪些程序集位于哪些目录中。
在您的评论中,您提到在运行时添加路径和位置。是的,你可以,但你必须使用 Assembly.Load(),可能还有反射。