所以我们正在为Windows应用商店开发新的应用程序,我们在应用程序的C++/CX部分使用DirectX,在其他部分使用C#。由于我们需要某种通信,我们在共享库(C#)中创建了接口,并在项目的C#端实现了该接口。然后,我们将该类的实例传递给C++。当C++需要与C#通信时,它从共享接口调用方法,而C#执行类中实现的内容。
当C++从另一个线程调用方法而不是将对象传递给它时,就会出现问题。错误:
The application called an interface that was marshalled for a different thread.
以下是它的工作原理:
C# instance of shared interface (some class)
C# -> C++ \/ passed in parameter of public C++ method
C++ saves to variable
C++ creates new thread
C++ calls instance->SayHello();
C# exception
共享接口:(C#)
public interface IUserMessageService
{
void WriteMessage(string message, MessageTypes type);
}
实现:(C#)
public sealed class UserMessageService : IUserMessageService
{ ... }
赋值方法(C++)
void AssignUserMessageService(...::IUserMessageService ^service) { m_service = service; }
然后我打电话
AssignUserMessageService
具有的实例
UserMessageService
来自UI线程。调用时尝试访问C++传递的数据时出错
WriteMessage
在另一个线程中。
有没有其他方法可以传递实例或调用方法?