Far*_*lop 5 c# .net-assembly .net-core
我正在将一个控制台应用程序移植到.NET核心,它从外部库加载类型.在程序Type.GetType("typename, assemblyname")集位于可执行文件所在的同一文件夹中时,使用完整的.NET Framework 工作.
在.NET Core中,无论何处放置库,它都返回null.
作为一种解决方法,我已经安装了System.Runtime.Loader包并附加到Resolving事件以强制从完整路径加载:
AssemblyLoadContext.Default.Resolving += Default_Resolving;
type = Type.GetType(value);
Run Code Online (Sandbox Code Playgroud)
代表是:
private static Assembly Default_Resolving(AssemblyLoadContext context, AssemblyName assembly)
{
return context.LoadFromAssemblyPath(Path.Combine(Directory.GetCurrentDirectory(), @"bin\Debug\netcoreapp1.1", $"{assembly.Name}.dll"));
}
Run Code Online (Sandbox Code Playgroud)
问题是:在加载外部程序集时,.NET核心在哪里查找?
这花了我很长时间才解决。默认情况下,动态加载仅发生在执行目录中。静态加载非常有能力进入你的 nuget 包缓存(这就是 .runtimeconfig.json 和 .deps.json 的用途),但如果你没有链接目标 dll,它就不会在那里。
你真的不想从当前目录加载;它很可能是一个不安全的加载 dll 的地方。
要获取您的加载路径: System.IO.Path.GetDirectoryName(typeof(myclassname).GetTypeInfo().Assembly.Location)