我有一个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)
{
// ....
}
答案 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"));
}
};