在单个标题中恢复它有点困难,所以这就是我的情况。

我正在构建一个加载C++库的C#应用​​程序。
我从该C++ DLL调用函数。
但是我也想让我的C++ DLL从C#应用程序中调用函数(正在导入/运行它)...

这是一段使它更全面的代码:

// I'm importing functions from my native code
[DllImport(dllFilePath, CallingConvention = CallingConvention.Cdecl)]
public static extern int returnIntValue(int value);
[DllImport(dllFilePath, CallingConvention = CallingConvention.Cdecl)]
public static extern int returnIntArrValueAt(int[] values, int index);

// Here is the kind of code it should be
// [DllImport(dllFilePath, CallingConvention = CallingConvention.Cdecl)]
// public static extern void callCSharpFunction( FunctionPointer fctPointer );

main
{
    // I run the function
    int intValue1 =
        MyAddIn.returnIntValue(147852369);
    int intValue2 =
        MyAddIn.returnIntArrValueAt( new int[] { 9, 4, 3, 2, 1, 0 }, 5);

    // Here is an example function I use to call my C# func from C++
    // MyAddIn.returnIntValue( &myCSharpFunction );
}

// This is the method I'd like to call from my C++ imported library
static public void myCSharpFunction()
{
    MessageBox.Show("Called from C++ code !!");
}

因此,恢复:
  • C#代码导入我的C++ DLL
  • C#从C++ DLL运行函数
  • C++ DLL方法调用一个C#方法,该方法显示一个MessageBox(即)
  • 最佳答案

    这是我对this question的回答,与之类似。我的示例不对回调使用参数。由于您的参数是整数,因此您应该不会有任何问题。

    基本上,Marshal.GetFunctionPointerForDelegate方法从委托(delegate)创建一个IntPtr。该委托(delegate)应具有与C++库中使用的函数指针相同的签名。

    // This is the delegate type that we use to marshal
    // a function pointer for C to use. You usually need
    // to specify the calling convention so it matches the
    // convention of your C library. The signature of this
    // delegate must match the signature of the C function
    // pointer we want to use.
    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
    delegate void FunctionPointer();
    
    // This is the function we import from the C library.
    [DllImport(dllFilePath)]
    static extern void callCSharpFunction(IntPtr fctPointer);
    
    // This is the placeholder for the function pointer
    // we create using Marshal.GetFunctionPointerForDelegate
    IntPtr FctPtr;
    
    // This is the instance of the delegate to which our function
    // pointer will point.
    FunctionPointer MyFunctionPointer;
    
    // This calls the specified delegate using the C library.
    void CallFunctionPointer(FunctionPointer cb)
    {
        // make sure the delegate isn't null
        if (null == cb) throw new ArgumentNullException("cb");
    
        // set our delegate place holder equal to the specified delegate
        MyFunctionPointer = cb;
    
        // Get a pointer to the delegate that can be passed to the C library
        FctPtr = Marshal.GetFunctionPointerForDelegate(MyFunctionPointer );
    
        // call the imported function with that function pointer.
        callCSharpFunction(FctPtr);
    }
    

    10-07 13:23
    查看更多