如何检查 dll 是否是 .net 库"The module was expected to contain an assembly manifest."



如何验证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。你能帮我吗?

在.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);
}

您可以使用以下技巧:

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

在实践中,如果在程序集加载时收到BadImageFormatException,则意味着程序集不是以CLR程序集方式格式化的。

Hine表单MSDN链接:

当动态链接的文件映像库(DLL)或可执行程序无效。

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

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。

目前我正在处理它,因为我有同样的问题。。

相关内容

最新更新