我试图从托管调用方调用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::Calc
点cppcli::Calc
被宣布。但是,我似乎宣布managed::clsA
(例如用Object
抽象managed::ClsA
),我总是最终需要在声明的某个地方引用cppcli::Calc
。如何以声明中抽象类型的方式声明{{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);
}
}
无论如何我没有编译这个,但我认为你明白了。