当发布了 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);