簡體   English   中英

將C#函數指針傳遞給C ++ / CLI interop dll

[英]Passing C# function pointers into C++/CLI interop dll

我正在嘗試將一個函數指針從C#傳遞到C ++ / CLI並得到一個Windows編譯器錯誤,指出該語言不支持ManagedTakeCallback函數(C#) - 我在C ++ / CLI互操作中定義了ManagedTakeCallback 我的代碼看起來像

C#應用程序:

namespace ManagedConsoleApplication

{

class Callback
    {
        public delegate double DelegateAdd(double value1, double value2);

        public static double CallbackAdd(double value1, double value2)
        {
            return value1 + value2;
        }

        public static DelegateAdd delegateCallback = new DelegateAdd(Callback.CallbackAdd); //declare as static to prevent GC

    }

    class Program
    {
       // [DllImport("InteropDLL.dll", CallingConvention = CallingConvention.StdCall)]
       // public static extern void ManagedCallback(IntPtr pCallback);
        static void Main(string[] args)
        {
            InteropDLL io = new InteropDLL(); 
            Console.WriteLine("The Add return = {0}", io.ManagedAdd(3, 2));
            Console.WriteLine("Pass CallBack to Unmanaged code");
            Callback cb = new Callback();
            IntPtr intptr_delegate = Marshal.GetFunctionPointerForDelegate(Callback.delegateCallback); //convert delegate to function pointer which can be used by unmanaged code
            Console.WriteLine("The callback return is {0}", io.ManagedTakeCallback(intptr_delegate)); 
            Console.WriteLine("Please hit Enter to exit");
            String value = Console.In.ReadLine();
            //Console.WriteLine("End of program ", value);
        }
    }
}

和,

C ++ / CLI interop dll h和cpp文件:

//HEADER

namespace Interop
{

typedef double (__stdcall *PCallback)(double value1, double value2);

    public ref class InteropDLL
    {
    public:
        double ManagedAdd(double value1, double value2);

    public:
        double ManagedTakeCallback(PCallback pCallback);
    };
}

//CPP

double Interop::InteropDLL::ManagedAdd(double value1, double value2)
{
    return NativeAdd(value1, value2);
}

double Interop::InteropDLL::ManagedTakeCallback(PCallback pCallback)
{
    return NativeTakeCallback();
}

然后,C ++ / CLI互操作層調用C DLL。 我可以調用ManagedAdd互操作函數; 但是,如果添加了ManagedTakeCallback ,則會出現Windows編譯器錯誤。 我懷疑C#應用程序沒有通過ManagedTakeCallback函數正確編組函數指針,或者C ++ / CLI端的簽名不正確? 我非常感謝任何見解。

以下是現場評論:

“但是C#不支持C ++函數指針,所以我們不能在這里調用C ++函數指針.C#只有Delegate對象,我們必須通過Marshal.GetDelegateForFunctionPointer將函數指針轉換為Delegate。它在System.Runtime.InteropServices中聲明如下:

public static Delegate GetDelegateForFunctionPointer (
      IntPtr ptr,
      Type t)

如需完整答案,請查看鏈接: http//www.codeproject.com/Articles/27298/Dynamic-Invoke-C-DLL-function-in-C

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM