none
如何建立C++回调C#函数的机制 RRS feed

  • 问题

  • 现有C#的EXE文件 CS.exe 和C++的DLL CPP.dll。

    程序由CS.exe启动。

    自己基本知道该机制实现的思路,但具体实现的细节不清楚,希望大家能帮忙搭一个最基本的框架。


    We are the staff of stars
    2010年7月21日 8:45

答案

  • 不可以。这涉及到非托管资源和托管资源之间的通信问题。C# 将所有的委托句柄分配在托管堆上,并非非托管内存区域,因此即使 C++ 的 DLL 能拿到委托的实例句柄也无法找到委托方法的入口地址。

    不过 C# 方法就可以使用 P/Invoke 来被非托管函数回调,但这种机制不符合楼主的要求。它必须要有显式的非托管函数的 P/Invoke 声明,不能做到完全动态的。


    Mark Zhou
    • 已标记为答案 Quark0927 2010年7月23日 2:55
    2010年7月22日 10:18
  • 你好!

        你需要通过P/Invoke提供的机制来进行托管和非托管的交互,委托内部使用函数指针来实现,但是并非就等同于函数指针,无法这么传递。而且委托内部的函数指针并没有暴露,你获取不到。所以这个思路行不通的。


    周雪峰
    • 已标记为答案 Quark0927 2010年7月23日 2:55
    2010年7月22日 12:53
    版主

全部回复

  • 要如何回调?C++ 的 DLL 如果是没有启用 C++/CLI 支持编译的话 (也就是没有 CLR 支持),我就不知道怎么弄了。不过如果 C# EXE 的类型已经具备 COM Visible = true 的话,是很方便可以被 C++ 当成 COM 组件引用的,也可以给它生成类型库。

    请具体描述一下,C++ DLL 文件和 C# EXE 文件的编译选项,类型等,这样我才可以给出针对的解决方案。


    Mark Zhou
    2010年7月21日 9:04
    1. CPP.dll不需要CLR支持,即CPP.dll为Win32库;
    2. 不是在CPP.dll直接调用C#的某一个函数;
    3. 不是把C#做成COM;

    我的意思大概是这样:

    • CS.exe启动后,将C#的一个委托设置到C++的一个函数指针变量;
    • 当在需要的时候,C++执行该函数指针所指向的函数,达到C++调用C#函数的目的。

     


    We are the staff of stars
    2010年7月21日 9:55
  • 不可以。这涉及到非托管资源和托管资源之间的通信问题。C# 将所有的委托句柄分配在托管堆上,并非非托管内存区域,因此即使 C++ 的 DLL 能拿到委托的实例句柄也无法找到委托方法的入口地址。

    不过 C# 方法就可以使用 P/Invoke 来被非托管函数回调,但这种机制不符合楼主的要求。它必须要有显式的非托管函数的 P/Invoke 声明,不能做到完全动态的。


    Mark Zhou
    • 已标记为答案 Quark0927 2010年7月23日 2:55
    2010年7月22日 10:18
  • 你好!

        你需要通过P/Invoke提供的机制来进行托管和非托管的交互,委托内部使用函数指针来实现,但是并非就等同于函数指针,无法这么传递。而且委托内部的函数指针并没有暴露,你获取不到。所以这个思路行不通的。


    周雪峰
    • 已标记为答案 Quark0927 2010年7月23日 2:55
    2010年7月22日 12:53
    版主
  • 谢谢楼上的意见,我会尝试采用P/Invoke的机制做个试验!


    We are the staff of stars
    2010年7月23日 2:55