C++ cli 字符*到数组<;无符号字符^>;

C++ cli 字符*到数组<;无符号字符^>;,c++-cli,C++ Cli,我有一个通过串口发送数据的程序。我将要发送的数据存储在本机char数组中(必须采用这种方式,不能使用托管缓冲区),但当通过调用Write(cli::array,…)方法将数据发送到缓冲区时,它不会像预期的那样接受指向本机数组的指针作为第一个参数。我可以简单地将naivecharbuffer的内容复制到managedarraybuffer,然后将此缓冲区作为第一个参数传递给函数Write(…),但这肯定很耗时。有没有办法将char*(或unsigned char*)强制转换为array您不能将未更

我有一个通过串口发送数据的程序。我将要发送的数据存储在本机
char
数组中(必须采用这种方式,不能使用托管缓冲区),但当通过调用
Write(cli::array,…)
方法将数据发送到缓冲区时,它不会像预期的那样接受指向本机数组的指针作为第一个参数。我可以简单地将naive
char
buffer的内容复制到managed
array
buffer,然后将此缓冲区作为第一个参数传递给函数
Write(…)
,但这肯定很耗时。有没有办法将
char*
(或
unsigned char*
)强制转换为
array您不能将未更改的本机
char*
数组强制转换为
array^
。为此,您必须将数据从一个复制到另一个。如果您确实无法删除非托管缓冲区(我怀疑,但我没有看到代码,也不知道您的原因),您可以做的是创建托管阵列,将其固定并在未更改的函数中使用:

#pragma unmanaged

void work_with_native_buffer(char* pBuffer, size_t size) {
    // Do your unmanaged stuff here
}

#pragma managed

ref class Test {
public:
    void DoNativeStuff() {
        if (_buffer == nullptr)
            _buffer = gcnew array<unsigned char>(256);

        pin_ptr<int> pinnedBuffer = &_buffer[0];
        char* pBuffer = pinnedBuffer;
        work_with_native_buffer(pBuffer, _buffer->Length);
    }

    void SendData(Stream^ stream) {
        Debug.Assert(_buffer != nullptr);

        stream->Write(_buffer, 0, _buffer->Length);
    }

private:
    array<unsigned char>^ _buffer;
};
#pragma非托管
使用本机缓冲区(char*pBuffer,size\u t size)作废工作{
//在这里做你的非托管物品
}
#布拉格管理
参考等级测试{
公众:
void DoNativeStuff(){
如果(_buffer==nullptr)
_缓冲区=新阵列(256);
pin_ptr pinnedBuffer=&u buffer[0];
char*pBuffer=pinnedBuffer;
使用本机缓冲区工作(pBuffer,\u buffer->Length);
}
void SendData(流^Stream){
Assert(_buffer!=nullptr);
流->写入(\u缓冲区,0,\u缓冲区->长度);
}
私人:
数组^\u缓冲区;
};
简而言之,您有一个托管缓冲区,但您将其锁定,它不会被GC重新定位,并且您有一个本机指针供本机函数访问。非托管代码不会更改,但会恢复分配位置


如果本机代码位于另一个DLL中,您也可以使用封送处理,但依我的经验,它会影响性能(串行端口/套接字的开销相当高)。

您是否有
std::array
的托管指针,或者您是否有指向
std::array
的托管指针?从题目和课文看不太清楚。请展示一些代码,比如您的声明,以及您尝试调用的函数的原型。我想知道为什么您不能使用托管缓冲区。您可以简单地将其固定在内存中,并获取指向内容的本机指针。我有一个缓冲区,声明为char buffer[SIZE],正如前面提到的本机字符数组一样,并通过调用Ports::Write方法通过串行端口将此缓冲区sen。@napyonsen请参阅:您不能将未更改的内存强制转换为非托管类型(它们是否兼容并不重要)。解决方法是在托管端分配缓冲区,并使用本机指针在非托管世界中公开它。我不能使用托管缓冲区,因为我只是在为嵌入目的编写的源文件中发送一些结构。我在这里做的是一种模拟(或验证)这并没有解决我的问题,因为我仍然使用托管缓冲区(managed buffer)\u buffer进行存储。不过,谢谢。是的,这就是问题所在!您有一个托管缓冲区,可以用于托管类,但也有一个未更改(!!!)指针,可以从未经管理的代码访问该缓冲区。另一种方法是(除非您隐式或显式复制,否则在非托管中分配和在托管中使用是不可能的)。如果您担心性能…停止这样做,没有任何区别(理论上分配托管内存更快)。关于封送:请注意out参数(如果您假设在非托管世界中分配)被封送。您是对的,这个解决方案听起来并不像我已经尝试过的那个样。