我正在使用我撰寫的工具呼叫以下行以檢查一些內容,包括程式集版本:
var assm = System.Reflection.Assembly.LoadFrom(path);
該工具按設計作業,除非我嘗試針對 .NET Core 應用程式運行它。
當我提供為 .NET Core 3.1、5.0 或 6.0 編譯的應用程式的路徑時,我在嘗試加載程式集時收到System.BadImageFormatException 。
我的工具是使用 .NET 4.7.2 Framework 用 C# 撰寫的,我將其更新為使用 4.8,但仍然出現例外。認為這可能是常規 .NET 和 .NET Core 之間的混淆,我撰寫了以下快速專案并使用與目標應用程式 (.NET Core) 相同的框架對其進行編譯,但我得到了相同的錯誤。
事實證明,它會為任何和所有 .NET Core 應用程式引發例外。它在使用 .NET 4.7.2 Framework 等的典型 Windows 應用程式上運行良好,但在任何 .NET Core 應用程式上都死了。
在研究這一點時,我還沒有發現任何表明 .NET Core 應用程式清單如此不同以至于它們會導致呼叫阻塞的東西。我所有的應用程式和測驗都編譯為 64 位應用程式;沒有 64 位和 32 位的混合。
使用簡單測驗器應用程式重現的步驟(如下):
- 打開你的 Visual Studio 風格
- 創建一個新的控制臺應用程式專案
- 在模板欄位中,分別輸入:C#、Windows 和 Console
- 選擇“控制臺應用程式”(不是:控制臺應用程式(.NET 框架))
- 點擊下一步
- 給您的應用起一個短名稱,然后單擊下一步
- 選擇 .NET core 5(或 3.1 或 6 - 但您需要洗掉 6.0 的 main{})
- 粘貼下面的代碼并編譯。
- 提供此應用程式(或任何其他 .Net 核心應用程式)的路徑
- 刮頭
簡單的測驗儀:
internal class Program
{
static void Main(string[] args)
{
Console.Write("\r\nEnter complete path to assembly:");
var path = Console.ReadLine();
if (!string.IsNullOrEmpty(path))
{
var assm = System.Reflection.Assembly.LoadFrom(path);
if (assm != null)
{
var c = assm.GetCustomAttributes(false);
if (null != c && c.Length > 0)
{
Console.WriteLine($"Len:{c.Length} Value type:{c}");
Console.WriteLine($"c0:[{c[0]}]");
var x = 1; // convenient breakpoint to examine vars
}
}
}
Console.WriteLine("Complete...");
Console.ReadLine();
}
}
更新:
對于現在或以后閱讀本文的任何人,Microsoft 提供了一個用于讀取跨架構 .NET 程式集屬性的新包:System.Reflection.MetadataLoadContext - 在 Nuget.org 上可用
uj5u.com熱心網友回復:
從 .NET Core 開始(我不記得究竟是哪個 .NET Core 版本),使用默認設定構建應用程式/可執行專案時生成的可執行 .exe 檔案不再像過去那樣是 .NET 程式集.NET 框架。
相反,.NET 程式被編譯成一個單獨的程式集 DLL(稱為“跨平臺二進制”;相關的 exe 檔案稱為“平臺特定的可執行檔案”)。因此,與 .NET Framework 應用程式不同,您需要找到并加載包含應用程式代碼的程式集 DLL。這種差異的原因基本上歸結為舊的 .NET Framework 是一個僅限 Windows 的平臺(其他兼容平臺,如 Mono 不支持),而 .NET Core(以及 .NET 5/6/7/... ) 非常強調跨平臺。
(順便說一句,也可以將專案構建為單檔案部署,在這種情況下,您將找不到單獨的 .exe 和 .dll 檔案。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/473351.html
