I have an updater program, the pulled files from server has mixed vb6 dll and .net DLLs in one directory.
How to determine if a dll is a COM one? (so i can invoke regsvr32
to it from the updater program)
I have an updater program, the pulled files from server has mixed vb6 dll and .net DLLs in one directory.
How to determine if a dll is a COM one? (so i can invoke regsvr32
to it from the updater program)
I guess one way to do it would be to try load the file with System.Reflection.Assembly.LoadFile()
(more info). If you get a BadImageFormatException
, it's not a valid .NET assembly. There's probably a neater way of doing this, but this should work.
To do this formally you could inspect the PE to find out more about what type of stuff each dll is exporting. There is a pretty interesting article on MSDN which talks about the structure. If you understand the setup, you can identify links to .Net (and thereby the lack indicating a pure COM dll).
Why not just call regsvr on all of them. If they register then ok, if not no big deal.
It is probably best though to write an installer that has the knowledge of which ones are which and does the right thing for each.
EDIT
If you are worried about "emitting errors", don't fret.
You can suppress messages. (/s)
You can turn it around and figure out all .NET assemblies very quickly by doing the following:
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);
}
With that solution you dont have to load the assembly itself, which has some advantages (speed, no exceptions).
You can simply just skip the .NET assemblies for COM registration.