2011-01-24 4 views
5

네이티브 C++를 래핑하는 관리되는 C++ 코드를 만들어야한다고 가정합니다. 하지만 네이티브 C++에서 정의 된 형식의 함수 매개 변수에 사용 된 배열을 래핑하는 동안 문제가 있습니다. 네이티브 C++ 코드는 다음과 같습니다.C# 클래스를 C#에서 호출하는 방법

//unmanageCPP.h 
class __declspec(dllexport) unmanageMoney 
{ 
public: 
    unmanageMoney(int a, int b) { rmb = a; dollar = b; } 
    unmanageMoney() { rmb = 0; dollar = 0; } 
    int rmb; 
    int dollar; 
}; 

class __declspec(dllexport) unmanageSum 
{ 
public: 
    //how to wrap this funciton? 
    int addDollar(unmanageMoney a[], unmanageMoney b[]); 
}; 

//unmanageCPP.cpp 
#include "unmanaged.h" 

int unmanageSum::adddollar(unmanageMoney a[], unmanageMoney b[]) 
{ 
    return a[0].dollar + b[0].dollar; 
} 

아무에게도 manageCPP.h 작성 방법을 알려 줄 수 없습니까? 매우 감사합니다!

업데이트

다음과 같이 나는 manageCPP.h를 구성,하지만 난 addDollar을 작성하는 방법을 모른다()

//first, I wrap the class unmanageMoney for use in manageSum::addDollar() 
public ref class manageMoney 
{ 
private: 
    unmanageMoney* mMoney; 
public: 
    unmanageMoney getMoney() 
    { 
     return *mMoney; 
    } 
    manageMoney(int a, int b) { mMoney = new unmanageMoney(a, b); } 
    ~manageMoney() { delete mMoney; } 
}; 

public ref class manageSum 
{ 
    // TODO: Add your methods for this class here. 
private: 
    unmanageSum *mSum; 
public: 
    manageSum() 
    { 
     mSum = new unmanageSum(); 
    } 
    ~manageSum() 
    { 
     delete mSum; 
    } 

    //it must be wrong if I code like this, for unmanageSun::adddollar() only 
    // receives unmanageMoney as arguments. So what should I do? 
    int adddollar(manageMoney a[], manageMoney b[]) 
    { 
      return mSum->adddollar(a, b); 
    } 

}; 
+0

@CDBean 질문에 대한 업데이트 또는 제공 할 세부 정보가있는 경우 원래 질문을 편집하여 새 데이터를 포함하십시오. – Sampson

+1

인수는'addDollar'에 대한'cli :: array a'를 원할 것입니다. 이것은 C#에서'manageMoney [] a'로 나타날 것입니다. –

+0

'unmanagedSum :: adddollar'에'unmanagedMoney a '가 아닌'unmanagedMoney a []'를 원하십니까? 배열의 첫 번째 항목 만 원하는 것처럼 보이며 대신 참조 (또는 포인터)를 사용하여 수행 할 수 있습니다. –

답변

1

당신은

와 C++/CLI 소스 파일을 생성
public ref class SomethingOrOther 
{ 
    //... 
}; 

/clr 옵션을 사용하도록 컴파일 옵션을 설정하십시오.

그 외에도 네이티브 C++ 작성과 거의 같습니다. 다시 사용하려는 클래스의 헤더 파일 #include을 작성하고, 인스턴스를 작성하고, 멤버 함수를 호출합니다. 일반 C++과 동일합니다. 하지만 그 안에있는 ref class은 C#에서 볼 수 있습니다.

그리고 __declspec(dllexport)을 클래스에 넣지 마십시오. 절대로. 함수에 유용하지만 클래스와 함께 사용할 때 불행을 초래합니다.

+0

답변 해 주셔서 감사합니다.하지만 멤버 함수에 네이티브 C++에서도 정의 된 인수 유형이있는 경우 어떻게해야합니까? 인수 형을 랩핑 할 필요가 있습니까? – ChanDon

+0

@CDBean : 예. 네이티브 타입과 매니지드 타입 사이에 1 : 1 매핑을 사용하는 것이 항상 의미가있는 것은 아닙니다 (구조체 매개 변수를 여러 매개 변수 또는 그와 비슷한 것으로 분할하는 것이 의미있는 경우도 있음). 그러나 어떤 형식의 변환 . –

+0

그리고 왜 나는 __declspec (dllexport)을 클래스에 넣으면 안되는지 모른다. 내가 그것을 삭제하려고하지만 오류와 함께 잘못 나온 "누락 된 모듈" – ChanDon

관련 문제