使用委托从C ++发送状态更新到C#?

时间:2018-02-12 14:46:10

标签: c# delegates c++-cli

我有一个C ++函数,它执行许多任务" PerformJob()"。我有一个调用PerformJob()的C#包装器。这项工作需要一段时间,我希望C ++方法能够发送"状态更新"备份到调用C#类。 C ++代码不会暴露给C#类。添加C#项目作为参考将导致循环依赖。

我试图将委托作为参数传递,但我对C ++语法不够熟悉,无法使其工作(或者甚至可能吗?)。是否有合适的方法将委托作为参数传递给C ++?有没有更好的方法来促进这种沟通?我想避免使用dllimport,因为我只需要接收这一类的更新。

CSharpClass.cs:

public delegate void CallbackDelegate(ref string status);
public CallbackDelegate jobStatusDelegate;

public void UpdateJobStatus(ref string status)
{
   Job.JobStatus = status;
}

public void StartJob()
{
   jobStatusDelegate = new CallbackDelegate(UpdateJobStatus);
   CPlusClass jobHelper = new CPlusClass();
   jobHelper.PerformJob(jobStatusDelegate);
}

CPlusClass.h:

public ref class CPlusClass
{
   public:
   void PerformJob(delegate del);   // is there c++ delegate type?
};

CPlusClass.cpp:

void CPlusClass::PerformJob(delegate del)
{
   // ....
}

1 个答案:

答案 0 :(得分:1)

C ++没有委托,但是C ++ / CLI,并且基于ref class,您的代码已经是C ++ / CLI。

代理的工作方式与其他任何引用类型非常相似,它们会被存储为^的跟踪句柄。

为了不在C#上创建一个依赖于错误方向的依赖,我建议您使用System::Action<System::String^>^而不是定义自己的委托类型。

public ref class CPlusClass
{
   public:
   void PerformJob(System::Action<System::String^>^ del)
   {
       del->Invoke(gcnew String("Hello World"));
   }
};