gpt4 book ai didi

c# - GetFunctionPointerForDelegate 将委托(delegate)中的 String^ 参数转换成什么?

转载 作者:太空狗 更新时间:2023-10-29 21:27:52 27 4
gpt4 key购买 nike

我正在尝试使用托管 C++ 将 C# 委托(delegate)转换为 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;

最佳答案

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

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

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

关于c# - GetFunctionPointerForDelegate 将委托(delegate)中的 String^ 参数转换成什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8350166/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com