C++ <--> C# 修改字节编组数组
C++ <--> C# modify a marshalled array of bytes
我有一个非托管c++函数,它在DLL中调用托管c#方法。c#方法的目的是获取一个字节数组(由c++调用者分配),填充该数组,并返回它。我可以在c#方法中获取数组,但是当它们返回到c++函数时,填充的数据将丢失。现在,这是我调试过程的测试代码:
c# DLL方法:// Take an array of bytes and modify it
public ushort GetBytesFromBlaster([MarshalAs(UnmanagedType.LPArray)] byte[] dataBytes)
{
dataBytes[0] = (byte)'a';
dataBytes[1] = (byte)'b';
dataBytes[2] = (byte)'c';
return 3;
}
调用DLL的c++函数:
// bytes[] has been already allocated by its caller
short int SimGetBytesP2P(unsigned char bytes[])
{
unsigned short int numBytes = 0;
bytes[0] = 'x';
bytes[1] = 'y';
bytes[2] = 'z';
// bytes[] are {'x', 'y', 'z'} here
guiPtr->GetBytesFromBlaster(bytes, &numBytes);
// bytes[] SHOULD be {'a', 'b', 'c'} here, but they are still {'x', 'y', 'z'}
return(numBytes);
}
我相信这与c#将c++指针转换为新的托管数组有关,但修改了原始数组。我尝试过使用"ref"修饰符等的几种变体,但没有运气。此外,这些数据不是以空结束的字符串;日期字节是原始的1字节值,不是以空结束的。
有谁能解释一下这个吗?谢谢!斯图尔特您可以自己进行封送处理。让c#函数接受IntPtr类型的值形参。还有第二个参数指示数组长度。不需要或不需要特殊的封送处理属性。
然后,使用Marshal。将数组从非托管指针复制并复制到分配的托管字节[]数组。做你该做的事,完成后,让法警帮忙。Copy将其复制回c++非托管数组。
这些特殊的重载应该让你开始:
http://msdn.microsoft.com/en-us/library/ms146625.aspx
http://msdn.microsoft.com/en-us/library/ms146631.aspx
public ushort GetBytesFromBlaster(IntPtr dataBytes, int arraySize)
{
byte[] managed = new byte[arraySize];
Marshal.Copy(dataBytes, managed, 0, arraySize);
managed[0] = (byte)'a';
managed[1] = (byte)'b';
managed[2] = (byte)'c';
Marshal.Copy(managed, 0, dataBytes, arraySize);
return 3;
}
如果默认的编组器不能满足您的需要,您也可以实现http://msdn.microsoft.com/en-us/library/w22x2hw6.aspx中所描述的自定义编组器。但是这看起来需要更多的工作。
我相信你只需要添加一个SizeConst
属性:
public ushort GetBytesFromBlaster(
[MarshalAs(UnmanagedType.LPArray, SizeConst=3)]
byte[] dataBytes
)
和默认的编组程序应该为您完成其余的工作。
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 在UNIX系统中使用DIR查找文件的字节大小
- 独立读取-修改-写入顺序
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 当系统的卷被修改时,如何修改WASAPI环回捕获卷
- 修改函数中的指针(将另一个指针作为参数传递)
- std::当在256字节边界上写入整数时,流的奇怪行为
- 为什么我可以通过引用修改常量返回
- 对于结构,表达式必须是可修改的ivalue
- QML:修改在不同QML文件(而非main.QML)中定义的子对象的属性
- 当比特(而不是字节)的顺序至关重要时的持久性
- 为什么不能修改对象中的值?另外,我如何改进此链表?
- 如何将字节数组元素替换为修改的十六进制 ASCII 符号?
- 我正在尝试修改一个字节数组并通过 JNI 将其从 c++ 发送到 java
- 使用C 修改Java方法/字节码
- c++.valgrind输出:Syscall param open(filename)指向不可修改的字节
- 用指针修改字节
- C++ <--> C# 修改字节编组数组