[英]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
下注册,因此我们必须从类型库中读取它:
调用LoadTypeLib
或LoadTypeLibEx
,将路径传递到.OCX文件
然后使用返回对象的FindName
方法。
然后是GetTypeAttr
然后是PtrToStructure
,以使用GUID获得TYPEATTR
结构。
我必须写类似的东西才能将代码从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.