如何使用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#使用ITypeLibITypeInfo来实现。

我找到了一种使用c#读取DLL文件以获取GUID和版本信息的方法。但是,ITypeLibITypeInfo的可用文档没有任何示例。我在网上也找不到任何例子。

示例代码:

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# ITypeLib和ITypeInfo获取DLL或OCX版本信息

以下代码将在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); }
    }
  }
}