C# 从非根目录加载程序集

C# 从非根目录加载程序集,c#,directory,.net-assembly,C#,Directory,.net Assembly,我试图从根目录下的不同文件夹将程序集加载到我的项目中,并为它设置一个新域。我的目标是在运行时加载和卸载。当ddl文件位于应用程序的根目录中时,所有这些都可以正常工作,但一旦我将其放入插件文件夹中,我就无法找到错误文件。我知道有很多这样的话题,但没有一个能满足我所有的需求,也没有一个能像我所期望的那样工作。一旦我加载到当前域,它就会工作 示例代码: dllFileNames = Directory.GetFiles(path, "*.dll"); IColle

我试图从根目录下的不同文件夹将程序集加载到我的项目中,并为它设置一个新域。我的目标是在运行时加载和卸载。当ddl文件位于应用程序的根目录中时,所有这些都可以正常工作,但一旦我将其放入插件文件夹中,我就无法找到错误文件。我知道有很多这样的话题,但没有一个能满足我所有的需求,也没有一个能像我所期望的那样工作。一旦我加载到当前域,它就会工作

示例代码:

  dllFileNames = Directory.GetFiles(path, "*.dll");

                ICollection<Assembly> assemblies = new List<Assembly>(dllFileNames.Length);

                AppDomain currentDomain = AppDomain.CurrentDomain;
                Evidence asEvidence = currentDomain.Evidence;
                AppDomainSetup aps = new AppDomainSetup
                {
                    ApplicationBase = @"[root of application]",
                    PrivateBinPath = @"[Plugin folder]"
                };

                AppDomain myDomain = AppDomain.CreateDomain("Plugins",asEvidence,aps);
                SimpleAssemblyLoader assemblyLoader = (SimpleAssemblyLoader)myDomain.CreateInstanceAndUnwrap(typeof(SimpleAssemblyLoader).Assembly.FullName, typeof(SimpleAssemblyLoader).FullName);

                foreach (string dllFile in dllFileNames)
                {

                         assemblyLoader.LoadFrom(dllFile);

                }

              var assemblyList =  myDomain.GetAssemblies(); // in here getting error :( file not found for no reason.
设置为您的插件文件夹

或注册事件以解决缺少的程序集


对于.Net核心编程,请查看类

Thx以获取评论,但我猜您没有阅读我的全部问题..:(正如您在我发布的代码中看到的,已经设置了Basedir。这是我的问题var assemblyList=myDomain.GetAssemblies();//在这里获取错误:(无缘无故找不到文件。问题是我可以加载它,但无法获取已加载程序集的列表…您是否尝试使用AssemblyResolve事件?我的第二个意见。事件未被删除或其他内容?每个appdomain都有单独的AssemblyResolve事件。
public class SimpleAssemblyLoader : MarshalByRefObject
{
    public void Load(string path)
    {
        ValidatePath(path);

        Assembly.Load(path);
    }

    public void LoadFrom(string path)
    {
        ValidatePath(path);

        Assembly.LoadFrom(path);
    }

    private void ValidatePath(string path)
    {
        if (path == null)
        {
            throw new ArgumentNullException("path");
        }

        if (!System.IO.File.Exists(path))
        {
            throw new ArgumentException(string.Format("path \"{0}\" does not exist", path));
        }
    }
}