GetFunctionPointerForDelegate将委托中的String^参数转换成什么?
本文关键字:转换 参数 什么 String GetFunctionPointerForDelegate | 更新日期: 2023-09-27 18:16:29
我正在尝试将c#委托转换为c++函数指针,使用托管c++。下面是我们之前使用的方法:
// Define a delegate
public delegate void ADelegate(Int32);
ADelegate^ delegateInstance;
// Define a function pointer
typedef void (__stdcall *AFuntionPointer)(int);
AFuntionPointer functionPointerInstance;
// Create an instance of a delegate, using GetFunctionPointerForDelegate
delegateInstance = gcnew ADelegate(this, &AClass::AFunction);
// Convert the delegate to a pointer
IntPtr anIntPtr = Runtime::InteropServices::Marshal::GetFunctionPointerForDelegate(delegateInstance);
// Cast the pointer into a function pointer
functionPointerInstance = static_cast<AFuntionPointer>(anIntPtr.ToPointer());
如果我把ADelegate
的参数从Int32
变成了String^
,我应该把AFunctionPointer
的参数变成什么类型?换句话说,如果我将上面代码的前两行更改为:
public delegate void ADelegate(String ^);
ADelegate^ delegateInstance;
接下来的两行我该怎么改?
// To what type does GetFunctionPointerForDelegate translate String^ to?
typedef void (__stdcall *AFuntionPointer)( /* char*? std::string? */ );
AFuntionPointer functionPointerInstance;
该委托上的Marshal::GetFunctionPointerForDelegate()将生成一个与
typedef void (__stdcall *AFuntionPointer)( const char* );
String^
封送到const char*
,除非[MarshalAs]属性应用于委托参数。直接封送到std::string是不可能的,pinvoke封送器对头文件中声明的类的c++对象布局一无所知。