Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C:自定义程序集目录_C#_Assemblies_Assembly Resolution - Fatal编程技术网

C# C:自定义程序集目录

C# C:自定义程序集目录,c#,assemblies,assembly-resolution,C#,Assemblies,Assembly Resolution,假设我们有一个由一个可执行文件和5个库组成的应用程序。通常,所有这些都将包含在一个目录中,并从那里加载库 是否可以这样做,例如,我可以在一个名为Lib的目录中拥有一些库,而在一个名为Lib2的目录中拥有其余的库?因此,应用程序目录将只包含可执行文件本身,而其他程序集将包含在各种逻辑目录中 我该怎么做?我还想知道如何加载程序集,以及如何使应用程序的构建将程序集放在正确的目录中。您可以向app.config添加其他搜索路径,它会在其中查找以加载程序集。比如说 <runtime> &l

假设我们有一个由一个可执行文件和5个库组成的应用程序。通常,所有这些都将包含在一个目录中,并从那里加载库

是否可以这样做,例如,我可以在一个名为Lib的目录中拥有一些库,而在一个名为Lib2的目录中拥有其余的库?因此,应用程序目录将只包含可执行文件本身,而其他程序集将包含在各种逻辑目录中


我该怎么做?我还想知道如何加载程序集,以及如何使应用程序的构建将程序集放在正确的目录中。

您可以向app.config添加其他搜索路径,它会在其中查找以加载程序集。比如说

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <probing privatePath="lib;thirdParty" />
  </assemblyBinding>
</runtime>

您可以查看更多详细信息。

要使程序集自动复制到您希望它们所在的文件夹中,您可以将所有引用的“复制本地”设置为true,并执行生成后步骤将它们移动到子目录中

或者,您可以将“复制本地”设置为false,并将引用的DLL文件作为文件添加到相应子目录中的项目中,并将“生成操作”设置为“复制到输出目录”,这将保留子目录


让运行时找到它们的最灵活的方法是处理事件并使用手动加载程序集。您需要一些方法让代码知道哪些程序集位于哪些目录中。

在您的注释中,您提到在运行时添加路径和位置。是的,您可以,但您必须使用Assembly.Load,还可能使用reflection。

如果您想手动管理从何处获取程序集,您有两种可能:

按照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对象的属性,使用您自己的设置创建域


所以,如果你想继续在当前领域工作,你必须使用方法1。

。如果您想要更多的路径,您会添加另一个标记,还是用另一个标记添加另一个?还有,有没有办法在运行时添加此路径?例如,如果它是通过使用某种环境变量或其他东西构建的,那么只需添加更多。我认为您无法在.Net 2.0+中在运行时执行此操作,但这可能是错误的。@Svish您没有添加更多探测元素;而是添加更多用分号分隔的目录。我已经更新了答案以包含这些详细信息。是的,您可以,按照Dotnewill的答案。但是没有什么好处,您可能会遇到很多维护问题。这可能会非常有帮助。我真的不知道那件事。关于构建的问题,你认为最干净的解决方案是什么?我认为它们看起来都有点混乱,但我没有真正尝试过它们中的任何一个,所以我没有真正的线索:如果您使用的是运行时引用,那么复制到本地将没有帮助。i、 e.如果您使用的是界面开发,插件模块仅在运行时可用,设计时参考在此上下文中不起作用谢谢!你刚刚救了我,在谷歌上搜索这样的解决方案,但在其他问题的答案中什么也找不到。这让我很高兴:我正在尝试使用assembly.load加载一个程序集,它不在GAC中,它将失败,并且AssemblyResolve事件将被触发,我正在使用LoadFrom从路径加载它。现在,这个程序集将在加载上下文中加载,所以它是否使用现在的Ngen图像?谢谢你的帮助