2009-10-28 42 views
0

我已经在C#中实现了一个COM服务器,它有一个vb6客户端。C# - 写一个COM服务器 - 事件不在客户端上触发

当要激发我的事件时,处理程序始终为空 - 看起来vb6应用程序从不订阅我的事件。

vb6应用程序是一个现有的第三方应用程序,似乎不给出任何错误消息。

普通方法在COM客户端 - >服务器上工作得很好。

有什么我可以做的,以调试是怎么回事?或者为什么我的活动不起作用?

这里是我的代码一个简单的例子片段:

[ComVisible(true), 
     Guid(Constants.CLASS_IID), 
     ProgId(Constants.PROG_ID), 
     ClassInterface(ClassInterfaceType.None), 
     ComSourceInterfaces(typeof(IMyServiceEvents))] 
    public class MyClass : Control, IMyService, IMyServiceEvents 
    { 
     [DispId(1)] 
     public event MyEventHandler MyEvent; 

     //... also implements IMyService, which is working 
    } 

    [ComVisible(true), 
     InterfaceType(ComInterfaceType.InterfaceIsIDispatch), 
     Guid(Constants.EVENTS_IID)] 
    public interface IMyServiceEvents 
    { 
     [PreserveSig, DispId(1)] 
     void MyEvent([In]int Status); 
    } 

    [ComVisible(false)] 
    public delegate void MyEventHandler(int Status); 

如果我尝试,我试图取代现有的OCX文件/我的C#COM服务器实现,事件照常上班。它也是用vb6写的,所以我的C#服务器中的某些东西一定是错的。

我还想补充一点,我尝试了ClassInterfaceType的所有3个设置,并得到了相同的结果 - 虽然我不得不为每次尝试重新注册我的COM服务器。看看我生成的IDL,它看起来对我来说是正确的,并且一切似乎都与我试图重新创建的原始IDL非常相似,如果需要,我可以发布。

更新:嗯,我拿出旧的Visual Studio 6,并做了一个VB6应用程序来测试我的C#COM服务器,它工作正常。

所以我带了一个免费的vb6反编译器,它可以将反编译后的代码输出到vb6项目中,并在我想要加载我的COM服务器的第三方应用程序上运行它 - 并且看不到它。

我注意到他们的应用程序正在使用我的COM服务器作为设计者的控件,而我的测试程序只是以WithEvents的形式声明了一个成员变量。设计师是否在幕后发生了这样的事情?我怎样才能使我的COM服务器ActiveX兼容?我还注意到VB6 IDE不会让我将C#com服务器作为控件添加到工具箱中。

回答

1

我被控制,而不是用户控件派生,我看到了实现在把我带到这个C#ActiveX控件的一个例子。

显然用户控件实现了一些界面,使这项工作正确...谁知道...

1

我依稀记得自己有这个错误,就像运行时不知道如何将COM注册映射到事件。

我回头看看我做了什么,我可以看到的唯一区别是委托定义是在我的COM类中,我也看到发生在这example

因此,尝试移动MyClass的内部的一个MyEventHandler如下:

[ComVisible(true), 
     Guid(Constants.CLASS_IID), 
     ProgId(Constants.PROG_ID), 
     ClassInterface(ClassInterfaceType.None), 
     ComSourceInterfaces(typeof(IMyServiceEvents))] 
    public class MyClass : Control, IMyService, IMyServiceEvents 
    { 
     [ComVisible(false)] 
     public delegate void MyEventHandler(int Status); 

     [DispId(1)] 
     public event MyEventHandler MyEvent; 



     //... also implements IMyService, which is working 
    } 

    [ComVisible(true), 
     InterfaceType(ComInterfaceType.InterfaceIsIDispatch), 
     Guid(Constants.EVENTS_IID)] 
    public interface IMyServiceEvents 
    { 
     [PreserveSig, DispId(1)] 
     void MyEvent([In]int Status); 
    } 
+0

好的尝试,但它没有奏效。我想知道他们的VB6代码是否做了不正确的事情,不允许.NET CCW处理事件。我也尝试了几件事,添加一个snk,并将该程序集放入GAC中,并使用regasm/codebase,但似乎没有任何效果。但是,标准方法工作得很好。 – jonathanpeppers 2009-10-28 19:19:50

0

你可能已经忘了补充 [装配:GUID(“...”)] 到您的项目,这意味着每次您重新编译C#项目时,COM中的TypeLib ID都会更改。

没有该属性,编译器将产生一个不同的类型库,但是一些COM函数没有匹配库标识符。

+0

这是很早以前的事了。但我不认为这是问题。 – jonathanpeppers 2016-08-31 17:57:21

相关问题