我有一个更新程序,从服务器拉取的文件在一个目录中混合了VB6 DLL和.NET DLL。
如何确定一个DLL是COM类型的?(这样我就可以从更新程序中调用regsvr32
)
我有一个更新程序,从服务器拉取的文件在一个目录中混合了VB6 DLL和.NET DLL。
如何确定一个DLL是COM类型的?(这样我就可以从更新程序中调用regsvr32
)
我猜想一种方法是尝试使用System.Reflection.Assembly.LoadFile()
加载文件(更多信息)。如果出现BadImageFormatException
,则不是有效的.NET程序集。可能有更好的方法来完成这个任务,但这个方法应该可行。
为什么不对它们全部调用regsvr呢?如果它们注册了,那就好了,如果没有也没关系。
不过最好的方法是编写一个安装程序,它知道哪个是哪个,并为每个正确地执行操作。
编辑
如果你担心“发出错误”,不要担心。
你可以抑制消息。(/s)
你可以通过以下方法迅速翻转并找出所有的.NET程序集:
private bool IsDotNetAssembly(string path)
{
var sb = new StringBuilder(256);
var hr = NativeMethods.GetFileVersion(path, sb, sb.Capacity, out var _);
return hr == 0;
}
private static class NativeMethods
{
[DllImport("mscoree.dll", CharSet = CharSet.Unicode)]
public static extern int GetFileVersion(string path, StringBuilder buffer, int buflen, out int written);
}
使用这种解决方案,您无需加载程序集本身,这具有一些优点(速度快,没有异常)。
您可以直接跳过.NET程序集进行COM注册。