繁体   English   中英

通过类型名称获取GUID

[英]Get A GUID by Type Name

因此,我正在尝试手动执行AxImp的操作(我正在动态执行)。

我的产品是第三方产品中广泛认可的“附加产品”。 他们有一个OCX,我通过COM参考将其添加到表单中...但是,如果客户端具有(或安装)其产品的更新版本,则我的产品将无法再加载OCX。

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

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

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

我必须写类似的东西才能将代码从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;
    }
}

不知道为什么不能简单地将对DLL的COM引用添加到项目中。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM