簡體   English   中英

.NET Core 應用程序和 System.Reflection.Assembly.LoadFrom(...) 是否存在特定問題?

[英]Are there specific issues with .NET Core apps and System.Reflection.Assembly.LoadFrom(...)?

我正在使用我編寫的工具調用以下行以檢查一些內容,包括程序集版本:

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 位的混合。

使用簡單測試器應用程序重現的步驟(如下):

  1. 打開你的 Visual Studio 風格
  2. 創建一個新的控制台應用程序項目
  3. 在模板字段中,分別輸入:C#、Windows 和 Console
  4. 選擇“控制台應用程序”(不是:控制台應用程序(.NET 框架))
  5. 點擊下一步
  6. 給您的應用起一個短名稱,然后單擊下一步
  7. 選擇 .NET core 5(或 3.1 或 6 - 但您需要刪除 6.0 的 main{})
  8. 粘貼下面的代碼並編譯。
  9. 提供此應用程序(或任何其他 .Net 核心應用程序)的路徑
  10. 刮頭

簡單的測試儀:

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 上可用

從 .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 文件。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM