我们正处于将c# Winforms App从.NET Framework转换为.NET 6的初始阶段。我们可以让项目在.NET 6中生成和运行,但当涉及到动态加载的程序集时,我们遇到了问题。我们可以让程序集加载,但尝试访问其中的自定义类时返回null。我在两个较小的项目中重新创建了此场景作为示例。
解决方案1/项目1 -要加载到主应用程序中的程序集的代码。这是创建TestAssembly.dll的类库
namespace Custom.TestAssembly
{
public class TestClass : CallingModule
{
public override object GetValue()
{
return "Hello World";
}
}
}
解决方案2/项目1 -这是主应用程序解决方案中的项目和类。这是创建Custom.TestAssembly.dll的类库
namespace Custom.TestAssembly
{
public class CallingModule
{
public virtual object? GetValue()
{
return null;
}
}
}
解决方案2/项目2 -窗体上放置了一个按钮。单击该按钮时,应加载程序集,实际上也是如此。但是,尝试从程序集中提取类总是返回NULL。
Form1.cs
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.Loader;
namespace TestCallingApplication
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Assembly dynamicAssembly = AssemblyLoadContext.Default.LoadFromAssemblyPath(@"C:\LocationOf\TestAssembly.dll");
Module customizationModule = dynamicAssembly.GetModule("TestAssembly.dll");
Type customClientModule = customizationModule.GetType("Custom.TestAssembly.TestClass"); //THIS RETURNS A NULL??
}
}
}
只是想了解我错过了什么。有什么想法吗?或者有更好的方法在.NET 6中加载运行时程序集并访问其中的类吗?
1条答案
按热度按时间ilmyapht1#
是否引用了解决方案2/项目1?由于它们具有相同的程序集名称
Custom.TestAssembly
,因此如果已将其加载到内存中,则运行时将不会再次加载它。但是,您可以在不同的AssemblyLoadContext下加载它,也有example on MSDN。
此外,您可能还想了解一下DotNetCorePlugins,它负责处理程序集加载、重载、隔离、共享类型和依赖项解析。