由托管程序集调用C ++ / CLI导致的循环依赖性

时间:2012-04-29 21:29:40

标签: c++-cli

我试图从托管调用方调用C ++ / CLI类方法。托管程序集定义了一个类,它是C ++ / CLI函数的输入类型,并通过OnPropertyChanged事件响应托管类中变量的更改。当其中一个事件更改处理程序触发时,它会调用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::clsA cppcli::Calccppcli::Calc被宣布。但是,我似乎宣布managed::clsA(例如用Object抽象managed::ClsA),我总是最终需要在声明的某个地方引用cppcli::Calc。如何以声明中抽象类型的方式声明{{1}}?

感谢。

1 个答案:

答案 0 :(得分: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);
   }
} 

无论如何我没有编译这个,但我认为你明白了。