gpt4 book ai didi

c# - 托管 C++ 和 C#

转载 作者:太空宇宙 更新时间:2023-11-03 16:28:51 25 4
gpt4 key购买 nike

我在托管 C++ 中有一个类,它的所有成员变量都在构造函数中初始化。感兴趣的成员是一个数组。我从 C# 项目的 .cs 文件调用它,将这两个项目与第一个项目的 dll 链接起来。但是,该函数表示一个或多个参数不正确,因此无法成功使用。

类声明和函数声明如下。两者都在 .h 文件中。

现在,我想调用.cs文件中的函数如下:

var Driver = new Driver();
long status = Driver.Config2("CAN0", 8, Driver.AttrIdList, Driver.AttrValueList);
Console.WriteLine(status);

如果 Config 函数正确执行,它应该输出 0。但是,我得到一个负数,在使用供应商提供的表格进行查找时,它指出一个或多个参数设置不正确。我不知道如何克服这一点,因为我是托管 C++ 的新手。所有帮助将不胜感激。谢谢。

代码声明如下:

public ref class Driver
{
public:

NCTYPE_STATUS Status;
NCTYPE_OBJH TxHandle;
MY_NCTYPE_CAN_FRAME Transmit;
array<NCTYPE_UINT32>^ AttrIdList;
array<NCTYPE_UINT32>^ AttrValueList;
array<char>^ Data;
NCTYPE_UINT32 Baudrate;

public:
Driver()
{
Baudrate = 1000000;
TxHandle = 0;
AttrIdList = gcnew array<NCTYPE_UINT32>(8);
AttrValueList = gcnew array<NCTYPE_UINT32>(8);
AttrIdList[0] = NC_ATTR_BAUD_RATE;
AttrValueList[0] = Baudrate;
AttrIdList[1] = NC_ATTR_START_ON_OPEN;
AttrValueList[1] = NC_TRUE;
AttrIdList[2] = NC_ATTR_READ_Q_LEN;
AttrValueList[2] = 0;
AttrIdList[3] = NC_ATTR_WRITE_Q_LEN;
AttrValueList[3] = 1;
AttrIdList[4] = NC_ATTR_CAN_COMP_STD;
AttrValueList[4] = 0;
AttrIdList[5] = NC_ATTR_CAN_MASK_STD;
AttrValueList[5] = NC_CAN_MASK_STD_DONTCARE;
AttrIdList[6] = NC_ATTR_CAN_COMP_XTD;
AttrValueList[6] = 0;
AttrIdList[7] = NC_ATTR_CAN_MASK_XTD;
AttrValueList[7] = NC_CAN_MASK_XTD_DONTCARE;

interior_ptr<NCTYPE_UINT32> pstart (&AttrIdList[0]);
interior_ptr<NCTYPE_UINT32> pend (&AttrIdList[7]);


Data = gcnew array<char>(8);
for (int i=0; i<8;i++)
Data[i]=i*2;

}

我在 Config 函数下面还有另一个方法,声明如下:

NCTYPE_STATUS Config2 (String^ objName, int numAttrs, array<unsigned long>^ AttrIdList, array<unsigned long>^ AttrValueList )
{
msclr::interop::marshal_context^ context = gcnew msclr::interop::marshal_context();
const char* name = context->marshal_as<const char*>(objName);


char* name_unconst = const_cast<char*>(name);

return ncConfig (name_unconst, 8, nullptr, nullptr);
delete context;

}

程序编译构建,这是一个运行时错误。我猜测它与函数 Config2 中传递的两个 nullptr 有关,但是如果我用参数 AttrIdList 和 AttrValueList 替换它们,编译器会给出错误:无法将参数 3 从“cli::array^”转换为“NCTYPE_ATTRID_P”

顺便说一句:NCTYPE_STATUS 是 unsigned long,而 NCTYPE_ATTRID_P 是 unsigned long*。

最佳答案

cannot convert parameter 3 from 'cli::array^' to 'NCTYPE_ATTRID_P'
NCTYPE_ATTRID_P is unsigned long*

您不能将托管数组传递给纯 native C++ 函数,您首先需要将其“转换”为固定的无符号长*指针。

这里有一个方法:

unsigned long* ManagedArrayToFixedPtr(array<unsigned long>^input)
{
pin_ptr<unsigned long> pinned = &input[0];
unsigned long* bufferPtr = pinned;

unsigned long* output = new unsigned long[input->Length];
memcpy_s(output, input->Length, bufferPtr, input->Length);

return output;
}

测试功能:

array<unsigned long>^ larray = gcnew array<unsigned long> {2,4,6,8,10,12,14,16};
unsigned long* lptr = ManagedArrayToFixedPtr(larray); //returns pointer to 2

编辑:
记得 #include "windows.h" 才能使用 memcpy_s 函数!

关于c# - 托管 C++ 和 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11549755/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com