首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何实现从非托管DLL到.net应用的回调接口?

如何实现从非托管DLL到.net应用的回调接口?
EN

Stack Overflow用户
提问于 2010-01-30 20:46:43
回答 3查看 37.9K关注 0票数 24

在我的下一个项目中,我想为C++中已经存在的代码实现一个图形用户界面。我的计划是将C++部件包装在一个动态链接库中,并用C#实现图形用户界面。我的问题是,我不知道如何实现从非托管DLL到经过管理的C#代码的回调。我已经用C#进行了一些开发,但是托管代码和非托管代码之间的接口对我来说还是个新鲜事。有人能给我一些提示或阅读技巧或一个简单的例子开始吗?不幸的是,我找不到任何有用的东西。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-01-30 22:54:04

您不需要使用Marshal.GetFunctionPointerForDelegate(),P/Invoke编组程序会自动执行此操作。您需要在C#端声明一个其签名与C++端的函数指针声明兼容的委托。例如:

代码语言:javascript
复制
using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

class UnManagedInterop {
  private delegate int Callback(string text);
  private Callback mInstance;   // Ensure it doesn't get garbage collected

  public UnManagedInterop() {
    mInstance = new Callback(Handler);
    SetCallback(mInstance);
  }
  public void Test() {
    TestCallback();
  }

  private int Handler(string text) {
    // Do something...
    Console.WriteLine(text);
    return 42;
  }
  [DllImport("cpptemp1.dll")]
  private static extern void SetCallback(Callback fn);
  [DllImport("cpptemp1.dll")]
  private static extern void TestCallback();
}

以及用于创建非托管动态链接库的相应C++代码:

代码语言:javascript
复制
#include "stdafx.h"

typedef int (__stdcall * Callback)(const char* text);

Callback Handler = 0;

extern "C" __declspec(dllexport)
void __stdcall SetCallback(Callback handler) {
  Handler = handler;
}

extern "C" __declspec(dllexport)
void __stdcall TestCallback() {
  int retval = Handler("hello world");
}

这足以让您开始使用它。有一百万个细节可能会让你陷入麻烦,你肯定会遇到其中的一些。使用C++/CLI语言编写包装器是让这类代码运行起来的更有效的方法。这也允许您包装C++类,这是使用P/Invoke不能完成的事情。一个不错的教程是available here.

票数 51
EN

Stack Overflow用户

发布于 2010-01-30 20:56:16

参见Marshal.GetFunctionPointerForDelegate,它将为您提供一个函数指针,用于从非托管代码调用托管(即C#代码)。

票数 1
EN

Stack Overflow用户

发布于 2010-01-30 20:54:04

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2167895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档