我已經在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