C#中.NET程序集的验证?

C#中.NET程序集的验证?,c#,exception,reflection,dll,C#,Exception,Reflection,Dll,如何检查加载的程序集是否为有效的.NET程序集?我当前有此代码,但非托管DLL引发BadImageFormatException string[] filepaths = Directory.GetFiles(Directory.GetCurrentDirectory(), "*.dll", SearchOption.AllDirectories); List<Type> potentialEffects = new List<Type>();

如何检查加载的程序集是否为有效的.NET程序集?我当前有此代码,但非托管DLL引发BadImageFormatException

 string[] filepaths = Directory.GetFiles(Directory.GetCurrentDirectory(), "*.dll", SearchOption.AllDirectories);
        List<Type> potentialEffects = new List<Type>();
        foreach (string filepath in filepaths)
        {
            Assembly a = Assembly.LoadFile(filepath);
            potentialEffects.AddRange(a.GetTypes());
        }
string[]filepath=Directory.GetFiles(Directory.GetCurrentDirectory(),“*.dll”,SearchOption.AllDirectories);
List potentialEffects=新列表();
foreach(文件路径中的字符串文件路径)
{
程序集a=Assembly.LoadFile(文件路径);
AddRange(a.GetTypes());
}

您可以简单地捕获此异常吗

另请参见本文:
只要抓住例外。检查比仅仅假设文件是有效程序集的成本要高得多。

异常是验证程序集的最佳方法

请记住,加载程序集时进行的不仅仅是管理器/非托管检查。可能有签名检查、平台检查(32位对64位)。这些事情也会导致抛出异常

你最好让框架完成它的工作


如果您正在加载构成外接程序系统一部分的托管代码(因此您要查看文件夹中的所有DLL),那么我建议您选择一种命名约定,或者使用一个单独的外接程序文件夹,在那里您不希望找到非托管代码。

非托管DLL不是有效的.NET程序集。尝试加载“程序集”并捕获失败时的异常。如果没有抛出异常,则可以继续执行。

如果要从C#检查它,可以添加一个Try Catch


或者,您可以使用.net framework提供的peverify.exe工具了解dll是否为有效程序集。

我看到尝试从x64 ASM加载x86 ASM时引发BadImageFormatException,反之亦然

看看这门课

将此技术包装在try/catch块中可以帮助您捕获所有类型的无效类型,不仅是.NET程序集,还有许多其他运行时冲突。

我必须检查文件是否为PE文件和托管程序集。它很容易使用:

var files = Directory.GetFiles (
    Directory.GetCurrentDirectory (),
    "*.dll", SearchOption.AllDirectories);

var potentialEffects = new List<Type> ();

foreach (var file in files) {
    if (!Image.IsAssembly (file))
        continue;

    var assembly = Assembly.LoadFile (filepath);
    potentialEffects.AddRange (assembly.GetTypes ());
}
var files=Directory.GetFiles(
Directory.GetCurrentDirectory(),
“*.dll”,SearchOption.AllDirectories);
var potentialEffects=新列表();
foreach(文件中的var文件){
如果(!Image.IsAssembly(文件))
继续;
var assembly=assembly.LoadFile(文件路径);
potentialEffects.AddRange(assembly.GetTypes());
}

值得一提的是,一个小小的基准测试表明,它在我的机器上的速度是异常Assembly.LoadFrom将触发的速度的两倍。另一方面,在有效的情况下,它会损失一些时间。因此,这是一个平均情况的时间安排问题。

请参见MSDN:

try catch很慢,我想知道是否可以使用条件StationEuclid:您正在进行微优化。与实际加载相比,抛出
BadImageFormatException
的成本微不足道。有一种方法需要P/Invoke(速度也很慢)。在MSDN博客上有一篇关于这方面的很好的文章:此外,另一种方法是解析PE格式并检查CLR头,这在性能方面也不是一个便宜的操作。与捕获BadImageFormatException相比,这是一种荒谬的开销。捕获异常既干净又简单。除非性能对您来说是一个重要的问题,否则这是一个不需要动脑筋的问题。启动peverify进程(它只随SDK提供,不随可再发行版本提供)对于这种测试来说似乎有点重:)