C# 在编译时使用类型时从自定义位置加载程序集

C# 在编译时使用类型时从自定义位置加载程序集,c#,.net,C#,.net,您能建议一些从特定位置加载.NET程序集的方法吗?我有以下限制: 我正在开发一个插件,这意味着我不控制exe 文件和应用程序配置文件 我需要在编译时从该程序集中获取类型 在GAC中注册程序集不是一个选项 要从特定位置拾取程序集,请将这些程序集添加到App.Config文件 <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <probing privatePath="

您能建议一些从特定位置加载.NET程序集的方法吗?我有以下限制:

  • 我正在开发一个插件,这意味着我不控制exe 文件和应用程序配置文件
  • 我需要在编译时从该程序集中获取类型
  • 在GAC中注册程序集不是一个选项

  • 要从特定位置拾取程序集,请将这些程序集添加到App.Config文件

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

    这里的“资源”是自定义文件夹。您可以在此文件夹中添加DLL。每次应用程序启动时,它都会首先在此自定义文件夹中查找DLL,您可以根据自己的意愿将其命名为任何名称

    我做出以下假设:

  • 您正在尝试编写一个引用附加.dll的插件-因此,您将向用户分发这两个程序集,并且它们都将位于分配的“plugins”文件夹中
  • 该应用程序支持插件体系结构
  • 你有没有试过使用这个软件?您应该能够通过以下方式获取插件库位置:

    Assembly me = System.Reflection.Assembly.​Get​Executing​Assembly();
    // Get the file path of the currently running assembly
    string pathToMe = me.Location;
    string pluginFolder = System.IO.Path.GetDirectoryName(pathToMe);
    
    然后,您应该能够加载附加程序集,假定其位于同一文件夹中。

    您可以在运行时使用该事件以编程方式从自定义位置加载程序集

    由于您无法控制加载插件的实际应用程序,因此这依赖于应用程序以某种方式执行部分代码,从而使您有机会钩住
    AppDomain


    由于您没有详细介绍所使用的插件体系结构,因此很难知道这是否适用于您。

    不幸的是,这不是我的选择。您的假设是正确的。很抱歉没有明确说明这些事情。如果仅通过反射使用加载的dll,则Assembly.LoadFrom将正常工作。但是如果我在我的C#项目中引用它,并在代码中使用它的一些类,我的插件甚至不会启动,因为dll无法加载。不用担心这些假设。明白了。我相信有一个程序集绑定事件你可以监听并挂接到你的首选路径。如果我正确地得到你,我的插件(程序集绑定事件的处理程序)中的一些代码将运行,即使插件引用的DLL没有加载?抱歉,现在从我的办公桌上出来,但下面有一些细节:谢谢。这正是我想要的。也很有帮助。应该注意的是,程序集可以处理自身依赖项的加载、处理加载失败异常,并且通常会一直运行,直到调用需要无法加载依赖项的方法为止。