将char*参数传递给C++;C#应用程序中的DLL函数

将char*参数传递给C++;C#应用程序中的DLL函数,c#,dll,oculus,C#,Dll,Oculus,我试图使用一个声明为C#的void进程(char*data)的dll函数 dll提供各种函数来操作OculusRift。 该功能应在Oculus中显示数据图像,并由另一个功能齐全的应用程序使用 在我的代码中,我从位图图像生成一个字节[],然后将其转换为其他内容(char[],附加一个StringBuilder,…),目的是将其传递给进程函数 我通过LoadLibrary(加载DLL)+getprocadres(访问函数)从DLL加载此进程函数。我不能使用DLLImport,因为我希望尽可能接近其

我试图使用一个声明为C#的
void进程(char*data)
的dll函数

dll提供各种函数来操作OculusRift。 该功能应在Oculus中显示数据图像,并由另一个功能齐全的应用程序使用

在我的代码中,我从位图图像生成一个字节[],然后将其转换为其他内容(char[],附加一个StringBuilder,…),目的是将其传递给
进程
函数

我通过
LoadLibrary
(加载DLL)+
getprocadres
(访问函数)从DLL加载此进程函数。我不能使用
DLLImport
,因为我希望尽可能接近其他应用程序(用C++编写)的接口与DLL的工作方式。

我尝试使用
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
私有委托无效进程([Marshallas(UnmanagedType.LPStr)]StringBuilder数据)

或者干脆
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
私有委托作废流程(StringBuilder数据)

(我读到传递字符串/StringBuilder可以做到这一点,因为它在默认情况下被封送为char*)。因此,我将完整字符串作为参数传递给DLL,而不是char*

我也尝试将IntPtr作为参数传递,使用封送处理副本和

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
专用代表作废流程(IntPtr数据)
因此,我出现了内存访问冲突异常。

然后,我尝试了使用不安全代码的各种方法,例如从另一个应用程序实现整个数据创建过程(出于我的目的,我只需要一个简化版本),或者在char[]中创建我想要的数据,然后将这个char[]复制到我传递给的char*中

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
私有不安全委托无效流程(字符*数据)

这导致stackalloc出现堆栈溢出异常和内存访问冲突异常

在这一点上,我想我错过了一些东西,需要你的帮助。我不知道是否有某种锁导致内存异常错误(我确保图像大小正确),我不知道我是否完全误解了封送处理过程,等等


我希望关于我的问题我已经足够明确了。

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

因此,要从C#映射:


关于

在我的代码中,我从位图图像生成一个字节[],然后将其转换为其他内容(字符[],附加一个StringBuilder,…),您可能会使用它吗?因为图像是图像,
字符串
字符串
…实际上,我从位图图像中得到一个字节[]。然后,由于
Encoding.Unicode.GetChars(bytes)
我可以将这些字节转换成char。我不尝试将位图图像直接加载到char。图像是图像,
字符串
字符串
。。。你不能把两者混为一谈。您的方法可能接受
字节[]
参数。这张图片的来源是什么?它的格式正确吗?该方法只接受char*,然后Oculus dll将一个来自参数的图像呈现到Oculus中。使用这个DLL的C++应用程序也计算一个新图像的每个像素,然后将这些数字存储到一个字符中。我选择打开一个图像来获取每个像素值(因为我不需要计算一些),然后像C++应用程序一样继续进行。在C/C++中,代码> char */COD>用于字符串和字节数组…
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate void Process([MarshalAs(UnmanagedType.LPArray)]byte[] data);
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate void Process(byte[] data);