从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中,类型字节不存在。或者刚好等于char类型。
所以从C#映射:
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate void Process([MarshalAs(UnmanagedType.LPArray)]byte[] data);
或
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate void Process(byte[] data);
问候