从C#应用程序向C++DLL函数传递char*参数

本文关键字:char 参数 函数 应用程序 C++DLL | 更新日期: 2023-09-27 18:01:19

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

(我读到传递字符串/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#应用程序向C++DLL函数传递char*参数

在C中,字符用于表示字节,因为在C中,类型字节不存在。或者刚好等于char类型。

所以从C#映射:

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate void Process([MarshalAs(UnmanagedType.LPArray)]byte[] data);

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate void Process(byte[] data);

问候