3

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

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

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

现在我知道该ComVisible位将库设置为 ComVisible。我假设这是为了让我可以通过 Assembly Information -> Make assembly COM-Visible 使单个类 ComVisible 而不是整个库。

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

4

3 回答 3

8

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

你会说:“好吧,没问题,给它一个名字”。问题是,人们并不擅长挑选好名字。有一大群叫“汉斯”的人,我知道至少还有一个和我同名的人。住在某个地方是荷兰,不知道他是谁。

这是一个问题,与人名不同,组件名称冲突是致命的。您将加载完全错误的组件,您的程序将崩溃。所以 COM 设计者决定唯一好的解决方案是全局唯一 ID,这个数字保证在整个已知的宇宙中是唯一的,甚至更远。一个 GUID。

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

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

于 2013-08-21T12:04:11.420 回答
2

所有 COM 类(也称为 CoClass(es))和接口都由它们的 GUID(也分别称为 CLSID 和 IID)标识。CoClasses 还有一个 ProgID,这是一种友好的名称。

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

于 2013-08-21T10:15:58.700 回答
1

对于ProgId,我认为文档对其用法非常清楚:

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

此处未列出的原因是手动分配它使其在构建之间保持一致。

于 2013-08-21T10:33:14.677 回答