从 C# 应用程序将 char* 参数传递给 C++ DLL 函数
Passing a char* argument to a C++ DLL function from a C# app
我正在尝试使用 C# 中声明为 void Process(char* data)
的 dll 函数。
dll 提供各种函数来操作 OculusRift。
此功能应该在 Oculus 中显示数据图像,并由另一个功能齐全的应用程序使用。
在我的代码中,我从位图图像生成一个 byte[],然后我将它转换成其他东西(char[],附加一个 StringBuilder,...)旨在将其传递给 Process
功能。
我通过 LoadLibrary
(加载 DLL)+ GetProcAdress
(访问函数)从 DLL 加载这个过程函数。我不能使用 DLLImport
因为我想尽可能接近其他应用程序的界面(用 C++ 编写)与 DLL 一起工作的方式。
我尝试使用
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate void Process([MarshalAs(UnmanagedType.LPStr)]StringBuilder data);
或简单地
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate void Process(StringBuilder data);
(我读到传递 string/StringBuilder 可以解决问题,因为它默认编组为 char*)。结果,我将完整的字符串作为参数传递给 DLL 而不是 char*.
我也尝试使用 Marshal Copy 和
将 IntPtr 作为参数传递
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate void Process(IntPtr data);
。
结果我遇到了内存访问冲突异常。
然后我尝试了各种使用不安全代码的方法,例如从另一个应用程序实现整个数据创建过程(出于我的目的,我只需要一个简化版本)或在 char[] 中创建我想要的数据,然后将此 char[] 复制到我传递给
的 char*
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private unsafe delegate void Process(char* data);
这导致了 stackalloc 的堆栈溢出异常和内存访问冲突异常。
在这一点上,我想我遗漏了一些东西,需要你的帮助。我不知道是否有某种锁导致内存异常错误(我确保图像的大小正确),我不知道我是否没有完全误解编组过程等
我希望我已经足够明确地说明了我的问题。
在 C 中,char 用于表示字节,因为在 C 中 byte 类型不存在。或者正好等于 char 类型。
所以要从 C# 映射:
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate void Process([MarshalAs(UnmanagedType.LPArray)]byte[] data);
或
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate void Process(byte[] data);
此致
我正在尝试使用 C# 中声明为 void Process(char* data)
的 dll 函数。
dll 提供各种函数来操作 OculusRift。 此功能应该在 Oculus 中显示数据图像,并由另一个功能齐全的应用程序使用。
在我的代码中,我从位图图像生成一个 byte[],然后我将它转换成其他东西(char[],附加一个 StringBuilder,...)旨在将其传递给 Process
功能。
我通过 LoadLibrary
(加载 DLL)+ GetProcAdress
(访问函数)从 DLL 加载这个过程函数。我不能使用 DLLImport
因为我想尽可能接近其他应用程序的界面(用 C++ 编写)与 DLL 一起工作的方式。
我尝试使用 [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate void Process([MarshalAs(UnmanagedType.LPStr)]StringBuilder data);
或简单地 [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate void Process(StringBuilder data);
(我读到传递 string/StringBuilder 可以解决问题,因为它默认编组为 char*)。结果,我将完整的字符串作为参数传递给 DLL 而不是 char*.
我也尝试使用 Marshal Copy 和
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate void Process(IntPtr data);
。
结果我遇到了内存访问冲突异常。
然后我尝试了各种使用不安全代码的方法,例如从另一个应用程序实现整个数据创建过程(出于我的目的,我只需要一个简化版本)或在 char[] 中创建我想要的数据,然后将此 char[] 复制到我传递给
的 char*[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private unsafe delegate void Process(char* data);
这导致了 stackalloc 的堆栈溢出异常和内存访问冲突异常。
在这一点上,我想我遗漏了一些东西,需要你的帮助。我不知道是否有某种锁导致内存异常错误(我确保图像的大小正确),我不知道我是否没有完全误解编组过程等
我希望我已经足够明确地说明了我的问题。
在 C 中,char 用于表示字节,因为在 C 中 byte 类型不存在。或者正好等于 char 类型。
所以要从 C# 映射:
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate void Process([MarshalAs(UnmanagedType.LPArray)]byte[] data);
或
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate void Process(byte[] data);
此致