从 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);

此致