读取 COM 和 OCX 组件版本信息

当发布了 COM/OCX 组件的时候,在运行时需要检测相关组件是否注册,本文整理了获取组件版本信息的方法,之后可以根据 guid 和版本信息查询组件是否注册

1. 帮助类#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;
using System.Text;

using TypeLibAttr = System.Runtime.InteropServices.ComTypes.TYPELIBATTR;
using SysKind = System.Runtime.InteropServices.ComTypes.SYSKIND;
using LibFlags = System.Runtime.InteropServices.ComTypes.LIBFLAGS;

namespace XxxNamespace
{
    public class InteropHelper
    {
        // 导入函数
        [DllImport("oleaut32.dll", PreserveSig = false)]
        public static extern ITypeLib LoadTypeLib([In, MarshalAs(UnmanagedType.LPWStr)] string typelib);

        public static TypeLibAttribute GetTypeLibAttr(string typelib)
        {
            // 使用
            var lib = LoadTypeLib(typelib);

            IntPtr attr;
            lib.GetLibAttr(out attr);

            TypeLibAttr att = (TypeLibAttr)Marshal.PtrToStructure(attr, typeof(TypeLibAttr));

            var attribute = att.Clone();

            lib.ReleaseTLibAttr(attr);

            return attribute;
        }
    }

    public struct TypeLibAttribute
    {
        public Guid Guid { get; set; }
        public int Lcid { get; set; }
        public SysKind SysKind { get; set; }
        public LibFlags LibFlags { get; set; }
        public short MajorVersion { get; set; }
        public short MinorVersion { get; set; }
    }

    public static class TypeLibExtensions
    {
        public static TypeLibAttribute Clone(this TypeLibAttr attr)
        {
            return new TypeLibAttribute
            {
                Guid = new Guid(attr.guid.ToByteArray()),
                Lcid = attr.lcid,
                LibFlags = attr.wLibFlags,
                MajorVersion = attr.wMajorVerNum,
                MinorVersion = attr.wMinorVerNum,
                SysKind = attr.syskind
            };
        }
    }
}

2. 测试代码#

// 导入函数
[DllImport("oleaut32.dll", PreserveSig = false)]
public static extern ITypeLib LoadTypeLib([In, MarshalAs(UnmanagedType.LPWStr)] string typelib);

// 使用
var lib = LoadTypeLib(dll);

// Marshal 也封装了相关的函数
Guid guid = Marshal.GetTypeLibGuid(lib);

❤️ 如果这篇文章对你有帮助,欢迎赞助支持我继续维护 ❤️

☕ Support me ⚡ 爱发电赞助