1

我正在尝试从托管调用者调用 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::clsAcppcli::Calc声明时知道。似乎无论我如何声明(例如用cppcli::Calc抽象),我最终总是需要对声明中某处的引用。如何以在声明中抽象类型的方式声明?managed::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 回答