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;

GetFunctionPointerForDelegate将委托中的String^参数转换成什么?

该委托上的Marshal::GetFunctionPointerForDelegate()将生成一个与

  typedef void (__stdcall *AFuntionPointer)( const char* );

String^封送到const char*,除非[MarshalAs]属性应用于委托参数。直接封送到std::string是不可能的,pinvoke封送器对头文件中声明的类的c++对象布局一无所知。