委托从引用的C ++ DLL触发C#函数

时间:2012-08-20 12:00:39

标签: c# c++ visual-c++ dll pinvoke

我有一个工作的非托管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#中检查它线。

3 个答案:

答案 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事件处理程序之间的代理。以下是它的外观:

  • 假设您通过发布一个名为ICEventHandler的接口来注册C ++类的通知,该接口将调用其notify()方法。
  • 在托管C ++中创建一个派生自ICEventHandler的类,该类具有委托,例如Notify()。在继承的ICEvenhHandler.notifty()中调用Notify委托。
  • 使用.net Nofity方法,构造代理类的实例,并将其传递给C ++事件源类

这样一来,C ++事件就会激活你的.Net Notify方法。

答案 2 :(得分:0)

其中一种方法是使用/ clr标志编译C ++代码。在this SO thread中可以找到几个不同的例子。