我有一个工作的非托管C ++ DLL,它使用p / invoke附加到我的C#代码
[DllImport("p2p.dll", EntryPoint = "Start")]
public static extern void Start();
[STAThread]
static void Main()
{
Thread th= new Thread(Start);
th.Start();
....
这样我可以从我的C ++代码中检索信息,但是如果我的C ++代码需要触发C#函数,那么我该如何以智能的方式完成它而不是将所有请求放入队列并从C#中检查它线。
答案 0 :(得分:1)
您可以使用托管C ++,也可以通过将一组函数指针(托管端的代理)传递给所有相关入口点来从C#初始化C ++库。
在程序开始时调用初始化程序:
[DllImport("p2p.dll")]
public static extern void Initialize(Action triggerManagedAction);
Initialize(() => {Console.WriteLine("called from C++");});
在该函数的C ++实现中,记住函数指针。
在使用之前,请先阅读Hans Passant和Google对此技术的评论。我很容易在这里介绍错误。
答案 1 :(得分:1)
您可以通过创建托管C ++类来实现,该类充当C ++和.Net事件处理程序之间的代理。以下是它的外观:
这样一来,C ++事件就会激活你的.Net Notify方法。
答案 2 :(得分:0)
其中一种方法是使用/ clr标志编译C ++代码。在this SO thread中可以找到几个不同的例子。