如何在C ++ / CLI程序和C ++ / CLI DLL之间传递字节数组?

时间:2014-11-12 20:02:45

标签: .net c++-cli clr

我有一个CLR DLL,用作与不同处理器类型的设备通信的接口。在从C#测试程序调用时,DLL已经过测试并按预期工作。

在C ++ / CLI测试程序中,我无法将值放入作为参数传递的缓冲区中(在dll中)。

[更新]
这里是我在dll中使用的函数的声明:

//changed pointers to arrays
bool connect(uint procType, String^ commPort);//Works as expected
bool read(uint16 addr, array<uint8>^% buf, uint bufSize, uint8 page);//data is not put into buf
bool write(uint16 addr, array<uint8>^% buf, uint bufSize, uint page);//Unknown behavior (cannot read to varify)
void close(void);//works as expected

[更新]
此处是C ++ / CLI测试程序:

using namespace System;
using namespace ProcessorInterfaceCLR;//namespace in dll

int main(int argc, char * argv[])
{

    ProcessorCLR proc;

    /* connect to device */
    bool is_connected = proc.connect(1, "COM3");
    if (is_connected)/* connect successful */     //Connect passes and fails when expected
    {
        unsigned short addr = 0x1000; //test address
        const unsigned int size = 10;
        array<Byte>^ buf = gcnew array<Byte>(size);// <-------- init managed array

        /* read the data at the location */
        bool retval = proc.read(addr, buf, size, 0/*page*/);   //retval == true
        //buf  == {0,0,0...}, This is not the correct data

        /* close comm when done */
        proc.close();
    }
    return 0;
}

问题read()应该在缓冲区中放置字节,而是缓冲区中的数据 全是0。

[更新]
这里是我在dll中读取函数的实现。它将托管数组转换为非托管数组,并将其传递给包含在cli dll中的c ++函数。

/*
Reads data from the device into the given buffer. */
bool ProcessorCLR::read(uint16 addr, array<uint8>^% buffer, uint size, uint8 page)
{
    pin_ptr<uint8> buf = &buffer[0];
    return proc->read(addr, buf, size, page);
}

我通过评论对proc->read()的调用并添加buf[0] = 1并且我上午能够获得返回值来对此进行测试。 因此,问题是数组,而proc-&gt; read()通常会更改非托管数组中的值,它不会更改pin_ptr的值托管数组。

问题已在上次更新时修复。我必须将非托管数组切换到托管数组 AND 添加%运算符,该运算符指定将传递引用。

1 个答案:

答案 0 :(得分:-1)

要解决我的问题,我必须:

  1. 将c ++ / cli dll中的非托管数组切换到托管数组,然后使用pin_ptr将其用作dll内部函数中的非托管数组。

  2. %运算符添加到托管数组参数,以指定它们将通过引用传递。

  3. 有关详细信息,请参阅我的问题。