2016-12-01 93 views
3

使用VS2017 RC,.NET Core在.NET Core中加载程序集

我试图从文件加载程序集。 该程序集的依赖关系位于同一个文件夹中。我正在使用AssemblyLoadContext.Default.LoadFromAssemblyPath

我意识到LoadFromAssemblyPath专门加载请求的程序集,忽略它的依赖关系;任何试图遍历装配类型的尝试都会失败,并显示System.Reflection.ReflectionTypeLoadException

LoaderExceptions包含一列System.IO.FileNotFoundException

我很好奇这是为什么,因为所有需要的文件都在同一个文件夹中。

我也尝试加载一个文件夹中的所有* .dll文件,但一些令人惊讶的失败与System.IO.FileLoadException

我在做什么错?

编辑:我不想依赖.deps文件(从而排除了DependencyContext)。可能吗?

+0

我不习惯这种有点操作,但你有没有试过调用['Assembly.LoadFrom()'](https://msdn.microsoft.com/it-it/library/1009fa28(v = vs。 110)的.aspx)? – Phate01

+1

@ Phate01在.NET Core中没有'Assembly.LoadFrom'。 – Raine

+0

我想你应该从GAC加载程序集,只需指定要加载的程序集的名称(完整或短)即可。但这只是一个猜测。 –

回答

6

那么对我而言,最合适的就是在Resolve事件中注册一个句柄,并在LoadFromAssemblyPath需要依赖关系时按需加载所需的程序集。请注意,这是我的试验和错误数小时的解决方案,所以它可能不是最理想的方法。但现在它适用于我。这里是我的代码:从那里

AssemblyLoadContext.Default.Resolving += (context, name) => 
    { 
     // avoid loading *.resources dlls, because of: https://github.com/dotnet/coreclr/issues/8416 
     if (name.Name.EndsWith("resources")) 
     { 
      return null; 
     } 

     var dependencies = DependencyContext.Default.RuntimeLibraries; 
     foreach (var library in dependencies) 
     { 
      if (IsCandidateLibrary(library, name)) 
      { 
       return context.LoadFromAssemblyName(new AssemblyName(library.Name)); 
      } 
     } 

     var foundDlls = Directory.GetFileSystemEntries(new FileInfo(<YOUR_PATH_HERE>).FullName, name.Name + ".dll", SearchOption.AllDirectories); 
     if (foundDlls.Any()) 
     { 
      return context.LoadFromAssemblyPath(foundDlls[0]); 
     } 

     return context.LoadFromAssemblyName(name); 
    }; 
} 
private static bool IsCandidateLibrary(RuntimeLibrary library, AssemblyName assemblyName) 
{ 
    return (library.Name == (assemblyName.Name)) 
      || (library.Dependencies.Any(d => d.Name.StartsWith(assemblyName.Name))); 
} 

的IsCandidateLibrary()位来源: http://www.michael-whelan.net/replacing-appdomain-in-dotnet-core/

我认为你可以忽略这一点,整个DependencyContext的一部分,但它作为一个缓存,避免重装相同组件一遍又一遍地。所以我保留了它。