如何在 COM 接口中将 C# 类和方法公开为 <globals>?

问题描述 投票:0回答:1

当我使用 Microsoft Office VB 编辑器时,在对象浏览器中查看,我可以看到一个部分,其中列出了一组无需使用类名或对象限定即可调用的类和方法:

它们都是 Excel.Globals 类的成员,这表明可以设置一个类级属性 - 我希望仅将一个类定义为 static 即可显示其中的任何公共静态方法,但可惜没有。

https://learn.microsoft.com/en-us/dotnet/visual-basic/programming-guide/com-interop/troubleshooting-interoperability 中,它包括“大多数 COM 对象是通过创建 COM 实例来使用的使用 New 关键字创建类,然后调用该对象的方法。此规则的一个例外涉及包含 AppObj 或 GlobalMultiUse COM 类的 COM 对象。此类类类似于 Visual Basic .NET 类中的模块级方法。Visual Basic 6.0 及早期版本隐式创建第一次调用这些对象的方法时,会为您提供此类对象的实例。例如,在 Visual Basic 6.0 中,您可以添加对 Microsoft DAO 3.6 对象库的引用并调用 DBEngine 方法,而无需先创建实例”。

我想对我自己的(C#)类做同样的事情,例如将其标记为“AppObj”或“GlobalMultiUse”,以便它出现在该部分中,从而可以从 VBA 调用,而无需先创建该类的对象(实例)?

如果 C# 做不到,Visual Basic.Net 可以吗?

我已经尝试了 C# 中静态和抽象类和接口的各种组合,并通过使程序集 ComVisible=false 来获得“干净”的 COM 类型库,并且仅将我想要公开为 ComVisible=true 的类和接口 - 但我可以'不知道是什么让它们出现在该列表中。

c# .net vba com com-interop
1个回答
0
投票

在 .Net 中,如果要导出其成员,则必须将类标记为可见:

将特定类型的属性设置为 false 会隐藏该类型及其成员。但是,如果类型不可见,则无法使该类型的成员可见。将类型的属性设置为 false 可防止将该类型导出到类型库;课程未注册;接口永远不会响应非托管 QueryInterface 调用。

在无法完成任务后无需执行编辑 IDL 等额外步骤。

© www.soinside.com 2019 - 2024. All rights reserved.