C#中.NET程序集的验证?
如何检查加载的程序集是否为有效的.NET程序集?我当前有此代码,但非托管DLL引发BadImageFormatExceptionC#中.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>();
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提供,不随可再发行版本提供)对于这种测试来说似乎有点重:)