【问题标题】:How to use C# ITypeLib and ITypeInfo to obtain DLL or OCX version information如何使用 C# ITypeLib 和 ITypeInfo 获取 DLL 或 OCX 版本信息
【发布时间】:2015-12-04 07:15:30
【问题描述】:

在大多数情况下,VB6 DLL 和 OCX 必须在使用前进行注册。在 Visual Basic 项目 (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,如 this question 中所述。

【问题讨论】:

    标签: c# dll vb6


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-19
      • 2019-05-02
      • 2011-02-06
      • 1970-01-01
      • 2011-10-05
      • 1970-01-01
      • 2014-08-21
      • 1970-01-01
      相关资源
      最近更新 更多