2012-10-29 97 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(指針)。

的問題是,你不能化解的IntPtr的結構在C#

...這一研究:

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 
     } 
    } 
}