winforms 在运行时加载程序集.NET 6

z9ju0rcb  于 2022-11-17  发布在  .NET
关注(0)|答案(1)|浏览(248)

我们正处于将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中加载运行时程序集并访问其中的类吗?

ilmyapht

ilmyapht1#

是否引用了解决方案2/项目1?由于它们具有相同的程序集名称Custom.TestAssembly,因此如果已将其加载到内存中,则运行时将不会再次加载它。
但是,您可以在不同的AssemblyLoadContext下加载它,也有example on MSDN
此外,您可能还想了解一下DotNetCorePlugins,它负责处理程序集加载、重载、隔离、共享类型和依赖项解析。

相关问题