2

如何验证 dll 是否是用 .net 编写的?我正在使用如下代码:

Assembly assembly = null;
try
{    
   foreach (string fileName in Directory.GetFiles(Environment.CurrentDirectory.ToString(), "*.dll", SearchOption.TopDirectoryOnly))
   {
     try
     {
        assembly = Assembly.LoadFrom(fileName);
        Console.WriteLine(fileName);
     }
     catch (Exception ex)
     {
       ...               
     }
     finally
     {
       ...
     }
    }              
}
catch (ReflectionTypeLoadException ex)
{
  ..              
}

当我要加载assembly = Assembly.LoadFrom(fileName)非.net dll时,会出现异常:

无法加载文件或程序集“file:///...”或其依赖项之一。该模块应包含程序集清单。

我想在 if-else 子句中使用 verify。你能帮助我吗?

4

3 回答 3

5

您可以使用 .NET 引导程序 DLL 中的辅助函数。Mscoree.dll 导出GetFileVersion(),这是一个帮助程序,它返回程序集所需的 CLR 版本。当文件不是程序集并且不会引发异常时,该函数将失败。

它应该如下所示:

using System;
using System.Text;
using System.Runtime.InteropServices;

public class Utils {
    public static bool IsNetAssembly(string path) {
        var sb = new StringBuilder(256);
        int written;
        var hr = GetFileVersion(path, sb, sb.Capacity, out written);
        return hr == 0;
    }

    [DllImport("mscoree.dll", CharSet = CharSet.Unicode)]
    private static extern int GetFileVersion(string path, StringBuilder buffer, int buflen, out int written);
}
于 2012-09-12T18:05:49.697 回答
2

您可以执行以下技巧:

try {
   Assembly assem = Assembly.LoadFile(filePath);
}
catch (BadImageFormatException e) {
      //NOT .NET ASSEMBLY
}

实际上,如果在程序集加载时收到BadImageFormatException,这意味着程序集未以 CLR 程序集方式格式化。

海因表 MSDN 链接:

动态链接库 (DLL) 或可执行程序的文件映像无效时引发的异常。

于 2012-09-12T17:32:48.290 回答
2

如果您不需要在当前域中加载程序集,我建议使用:

using System.Reflection;

  public class AssemblyName_GetAssemblyName
{
   public static void Main()
   {
      // Replace the string "MyAssembly.exe" with the name of an assembly,
      // including a path if necessary. If you do not have another assembly
      // to use, you can use whatever name you give to this assembly.
      //
     try     
     {   
            AssemblyName myAssemblyName = AssemblyName.GetAssemblyName("MyAssembly.exe");
     }       
     catch (BadImageFormatException ex)       
     {       
       ...                      
     } 
   }
}

在不抛出异常的情况下,最好的方法是解析 PE 的 OptionalImageFileHeader 并查看 CLR Header 的 DataDirectory。

目前我正在研究它,因为我有同样的问题..

于 2012-09-12T17:48:41.470 回答