按类型名称获取GUID

时间:2011-02-09 21:45:19

标签: c# com interop types guid

所以我试图手动完成AxImp的工作(我正在动态地做)。

我的产品是第三方产品的广泛发布,认可的“附加”。他们有一个OCX,我使用COM引用添加到我的表单中...但是,如果客户端已经(或安装)他们产品的更新版本,我的产品将无法再加载OCX。

因此我正在尝试动态加载他们的OCX。除了我需要其中一个OCX中的一个接口的GUID之外,我已经完成了所有工作。我知道类型名称是什么,并且OCX>是<在系统上注册。如何从类型名称中获取对象的GUID?

注意,Assembly.LoadFrom()不起作用,因为OCX不是.NET它的COM。

3 个答案:

答案 0 :(得分:4)

由于您的评论让我们知道GUID在OCX中找到但未在HKEY_CLASSES_ROOT下注册,我们必须从类型库中读取它:

答案 1 :(得分:0)

不确定为什么不能简单地向项目中添加COM reference

Visual Studio会自动将.NET包装器添加到以这种方式引用的任何COM对象。

答案 2 :(得分:0)

我必须编写类似的东西来将代码从COM迁移到C#

class GetGuid
{
    [DllImport("oleaut32.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
    static extern int LoadTypeLib(string fileName, out ITypeLib typeLib);

    public string SearchRegistry(string dllPath /* or ocx */)
    {
        var result = string.Empty;
        ITypeLib tl;
        if (LoadTypeLib(dllPath, out tl) == 0)
        {
            ITypeInfo tf;
            tl.GetTypeInfo(0, out tf);

            var ip = IntPtr.Zero;
            tl.GetLibAttr(out ip);

            if (ip != IntPtr.Zero)
            {
                var ta = (System.Runtime.InteropServices.ComTypes.TYPELIBATTR)Marshal.PtrToStructure(ip, typeof(System.Runtime.InteropServices.ComTypes.TYPELIBATTR));
                result = ta.guid.ToString();
            }
        }
        return result;
    }
}