1

管理対象呼び出し元から C++/CLI クラス メソッドを呼び出そうとしています。マネージド アセンブリは、C++/CLI 関数への入力型であるクラスを定義し、OnPropertyChanged イベントを介してマネージド クラスの変数への変更に応答します。イベント変更ハンドラーの 1 つが起動すると、C++/CLI を呼び出してデータを渡します。

C#:

namespace managedA
{
    class clsA
    {
        //The rest of clsA defined elsewhere
        partial void initialise()
        {
            this.PropertyChanged += delegate(object o, System.ComponentModel.PropertyChangedEventArgs args)
            {
                if (args.PropertyName == "myvar")
                {
                    CalcMyVar();
                }
            }
        }

        void CalcMyVar()
        {
            cppcli::Calc _calc = new cppcli::Calc();
            _calc.DoSomething(this);
        }
    }
}

C++/CLI:

namespace cppcli
{
public ref class Calc       
    {
    public:

        managed::clsA ^ DoSomething(managed::clsA ^ input)
        {
            ...
        }
    }
}

私が抱えている問題は、C++/CLI を介したマネージ呼び出し元自体の循環依存関係が原因です。呼び出し先が継承する中間プロジェクトでインターフェイス クラスを宣言しようとしましたが、宣言された時点で(cppcli:Calc)中間プロジェクトが常に知る必要があるため、これは機能しませんでした。どのように宣言しても(たとえば、 で抽象化) 、最終的には宣言のどこかへの参照が常に必要になるようです。宣言で型が抽象化されるように宣言するにはどうすればよいですか?managed::clsAcppcli::Calccppcli::Calcmanaged::clsAObjectmanaged::ClsAcppcli::Calc

ありがとう。

4

1 に答える 1

2

明確にするために、C++/CLI をアンマネージド、アプリの他の部分をマネージドとは呼びません。具体的にはすべての C++/CLI コードがマネージドであるためです。使用するネイティブ C++ コードのみがアンマネージされます。少なくとも私はそう理解しています。

とにかく、アプリケーションの C++/CLI 部分がユーティリティのように機能している場合は、C++/CLI 部分で基本クラスを宣言することをお勧めします。これは、アプリケーションで継承する (「マネージド」と呼ぶ) 部分です。あなたのソフトウェアの。このように、アプリケーション部分には C++/CLI 部分が含まれて継承されますが、C++/CLI 部分はアプリケーション層を認識する必要はありません。テストされていない例を挙げるには:

C++/CLI コード

public ref class base
{
public:
   int a;
};

public ref class Calc
{
public:
   static void DoSomething(base^ p_base)
   {
      p_base.a = 5;
   }
}

アプリケーション層

//Include your C++/CLI code
public ref class app_class : public base
{
   void do_something()
   {
      Calc::DoSomething(this);
   }
} 

とにかく、私はこれをコンパイルしませんでしたが、あなたはその考えを理解していると思います.

于 2012-05-03T19:41:45.010 に答える