从c ++传递参数到c#回调

时间:2012-09-18 09:41:34

标签: c# c++ dll

以下是我在c#...

中的代码

此处回调仅在c#中实现。 我想要一个来自c ++ dll的回调

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;


class Program
{
  //   [DllImport("C:/Users/kool/Documents/Visual Studio 2010/Projects/DLL/Debug/DLL.dll", CallingConvention = CallingConvention.Cdecl)]


    static void Main(string[] args)
    {


        function1(function2);   // i want thia function2 to be fetched from ++ dll

    }

    public delegate void fPointer(); // point to every functions that it has void as return value and with no input parameter 
    public static void function1(fPointer ftr)
    {
        fPointer point = new fPointer(ftr);
        point();
    }
    public static void function2()
    {
        Console.WriteLine("Bla");
    }
}

我将创建一个dLL,我将把function2发送到

function1(function2); 

我该如何实现呢?

2 个答案:

答案 0 :(得分:0)

一种方法是将C#程序集导出为类型库,并使用C ++将其作为COM组件使用。

在Visual Studio命令提示符中使用TlbExp.exe将C#程序集导出为类型库。然后使用RegAsm.exe注册类型库。然后在C ++代码中使用#import指令导入类型库。您现在可以使用C ++中的C#类,就像它们是COM类一样。

有关详细信息,请参阅:http://msdn.microsoft.com/en-us/library/ms172270.aspx

编辑:抱歉,您想要做的是:使用C#中的C ++,还是使用C ++中的C#?

任何一个都是可能的。上面的链接解释了如何使用C ++中的C#。这个解释了如何使用C#中的C ++:http://msdn.microsoft.com/en-us/library/z6tx9dw3.aspx

答案 1 :(得分:0)

您可以发送指向托管.net函数的指针,并从未损坏的代码(回调)中调用它。

详细信息http://habrahabr.ru/post/130690/(如果需要,请使用Google将其翻译为俄语,但您需要查看最后两个代码示例)。

同时检查你的代码调用 - 它应该遵守托管和非托管两方(在C代码中使用__ stdcall ,在中使用 CallingConvention = CallingConvention.Cdecl DllImport 属性)。