我正在将vs2008中的.Net 3.5控制台应用程序移植到vs2017中的.Net Core控制台应用程序(目标框架netcoreapp1.1)。
程序通过在给定目录中查找.dll并将它们作为程序集加载来执行一些插件加载。
我已经将插件重建为netstandard1.6库。不可否认,我对Core,Framework和Standard之间的差异感到有些困惑。
我使用System.Runtime.Loader(v4.3.0)NuGet包和以下代码尝试从给定路径加载程序集:
public static Assembly LoadAssemblyFromPath(string path)
{
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;
string[] foundDlls =
Directory.GetFileSystemEntries(new FileInfo(path).FullName, name.Name + ".dll", SearchOption.AllDirectories);
return foundDlls.Any() ? context.LoadFromAssemblyPath(foundDlls[0]) : context.LoadFromAssemblyName(name);
};
return AssemblyLoadContext.Default.LoadFromAssemblyPath(path);
}
我已验证路径参数是否正确,文件是否存在,但我仍然收到“无法加载文件或程序集”异常。永远不会提出解决事件。
任何人都可以提供任何有关我做错的见解吗?
答案 0 :(得分:0)
我最终使用了以下内容:
public static Assembly LoadAssemblyFromPath(string path)
{
string fileNameWithOutExtension = Path.GetFileNameWithoutExtension(path);
bool inCompileLibraries = DependencyContext.Default.CompileLibraries.Any(l => l.Name.Equals(fileNameWithOutExtension, StringComparison.OrdinalIgnoreCase));
bool inRuntimeLibraries = DependencyContext.Default.RuntimeLibraries.Any(l => l.Name.Equals(fileNameWithOutExtension, StringComparison.OrdinalIgnoreCase));
return inCompileLibraries || inRuntimeLibraries
? Assembly.Load(new AssemblyName(fileNameWithOutExtension))
: AssemblyLoadContext.Default.LoadFromAssemblyPath(path);
}