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

在插件入口点上,它具有以下内容:
[GuidAttribute("d7066ab2-ac03-431a-bea5-b70d3efab2a5"), ProgId("OutlookPlugin"), ComVisible(true)]
现在,我知道ComVisible位将库设置为ComVisible。我以为是这样,我可以通过Assembly Information-> Make Assembly COM-Visible使单个类成为ComVisible,而不是整个库。

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

最佳答案

COM的一项重要功能是,应用程序可以要求创建类对象,COM可以选择执行该文件的可执行文件并为您加载。这需要识别组件的好方法。

你会说:“好吧,没问题,只要给它起个名字”。问题是,人们不是很擅长挑选好名字。有一个叫“Hans”的家伙的全称,我至少知道另外一个有我确切名字的家伙。住在荷兰的某个地方,不知道他是谁。

这是一个问题,与人员名称不同,组件名称冲突是致命的。您将加载完全错误的组件,并且程序将崩溃。因此,COM设计师认为唯一好的解决方案是全局唯一ID,该数字在整个已知Universe以及以后的范围内都是唯一的。 GUID。

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

但是人们并不擅长记住很长的数字。因此,有一种识别组件的备份方法,尤其是在脚本语言中使用它。以可靠的方式获得该Guid值的运行时环境并不是一件容易的事。因此,号码上仍然有一个名字。它是ProgId。您将其传递给通常称为CreateObject()的帮助器函数。它增加了一个步骤,它使用CLSIDFromProgID() helper函数将名称映射到数字,然后调用CoCreateInstance。不用说,这有时可能会出错。

10-04 12:19