如何验证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。
目前我正在处理它,因为我有同样的问题。。