2

VB6 プログラムから使用している COM Callable Wrapper がありますが、CCW が登録されていない限り、プログラムは COM イベントを受信しません。それ以外の場合、CCW は正常に動作します。プログラムのマニフェスト ファイルを削除し、「regasm /tlb /codebase theccw.dll」を使用して CCW を登録するまで、イベントは発生しません。これは WinXP SP3 にあります。

何が問題なのですか?

私のCCWは、「初期バインド」VB6オブジェクトとして使用するには間違って構築されている可能性があります。ここに私の宣言があります:

[ComVisible(false)]
public delegate void AnEventDelegate(int arg1);

[
ComVisible(true),
GuidAttribute("XXXX-XXXX-XXXX-XXXX"),
InterfaceType(ComInterfaceType.InterfaceIsIDispatch)
]
public interface IComEvents
{
    void AnEvent(int arg1);
}

[
ComVisible(true),
Guid("YYYY-YYYY-YYYY-YYYY"),
ClassInterface(ClassInterfaceType.None), 
ComSourceInterfaces(typeof(IComEvents))
]
public class TheComClass: IComContract
{
    public TheComClass(){}

    // Implicit implementation of IComContract.
    // Implicit implementation of IComEvents.
    // 
    // eg. public event AnEventDelegate AnEvent;
}

[
ComVisible(true),
Guid("ZZZZ-ZZZZ-ZZZZ-ZZZZ")
]
public interface IComContract
{
    [ComVisible(true)]
    string AProp{ get; set; }

    [ComVisible(true)]
    void AMethod();
}

ひとつ、わかったことがあります。TheComClass 内のパブリック イベント宣言に [ComVisible(true)] 属性がありません。物事が登録されたときにイベントを取得するので、それは問題ではないと思いますが、わかります...

4

3 に答える 3

1

私は同じ問題を抱えていて、それを修正する方法を考え出しました。

クラスを System.Windows.Forms.UserControl から派生させます。

登録不要の COM でも、VB6 のイベントを使用する C# で記述された COM サーバーを取得しました。

どうやら UserControl は、場合によっては必要な IOleObject を実装しているようです。

于 2009-11-06T21:37:39.270 に答える
1

COM イベントでは、事前にバインドされていません。.NET のイベントはデリゲートの特殊な使用法であり、最終的には単なる関数呼び出しであるのに対し、COM イベントはより複雑です。

イベントが機能するには、コンポーネントを登録する必要があります。

于 2009-01-15T08:44:07.530 に答える
1

私が見つけた唯一の答えは、これは機能せず、CCW を登録する必要があるということです。

于 2010-03-12T17:11:21.593 に答える