我們正處于將 ac# 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 中加載運行時程式集并訪問其中的類的更好方法?
uj5u.com熱心網友回復:
您是否參考了解決方案 2/專案 1?由于它們具有相同的程式集名稱Custom.TestAssembly,因此如果已經加載到記憶體中,運行時將不會再次加載它。
但是,您可以在不同的AssemblyLoadContext下加載它, MSDN 上也有一個示例。
此外,您可能想看看DotNetCorePlugins,它負責程式集加載、重新加載、隔離、共享型別和依賴關系決議。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/516764.html
上一篇:如何根據現有檔案名創建檔案名?
