我在 C# 4.0 中编写了一个 COM 可见的类库,我正在使用 VB6。事情有效,只有当我打开 VB6对象浏览器并查看暴露的成员时,我才会看到每个暴露成员的事件......但 C# 代码没有定义它们中的任何一个。
这是正常的吗?难道我做错了什么?
[ClassInterface(ClassInterfaceType.None)]
[ComSourceInterfaces(typeof(IMyClass))]
public class MyClass : IMyClass
{
public void DoSomething(string someParam)
{
...
}
}
public interface IMyClass
{
void DoSomething(string someParam);
}
该程序集使用强名称密钥签名并设置AssemblyInfo.cs
了[assembly: ComVisible(true)]
属性,但我不确定它与问题有什么关系。
当我查看 VB6 中的对象浏览器时,我希望看到DoSomething(string)
的成员MyClass
,我确实看到了,但是我也看到每个公开的方法都有一个匹配签名的事件,比如Event DoSomething(someParam As String)
作为MyClass
.
更令人费解的是(至少对我而言),属性也有一个“匹配”事件(虽然只能从小闪电图标中看出)——如果MyClass
定义了这样的属性:
public string SomeProperty { get; set; }
VB6 对象浏览器会说“事件”被定义为Property SomeProperty As String
,这让我大吃一惊——“属性”是如何 1) 被复制的,以及 2) 复制品如何在对象浏览器中以“事件”图标显示?这同样适用于 get-only 属性,它们具有只读的“属性/事件”对应项。
这些事件来自哪里,我该如何摆脱它们?
更新一张图片值一千字:
UPDATE错误的事情是ComSourceInterfaces
错误地被用来代替属性的ComDefaultInterface
属性。将前者换成后者给出了预期的结果: