관리되는 C++에서 모든 멤버 변수가 생성자 내부에서 초기화되는 클래스가 있습니다. 관심 회원은 배열입니다. C# 프로젝트의 .cs 파일에서 두 프로젝트를 첫 번째 DLL과 연결 한 결과입니다. 그러나이 함수는 하나 이상의 매개 변수가 잘못되어 성공적으로 사용할 수 없다고 말합니다.관리되는 C++ 및 C#
클래스 선언과 함수 선언은 다음과 같습니다. 두 파일 모두 .h 파일에 있습니다. 기능 구성이 제대로 실행
var Driver = new Driver();
long status = Driver.Config2("CAN0", 8, Driver.AttrIdList, Driver.AttrValueList);
Console.WriteLine(status);
경우는 출력 0은 그러나, 나는 음수를 받고 있어요해야 다음과 같이
지금, 나는 .cs 파일에있는 함수를 호출하고 싶습니다 공급 업체가 제공 한 테이블을 조회 할 때 하나 이상의 매개 변수가 올바르게 설정되지 않았다고 표시됩니다. 나는 관리 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;
}
: 프로그램 컴파일 및 빌드
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 매개 변수로 바꾸면 컴파일러에서 오류가 발생합니다. 'cli :: array ^'에서 3으로 매개 변수를 변환 할 수 없습니다. 'NCTYPE_ATTRID_P'
BTW : NCTYPE_STATUS는 부호 없음 long이며, NCTYPE_ATTRID_P는 unsigned long *입니다.
모든 해당 코드를 입력하십시오. 형식은 무엇입니까? NCTYPE_STRING 및 NCTYPE_UINT32 –
NCTYPE_UINT32는 부호 없음 long이고 NCTYPE_STRING은 char *입니다. 이들 모두는 공급 업체의 라이브러리에서 선언되며 너무 길기 때문에 포함시킬 수 없습니다. – Nathan822
부호없는 길이는 CLR에서 32 비트입니다 – Nathan822