1

IDLライブラリで定義されたインターフェイスを実装するC#で記述された基本クラスがあります。このクラスの単一インスタンスを管理するC++クラスがあります。このクラスを利用する必要のあるC#プロジェクトもあります[インスタンス(C ++プロジェクトから取得)]。基本クラスが実装するCOMインターフェイスをC#基本クラスにキャストし直したいと思います。

ただし、C ++プロポーションから取得した汎用オブジェクトをC#基本クラスにキャストすると、エラーが発生しました。派生インターフェースにキャストしても問題ありません。

以下は私の問題の同様の例です。CSDriverのNETBaseInstance関数で2つのifスコープが評価されることはありません。NETBaseは、COMInterfaceを実装する唯一のクラスです。したがって、COMInterfaceのifスコープが評価されるため、値がNETBaseであることは確かです。

public class NETBase : COMInterface{ ... }

public class CSDriver{
    private NETBase m_NETBaseInstance;

    ...

    public object NETBaseInstance{
        set{
            COMInterface test;
                if( value is COMInterface ){
                // This is evaluated.
                test = value as COMInterface;
            }

            if( value is NETBase ){
                // This is not evaluated.
                m_NETBaseInstance = value as NETBase;
            }

            if( test is NETBase ){
                // This is not evaluated.
                m_NETBaseInstance = test as NETBase;
            }
        }
    }
}

このCOMオブジェクトをC#オブジェクトに正常にキャストするプロセスは何ですか?私は何か間違ったことをしていますか?

よろしくお願いします。

4

1 に答える 1

1

直接キャストする方法はありません。

COMInterfaceアンマネージC++APIは、インターフェイスvtableへのポインターを返しています。NETBaseがこのインターフェイスの唯一の実装であることを知っていると思うかもしれませんが、.NET COM相互運用インフラストラクチャにはそのような知識がありません(実際、COMInterfaceアンマネージコードが処理する実装はCOM呼び出し可能であるため、厳密に言えば間違っています) NETBaseのインスタンスではなく、相互運用インフラストラクチャによって作成されたラッパー。C#からC ++ APIを呼び出す場合、.NET相互運用レイヤーで実行できるのは、マネージコードをアンマネージCOMインターフェイスの周りにRuntime Callable Wrapperに渡すことだけです。このRCWはのインスタンスではないNETBaseため、にキャストすることはできませんNETBase。見つけました。

特定のインスタンスCOMInterfaceを指している必要があるという特別な知識を利用して、必要なことを実行するための回避策がある場合があります。NETBase詳細は、その性質NETBase(たとえば、その状態をシリアル化可能)と、すべてのマネージコードが同じAppDomainで実行されるかどうか(たとえば、そうであれば、NETBaseクラスに静的フィールドとメソッドを提供して許可できる場合があります)によって異なります。あなたの質問が示唆するように、それが本当にシングルトンである場合、インスタンスとのランデブーはCOMInterface-些細なことを指します)。

于 2012-09-24T10:37:30.073 に答える