2012-10-29 2 views
-5

C#에서 P/Invoke를 사용하여 호출 할 C 코드가 있습니다. 이 C 함수에 해당하는 C#을 정의하려고합니다.C로 C/C++ 함수 가져 오기

SomeData* DoSomething(); 

struct SomeData 
{ 
    ... 
} 

이 C 메소드를 C#으로 가져 오려면 어떻게해야합니까? 함수의 반환 형식을 정의하는 데 문제가 있습니다.

편집 : 나는 많은 기능을 가져 왔습니다. 이것은 나를 붙이게 한 것입니다.

[DllImport("SomeDll.dll")] 
public static extern IntPtr DoSomething(); 

IntPtr을 사용하는 것에 대해 생각해 보았습니다.

+1

[무엇을 시도해 봤습니까?] (http://mattgemmell.com/2008/12/08/what-have-you-tried/) –

+0

나는 여러 가지 기능을 가져 왔습니다. 이것은 나를 붙이게 한 것입니다. [DllImport ("DoremiSource.dll")] public static extern IntPtr DoSomething(); IntPtr을 사용하는 것에 대해 생각해 보았습니다. –

+0

@ ShaQ.Blogs 귀하의 질문에 정보를 추가하고 약간 확장 할 수 있습니다. –

답변

4

나는 당신의 질문을 이해할 수 있을지 잘 모르겠지만, 답변을 드릴 것입니다. C 함수에서 반환되는 구조를 정의하고 Marshal.PtrToStructure을 사용하여 반환 된 구조를 사용해야합니다.

[DllImport("SomeDll.dll")] 
public static extern IntPtr DoSomething(); 

public struct SomeData 
{ 
    //... 
} 

//code to use returned structure 
IntPtr result = DoSomething(); 

SomeData structResult = (SomeData)Marshal.PtrToStructure(result, typeof(SomeData)); 
+0

동감 ... 좋은 예! 정확히 내가 뭘 얻었는지! – series0ne

+0

내가 뭘 찾고 있었는지 ... 고마워! –

3

내가 무엇을 달성하려고하는 것은 다음과 같은 것을 추측하고있다 :

  1. 귀하의 C/C++ 네이티브 메소드는 매개 변수를 취하지 않으며 구조체에 대한 포인터를 반환한다.
  2. C#은 IntPtr (포인터)를 반환하는 것과 같습니다.

문제는 당신이 C#을

... 연구이있는 구조로 IntPtr입니다를 해결할 수 있다는 것입니다 :

Marshal.PtrToStructure (IntPtr입니다, 유형)

http://msdn.microsoft.com/en-us/library/4ca6d5z7.aspx

코드를 위로 감쌀 수 있습니다

public static class UnsafeNativeMethods 
{ 
    [DllImport("SomeDll.dll")] 
    private static extern IntPtr DoSomething(); //NO DIRECT CALLS TO NATIVE METHODS!! 

    public static SomeData SafeDoSomething() 
    { 
     try 
     { 
     return (SomeData)Marshal.PtrToStructure(DoSomething(), typeof(SomeData)); 
     } 
     catch(Exception ex) 
     { 
     //handle exception 
     } 
    } 
} 
관련 문제