2009-10-28 50 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

相關問題