簡體   English   中英

有沒有辦法通過預先分析來避免 Assembly.Load 上的 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.

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