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