2

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

4

3 回答 3

2

您可以使用托管 C++,也可以通过将一组函数指针(托管端的委托)传递给所有相关入口点,从 C# 初始化您的 C++ 库。

在程序开始时调用初始化程序:

[DllImport("p2p.dll")]
public static extern void Initialize(Action triggerManagedAction);

Initialize(() => {Console.WriteLine("called from C++");});

在该函数的 C++ 实现中,请记住函数指针。

在使用此技术之前,还请阅读 Hans Passant 和 Google 的评论。我在这里很容易引入错误。

于 2012-08-20T12:11:01.200 回答
1

您可以通过创建托管 C++ 类来完成此操作,该类充当 C++ 和 .Net 事件处理程序之间的代理。这是它的外观:

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

这样,C++ 事件将触发您的 .Net Notify 方法。

于 2012-08-20T12:22:32.680 回答
0

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

于 2012-08-20T12:10:51.633 回答