GuidAttribute& ProgId,它们适用于什么?

时间:2013-08-21 10:03:44

标签: .net com guid progid

所以我正在使用NetOffice创建一个outlook插件。

在插件入口点上它有这样的东西:

[GuidAttribute("d7066ab2-ac03-431a-bea5-b70d3efab2a5"), ProgId("OutlookPlugin"), ComVisible(true)]

现在我明白了ComVisible位将库设置为ComVisible。我认为这样我可以通过装配信息制作单个类ComVisible而不是整个库 - >使组件COM-Visible。

但我不明白GuidAttributeProgId的用途是什么?

3 个答案:

答案 0 :(得分:6)

COM的一个重要特性是应用程序可以请求创建类对象,COM可以调出可执行文件的实现并为您加载它。这需要一种很好的方法来识别组件。

你会说:“好吧,不是问题,只要给它一个名字”。问题是,人们不擅长挑选好名字。有一个叫做“汉斯”的家伙,我知道至少还有一个人有我的名字。生活在某个地方的是荷兰,不知道他是谁。

这是一个问题,与人名不同,组件名称冲突是致命的。您将加载完全错误的组件,您的程序将崩溃。因此,COM设计人员认为唯一的好解决方案是全球唯一ID,这个数字在整个已知的宇宙中都是独一无二的。 GUID。

COM应用程序使用该编号来请求创建对象。底层的api函数是CoCreateInstance,第一个参数是CLSID,它是标识类的guid。

然而,人们不太善于记住很长的数字。因此,有一种识别组件的备份方法,特别是在脚本语言中使用它。这种运行时环境以可靠的方式获取guid值并不容易。所以这个号码还附有一个名字。这是ProgId。您将它传递给一个通常名为CreateObject()的辅助函数。它做了一个额外的步骤,它使用CLSIDFromProgID()辅助函数将名称映射到数字,然后调用CoCreateInstance。不用说,这有时也会出错。

答案 1 :(得分:2)

所有COM类 - 也称为CoClass - 和接口由其GUID(也分别称为CLSID和IID)标识。 CoClasses还有一个友好名称的ProgID。

当注册COM组件或COM-Visible程序集(分别使用RegSvr32.exe或RegAsm.exe)时,所有这些都存储在注册表中,并相互引用。

答案 2 :(得分:1)

对于ProgId,我认为文档的用法非常明确:

  

通过将命名空间与类型名称组合,可以为类自动生成ProgID。这可能会产生无效的ProgID,因为ProgID限制为39个字符,并且除了句点之外不能包含标点符号。在这种情况下,可以使用ProgIdAttribute手动将ProgID分配给类。

此处未列出的原因是手动分配它使其在构建中一致