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>


.

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

或者,您可以将
Copy Local
设置为false,将引用的DLL文件作为项目中的文件添加到相应的子目录中,并将
Build Action
设置为复制到输出目录(这将保留子目录)


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

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

如果要手动管理从何处获取汇编,有两种可能:

  • 处理事件(如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图像?谢谢你的帮助