2012-07-18 3 views
2

관리되는 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 *입니다.

+0

모든 해당 코드를 입력하십시오. 형식은 무엇입니까? NCTYPE_STRING 및 NCTYPE_UINT32 –

+0

NCTYPE_UINT32는 부호 없음 long이고 NCTYPE_STRING은 char *입니다. 이들 모두는 공급 업체의 라이브러리에서 선언되며 너무 길기 때문에 포함시킬 수 없습니다. – Nathan822

+0

부호없는 길이는 CLR에서 32 비트입니다 – Nathan822

답변

0

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

관리되는 배열을 순수 네이티브 C++ 함수에 전달할 수 없으면 먼저 고정 된 부호없는 long * 포인터로 '변환'해야합니다.

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 

편집 : memcpy_s 기능을 사용할 수 있도록 #include "windows.h"
Rememer!

관련 문제