GetFunctionPointerForDelegate 将委托中的 String^ 参数转换为啥?

Posted

技术标签:

【中文标题】GetFunctionPointerForDelegate 将委托中的 String^ 参数转换为啥?【英文标题】:What does GetFunctionPointerForDelegate convert a String^ parameter in a delegate into?GetFunctionPointerForDelegate 将委托中的 String^ 参数转换为什么? 【发布时间】:2011-12-02 00:08:19 【问题描述】:

我正在尝试使用托管 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;

【问题讨论】:

这看起来更像 C++/CLI 而不是托管 C++... 参数是const char* 还是char*?差别很大。 其实这是我的问题。什么是有效的论点?是char*const char*std::stringCstring等吗? 我已经更新了上面的文字,以更好地表明这是我的问题,而不是我的代码的一部分。 【参考方案1】:

该委托上的 Marshal::GetFunctionPointerForDelegate() 将生成一个兼容的函数指针

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

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

【讨论】:

以上是关于GetFunctionPointerForDelegate 将委托中的 String^ 参数转换为啥?的主要内容,如果未能解决你的问题,请参考以下文章