我正在尝试将一个函数指针从 C# 传递到 C++/CLI,并收到一个 Windows 编译器错误,指出此语言 (C#) 不支持 ManagedTakeCallback
函数——我定义了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 互操作 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
关于c# - 将 C# 函数指针传递到 C++/CLI 互操作 dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8247327/