我有一个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 添加%
运算符,该运算符指定将传递引用。
答案 0 :(得分:-1)
要解决我的问题,我必须:
将c ++ / cli dll中的非托管数组切换到托管数组,然后使用pin_ptr将其用作dll内部函数中的非托管数组。
将%
运算符添加到托管数组参数,以指定它们将通过引用传递。
有关详细信息,请参阅我的问题。