[英]CodeDom + Assembly.Load throws a BadImageFormatException
[英]Is there a way to avoid BadImageFormatException on Assembly.Load by pre-analyzing
我有一個應用程序,它將用戶放入一個特殊目錄的所有 .dll 加載。 如果它們創建錯誤 (x86,x64) 或其他內容,則會引發 BadImageFormatException。 沒關系,但我不喜歡避免例外。 所以問題是:
有沒有辦法提前分析文件以避免異常?
主要目標是避免異常。 如果它可以工作,也可以得到一個布爾值。
當前代碼:
private Assembly TryLoadAssmbly(string file)
{
Assembly result;
try
{
result = Assembly.LoadFile(file);
}
catch (BadImageFormatException exc)
{
Log.Error($"File \"{file}\" could not be loaded");
result = null;
}
return result;
}
我不確定這是否值得努力,但您可以使用PEReader
:
static bool IsLoadableManagedAssembly(string assemblyPath) {
using var reader = new PEReader(new StreamReader(assemblyPath));
...
}
首先排除沒有元數據的文件,它們肯定不是程序集:
if (!reader.HasMetadata)
return false;
現在您可以檢查它是 32 位還是 64 位......事情變得更復雜了。 有一個不錯的reader.PEHeaders.PEHeader.Magic
可用於檢查文件是否僅為 64 位: PEMagic.PE32Plus
(如果您的應用程序僅為 32 位,您可以在此處停止。
還在讀書? 然后你的目標是任何 CPU或 X64。 你在 COFF object 中有這個:
bool mightBe64 = reader.PEHeaders.CoffHeader.Machine == Machine.IA64
|| reader.PEHeaders.CoffHeader.Machine == Machine.Unknown;
if (Environment.Is64BitProcess != mightBe64)
return false;
現在我們可以處理任何具有“所需 32 位”的 CPU :
bool requires32 = reader.PEHeaders.CorHeader.Flags.HasFlag(CorFlags.Requires32Bit);
if (Environment.Is64BitProcess && requires32)
return false;
請注意,您也可以(應該?)將CorFlags.ILOnly
用於Any CPU 。
CoffHeader.Characteristics
中還有一個Characteristics.Bit32Machine
但我不確定是否有任何尚未涵蓋的內容。
最重要的是......您仍然需要處理BadImageFormatException
因為文件可能無效或者我們在這里遺漏了其他內容。
您是否考慮過緩存搜索結果,以便在第一次之后無需“嘗試”加載它們?
參考:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.