2012-06-19 1 views
5

에 나는 내가 (DLL을 가져온 후) C#에서이 기능을 사용할 때 매개 변수를 마샬링 할 void someFunc(char* arg1, int* arg2) C++에서 함수를했습니다 .. 어떻게해야 마샬링 INT * C#

당신이 pls는 말해 줄 수 내가 여기서 혼란스러워하는 마샬.

[DllImport(Dllname)] 
extern void someFunc([MarshallAsAttribute(UnmanagedType,LPStr)] string arg1, IntPtr arg2); 

여기서 IntPtr을 사용해야합니까? C++에서 int 변수의 주소를 전달할 수 없으므로 포인터가 C++로 상륙합니다.

+0

실제로 안전하지 않은 코드 블록을 사용하여 C#에서 네이티브 포인터를 사용할 수 있습니다. 내가 직관적이지 않은 API로 이어 지므로 추천하지는 않겠지 만. –

+1

그 포인터의 의미를 설명해야합니다. 함수가 포인터를 반환 한 후 포인터를 유지하고 포인터가 null 인 경우 포인터가 가리키는 데이터의 양이 특히 많습니다. – CodesInChaos

답변

7

문제는 int*입니다. C에서 여러 가지 시나리오에 사용할 수 있습니다. 어떻게 마샬링하는지는 int* arg2의 의미에 조금 달려 있습니다.

예를 들어 int 값만 설정하는 경우이를 ref int으로 마샬링 할 수 있습니다. 그러나 int*이 배열을 나타내는 경우 배열을 전달해야합니다. (길이 용어가 없기 때문에 포인터를 통해 배열을 사용할 때 일반적입니다.)

+0

그리고'char *'는 더 모호합니다. – CodesInChaos

+0

@CodeInChaos 예 - 모든 포인터 유형에이 문제가 있습니다. 네이티브 측에서이 변수로 수행 할 작업을 항상 알고 있어야합니다. –