通过COM访问静态属性

5

是否可以在不创建对象实例的情况下访问COM对象的静态属性?

我的情况是这样的:我有一个非托管应用程序(用Delphi编写)。该应用程序公开了基于COM的插件接口。到目前为止,我只编写了使用C#编写的托管插件。插件通过返回实现IPluginInfo的PluginInfo实例的静态属性来提供其信息(名称、作者等)。我可以使用http://managedvcl.com在托管插件上访问此静态属性。

现在我想在同一接口上编写非托管插件。我可以使用以下方式加载它们:

plug := CreateComObject(TGuid) as IMyPlugInterface;

他们在运行,但我不知道如何读取他们的PluginInfo。

所以问题又来了:除了在插件类中实现IPluginInfo并在创建插件实例后仅访问信息之外,还有其他方法吗?


3
我很确定COM没有“COM对象的静态属性”这样的概念,所以你整个前提都是有缺陷的。你不能访问不存在的东西。如果你在C#类上访问静态属性,那没问题,但这不是COM。 - Rob Kennedy
可能是如何在COM互操作中调用.NET对象上的静态方法?的重复问题。 - StayOnTarget
2个回答

2

虽然它可能不像你习惯使用的C#插件体系结构提供的静态属性那样“优雅”,但是你可以在COM DLL中提供一个导出函数,该函数返回一个IPluginInfo。按照惯例,每个设计用于在您的体系结构中运行的插件DLL都将具有相同的导出函数名称。

主机应用程序将在运行时动态获取导出函数的过程地址,然后调用它以获取该特定插件DLL的IPluginInfo接口对象。所有这些机制都可以封装在一个类中,用于您的插件架构,隐藏实现细节。

只需要很少的工作,您的插件架构就可以达到与您更熟悉的C#基础架构一样方便使用和编码的程度。


1
不可以。Delphi的接口是在对象实例上基本上实现为虚方法,并且据我所知无法接受静态成员。尽管这可能会使其更加实用。

2
这里的限制因素肯定不是 Delphi 接口本身,而是 COM。在这种程度上,Delphi 接口主要是为了与 COM 一起使用而设计的,因此反映了 COM 的特性,但将 C# 插件架构与任何 COM 插件架构进行比较都会产生许多类似的差异。 - Deltics

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接