【发布时间】:2016-03-27 10:44:25
【问题描述】:
我在 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 的成员,我确实这样做了,但是我也是 /em> 为每个公开的方法看到一个具有匹配签名的事件,例如 Event DoSomething(someParam As String) 作为 MyClass 的成员。
更令人费解的是(至少对我而言),属性也有一个“匹配”事件(虽然只能从小闪电图标看出)——如果MyClass 定义了这样的属性:
public string SomeProperty { get; set; }
VB6 对象浏览器会说“事件”被定义为Property SomeProperty As String,这让我大吃一惊——“属性”是如何 1) 被复制的,2) 复制品如何在对象浏览器?这同样适用于 get-only 属性,它们具有只读的“属性/事件”对应项。
这些事件是从哪里来的?如何消除它们?
更新一张图片值一千字:
更新错误是ComSourceInterfaces 属性被错误地用来代替ComDefaultInterface 属性。将前者换成后者会得到预期的结果:
【问题讨论】:
-
鉴于这本质上是一个错字,我将投票关闭它,因为它过于本地化。我建议删除它。
-
@Deanna 确实错字了,但我确实学到了一些关于将事件暴露给 COM 的知识。我想你是对的,肯定有很多关于将 .net 事件暴露给 COM 的帖子......除了这里有两个高质量的帖子不应该被删除:)
-
@Deanna 我认为我们不应该删除它。这是一个错字,但它可能会使其他 COM 互操作新手感到困惑。我也从中学到了一些东西。
-
@MarkJ 你们都说得很好:)
标签: c# vb6 com-interop