![](/img/trans.png)
[英]Does 'System.Reflection.Assembly.LoadFrom' modify the native DLL search order?
[英]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 位的混合。
使用簡單測試器應用程序重現的步驟(如下):
簡單的測試儀:
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.