2

Swig を使用して C++ コードをラップする場合、 を使用してネイティブ C++ 型にメソッドを追加できます%extend。を使用して、C# ラッパー クラスにメソッドを追加することができ%typemap(cscode)ます。

メソッドがラッパー クラスに既に存在する場合、追加のコード行を追加する方法はありますか?

たとえば、私の C# ラッパー メソッドは次のようになります。

  public void ItemChanged(CollectionObject collectionObject, string propertyName) {
    mynamespacePINVOKE.mynamespace_DataObjectCollection_ItemChanged(swigCPtr, CollectionObject.getCPtr(collectionObject), propertyName);
    if (mynamespacePINVOKE.SWIGPendingException.Pending) throw mynamespacePINVOKE.SWIGPendingException.Retrieve();
  }

次のコード行を追加したいと思います。

  public void ItemChanged(CollectionObject collectionObject, string propertyName) {
    mynamespacePINVOKE.mynamespace_DataObjectCollection_ItemChanged(swigCPtr, CollectionObject.getCPtr(collectionObject), propertyName);
    if (mynamespacePINVOKE.SWIGPendingException.Pending) throw mynamespacePINVOKE.SWIGPendingException.Retrieve();
    **insert my line of code here**
  }
4

1 に答える 1

2

独自のバージョンを作成するには、デフォルトのバージョンと衝突しないようにする必要があります。これを行う最も簡単な方法は、を使用してプライベートItemChanged/保護を作成し、生成されるデフォルトのラップされたバージョンを非表示にすることだと思います。隠されたら。%csmethodmodifiers%rename

ItemChanged次に、最初にプライベートバージョンを呼び出し、次に必要に応じて追加のコードを呼び出すcscodeタイプマップを使用して、独自のバージョンを安全に作成できます。

これは、問題を解決するための最もクリーンな方法です。生成されたコードにコードを直接挿入できる唯一の方法は、引数/戻り値のマーシャリングの一部としてです。渡される引数を設定し、後でクリーンアップします。または戻り値の処理。これらのタイプマップの1つをいじってコードを挿入するのは、かなり面倒です。

于 2012-07-02T16:17:05.913 に答える