2011-02-03 2 views
2

나는 C# 코드에서 호출하기를 원하는 네이티브 일반 C++ DLL을 가지고 있으므로 C++/CLI 클래스 (설명 된대로 herehere)를 만들었는데 관리되는 C++ 코드가 포함되며 모든 C# 코드에서 직접 호출 할 수 있으며 네이티브 관리되지 않는 C++에 대한 호출을 호출 할 수 있습니다.C# 코드에서 int * 유형의 매개 변수를 가진 C++ DLL에 정의 된 함수를 어떻게 호출합니까?

네이티브 C++ dll의 함수 중 하나는 int * 유형의 매개 변수를가집니다. 래퍼 함수로 어떻게 선언 할 수 있으며 어떻게 int *로 변환 할 수 있습니까?

답변

2
[DllImport("some.dll")] 
static extern void SomeCPlusPlusFunction(IntPtr arg); 

IntPtr은 void *와 대략 동일한 유형입니다.

귀하의 코멘트에서

,이 (C 번호) 같은 일을 가장 좋은 선택이 될 것입니다 :

int size = 3; 
fixed (int *p = &size) { 
    IntPtr data = Marshal.AllocHGlobal(new IntPtr(p)); 
    // do some work with data 
    Marshal.FreeHGlobal(data); // have to free it 
} 

을하지만 AllocHGlobal는 int를 취할 수 있기 때문에, 나는이 작업을 수행하지 않을 이유를 알고하지 않습니다

IntPtr data = Marshal.AllocHGlobal(size); 
+0

을 그리고'방법은을 얻기 위해 포인터를'int *'로 캐스팅하고 역 참조 할 수있다. –

+0

안녕하세요 여러분, 답장을 보내 주셔서 감사합니다. 다음 코드 세그먼트를 사용하여 답장을 기반으로 포인터 변환을 수행합니다. 내가 틀린 지 말해줘. 어리석은 실수에 Apolozose, C# 및 C++/CLI 프로그래밍에 초보자. int b = 3; IntPtr errno = new IntPtr (&b); int * var = (int *) Marshal :: AllocHGlobal (errno) .ToPointer(); – Ashutosh

+0

안녕하세요, 귀하의 답장을 보내 주셔서 감사합니다. int로 변환 한 다음 ToPointer를 사용하여 변환하고 네이티브 C++에서 사용할 수 있습니다. 그러나 이제 어떻게 ir를 되돌릴 수 있는지 모르겠다. IntPtr로 int *를 변환하는 방법을 의미합니다. 누군가가 대답을 알고 있다면 회신을 요청합니다. – Ashutosh

5

참조로 값을 전달하는 것은 C/C++ 방식입니다. 이 같은 약 보일 것 C++/CLI에서

[DllImport("something.dll")] 
private static extern void Foo(ref int arg); 

: 당신은 키워드 밖으로 심판 또는 를 사용한다) (은`ToPointer을 사용하여 다음

public ref class Wrapper { 
private: 
    Unmanaged* impl; 
public: 
    void Foo(int% arg) { impl->Foo(&arg); } 
    // etc.. 
}; 
+0

+1 더 나은 대답을 위해 –

+0

다른 매개 변수 (근처에 크기 매개 변수가있는 경우)에 따라 동적으로 할당 된 배열을 전달할 수도 있습니다. –

관련 문제