C++ cli 托管程序集调用C++/CLI

C++ cli 托管程序集调用C++/CLI,c++-cli,C++ Cli,我试图从托管调用方调用C++/CLI类方法。托管程序集定义一个类,该类是C++/CLI函数的输入类型,并通过OnPropertyChanged事件响应托管类中变量的更改。当其中一个事件更改处理程序触发时,它将调用传递数据的C++/CLI C#: C++/CLI: namespace cppcli { public ref class Calc { public: managed::clsA ^ DoSomething(managed::clsA ^

我试图从托管调用方调用C++/CLI类方法。托管程序集定义一个类,该类是C++/CLI函数的输入类型,并通过OnPropertyChanged事件响应托管类中变量的更改。当其中一个事件更改处理程序触发时,它将调用传递数据的C++/CLI

C#:

C++/CLI:

namespace cppcli
{
public ref class Calc       
    {
    public:

        managed::clsA ^ DoSomething(managed::clsA ^ input)
        {
            ...
        }
    }
}
我遇到的问题是由托管调用者通过C++/CLI对自身的循环依赖性引起的。我曾尝试在被调用方
(cppcli:Calc)
继承的中间项目中声明一个接口类,但这不起作用,因为中间项目在声明
cppcli::Calc
时总是需要了解
managed::clsA
。似乎无论我如何声明
cppcli::Calc
(例如,使用
Object
抽象
managed::clsA
),我最终总是需要在声明中的某个地方引用
managed::clsA
。如何声明
cppcli::Calc
,使类型在声明中抽象


谢谢。

为了清楚起见,我不会将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);
   }
} 

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

你必须自下而上工作。并在C++/CLI代码中声明一个接口类,该类声明一个C#代码可以实现的接口。DoSomething()如何返回对接口具体实例的引用是您必须考虑的问题。那真的不行,谢谢你。我将尝试一下,并让您知道我是如何开始的。最后,我在C++/CLI中创建了一个中间类,它充当原始C++/CLI类(
managed::clsA
)中定义的类型实例的容器。这样,应用程序依赖于中间类并从中请求业务对象实例(
class-Calc
在最初的文章中)而不必直接依赖于业务层。这是通过注册业务类的类型并使用反射创建这些类型的实例来实现的(
ConstructorInfo
)。
//Include your C++/CLI code
public ref class app_class : public base
{
   void do_something()
   {
      Calc::DoSomething(this);
   }
}