在 .NET Core 中加载程序集和类型
Loading Assembly and Type in .NET Core
我正在尝试在 .NET Core 中 在运行时 动态加载程序集,主要是查看外部文件夹并从那里加载程序集。加载似乎工作正常,但是,我似乎无法在 .NET Core 应用程序中实例化现在加载的类型。
我正在使用以下加载代码(此时对于可行性测试来说非常基础):
private void LoadPrivateBinAssemblies()
{
var binPath = Path.Combine(WebRoot, "PrivateBin");
if (Directory.Exists(binPath))
{
var files = Directory.GetFiles(binPath);
foreach (var file in files)
{
if (!file.EndsWith(".dll", StringComparison.CurrentCultureIgnoreCase) &&
!file.EndsWith(".exe", StringComparison.InvariantCultureIgnoreCase))
continue;
try
{
var asm = AssemblyLoadContext.Default.LoadFromAssemblyPath(file);
//var asm = Assembly.LoadFrom(file);
Console.WriteLine("Additional Assembly: " + file);
}
catch (Exception ex)
{
Console.WriteLine("Failed to load private assembly: " + file);
Console.WriteLine(" " + ex.Message);
}
}
}
}
注意 - 我正在使用 AssemblyLoadContext.Default
加载到 .NET Core 默认上下文中,我可能会从中创建一个新类型。
然后 - 为了进行测试,我现在明确尝试在 Configure()
启动序列的底部实例化这样的类型:
LoadPrivateBinAssemblies();
// this has my loaded assemblies in it
var list = AssemblyLoadContext.Default.Assemblies;
try
{
// this works
var t = Type.GetType(typeof(Startup).FullName);
// fails - Markdig is loaded and has no dependencies
var t2 = Type.GetType("Markdig.Markdown", true); // fails
// fails
var md = Type.GetType("Westwind.AspNetCore.Markdown.Markdown", true);
// never get here
md.InvokeMember("Parse", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Static, null, null, new object[] { "**asdasd**", false, false, false });
}
catch (Exception ex)
{
Console.Log($"{ex.message}");
}
我已验证程序集中存在类型并且名称正确,但它在几个自定义加载的程序集中失败。
该图显示了已加载程序集的列表(此处来自 AppDomain.GetAssemblies()
,但我从 AssemblyLoadContext.Default.Assemblies
获得了相同的列表)。程序集已加载,但我无法获取其中包含的类型的类型引用。
知道我在这里遗漏了什么吗?
您需要使用程序集限定名,Type.GetType("Namespace.TypeName, AssemblyName")
。
我正在尝试在 .NET Core 中 在运行时 动态加载程序集,主要是查看外部文件夹并从那里加载程序集。加载似乎工作正常,但是,我似乎无法在 .NET Core 应用程序中实例化现在加载的类型。
我正在使用以下加载代码(此时对于可行性测试来说非常基础):
private void LoadPrivateBinAssemblies()
{
var binPath = Path.Combine(WebRoot, "PrivateBin");
if (Directory.Exists(binPath))
{
var files = Directory.GetFiles(binPath);
foreach (var file in files)
{
if (!file.EndsWith(".dll", StringComparison.CurrentCultureIgnoreCase) &&
!file.EndsWith(".exe", StringComparison.InvariantCultureIgnoreCase))
continue;
try
{
var asm = AssemblyLoadContext.Default.LoadFromAssemblyPath(file);
//var asm = Assembly.LoadFrom(file);
Console.WriteLine("Additional Assembly: " + file);
}
catch (Exception ex)
{
Console.WriteLine("Failed to load private assembly: " + file);
Console.WriteLine(" " + ex.Message);
}
}
}
}
注意 - 我正在使用 AssemblyLoadContext.Default
加载到 .NET Core 默认上下文中,我可能会从中创建一个新类型。
然后 - 为了进行测试,我现在明确尝试在 Configure()
启动序列的底部实例化这样的类型:
LoadPrivateBinAssemblies();
// this has my loaded assemblies in it
var list = AssemblyLoadContext.Default.Assemblies;
try
{
// this works
var t = Type.GetType(typeof(Startup).FullName);
// fails - Markdig is loaded and has no dependencies
var t2 = Type.GetType("Markdig.Markdown", true); // fails
// fails
var md = Type.GetType("Westwind.AspNetCore.Markdown.Markdown", true);
// never get here
md.InvokeMember("Parse", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Static, null, null, new object[] { "**asdasd**", false, false, false });
}
catch (Exception ex)
{
Console.Log($"{ex.message}");
}
我已验证程序集中存在类型并且名称正确,但它在几个自定义加载的程序集中失败。
该图显示了已加载程序集的列表(此处来自 AppDomain.GetAssemblies()
,但我从 AssemblyLoadContext.Default.Assemblies
获得了相同的列表)。程序集已加载,但我无法获取其中包含的类型的类型引用。
知道我在这里遗漏了什么吗?
您需要使用程序集限定名,Type.GetType("Namespace.TypeName, AssemblyName")
。