如何使用c# ITypeLib和ITypeInfo获取DLL或OCX版本信息
本文关键字:DLL OCX 版本 信息 获取 ITypeInfo 何使用 ITypeLib | 更新日期: 2023-09-27 18:11:39
在大多数情况下,VB6 dll和ocx必须在使用前注册。在Visual Basic Project (VBP)文件中,引用的对象如下所示:
Object={70031B70-1070-0D70-AC0E-B049A0701010}#1.0#0; Component.ocx
Reference=*'G{000CD090-0D00-4F07-0707-80040E010704}#1.0#0#..'References'GeneralLibrary.dll#General Purpose Libraries
当这些文件更新时,我需要更改我的VB6项目中的所有引用。由于VBP文件只是文本文件,因此可以使用文本解析更新这些引用。需要注意的是,我需要提前知道每个组件和版本的guid。
经过一番搜索,我发现Windows中的oleaut32.dll
库可以用来从DLL中收集信息。这可以通过c#使用ITypeLib
和ITypeInfo
来实现。
我找到了一种使用c#读取DLL文件以获取GUID和版本信息的方法。但是,ITypeLib
和ITypeInfo
的可用文档没有任何示例。我在网上也找不到任何例子。
示例代码:
class Program
{
[DllImport("oleaut32.dll", PreserveSig=false)]
public static extern ITypeLib LoadTypeLib([In, MarshalAs(UnmanagedType.LPWStr)] string typelib);
static void Main(string[] args)
{
ITypeLib dllLibrary;
ITypeInfo information;
dllLibrary = LoadTypeLib("C:''common_files''Common.dll");
dllLibrary.GetTypeInfo(0, out information);
Console.ReadLine();
}
}
如何使用ITypeLib和ITypeInfo来获取DLL或OCX的GUID和版本信息?
警告:由于我们系统的部署方式和注册表中有许多同名的旧DLL构件的事实,我希望避免注册DLL,然后从注册表中读取已注册的内容。
我也无法找到用于获取此问题中所述版本信息的DLL。
以下代码将在c#中加载tlb -我没有尝试过带有嵌入式tlb的DLL或OCX,但它可能适用于这些。如果没有,您需要从嵌入的资源中提取tlb(耶!更多的PInvoke),然后直接在tlb上运行。这是一个完整的命令行应用程序-你可以复制并粘贴到一个新的源文件,并在命令行上编译和测试。
using System;
using System.Runtime.InteropServices;
using System.Diagnostics;
public class TypeLibTest
{
[DllImport("oleaut32.dll", CharSet = CharSet.Unicode, ExactSpelling = true, PreserveSig = false)]
private static extern IntPtr LoadTypeLib(string fileName, out System.Runtime.InteropServices.ComTypes.ITypeLib typeLib);
public static void Main(string[] args)
{
System.Runtime.InteropServices.ComTypes.ITypeLib typeLib = null;
IntPtr ptr = IntPtr.Zero;
string file = arg[0];
try
{
LoadTypeLib(file, out typeLib);
typeLib.GetLibAttr(out ptr);
var typeAttr = (System.Runtime.InteropServices.ComTypes.TYPELIBATTR) Marshal.PtrToStructure(ptr, typeof(System.Runtime.InteropServices.ComTypes.TYPELIBATTR));
Console.WriteLine("{0}.{1}", typeAttr.wMajorVerNum, typeAttr.wMinorVerNum);
}
catch (COMException ex)
{
Console.WriteLine("Error: " + ex.Message);
}
finally
{
if (typeLib != null && ptr != IntPtr.Zero)
{ typeLib.ReleaseTLibAttr(ptr); }
}
}
}