2010-11-18 70 views
1

我只是想從C#中的DLL調用C函數。這個C函數返回一個結構體。以C#結構作爲返回值調用C函數

這裏的C DLL的.H文件聲明:

typedef struct t_Point{ 
int x; 
int y; 
} Point; 


Point myFuncs(); 

現在我想用在C#中此功能。 Wrapper.cs:

using System.Text; 
using System.Runtime.InteropServices; 

namespace CSharp_mit_OpenCV 
{ 
    [StructLayout(LayoutKind.Sequential)] 
    public struct Point 
    { 
     public int x; 
     public int y; 
    }; 

    class Wrapper 
    { 
     [DllImport("OpenCV Test.dll", CharSet= CharSet.Auto)] 
     [return: MarshalAs(UnmanagedType.Struct)] 
     public static extern Point myFuncs(); 
    } 
} 

的用法如下:

Point p = Wrapper.myFuncs(); 

(命名可能不是最好的)

myFuncs只是聲明瞭一個結構,提出了一些值x和y返回它。問題:我在C#中獲得的值與在C函數中生成的值不同。它應該是4和2,它是0和111226272.這裏有什麼問題?

感謝您的幫助!

+0

猜猜這是不同類型的東西:嘗試用C#'short'而不是'int',並嘗試用'uint'或'ushort'。你可以發佈進程輸出的字節(所以在C#試圖從他們創建一個結構之前)? – 2010-11-18 10:18:54

+1

它總是返回111226272還是每次都不一樣? – 2010-11-18 11:23:45

+0

不要忘記確保調用約定正確(cdecl/fast-call等)。請參閱:http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.callingconvention.aspx – plinth 2010-11-18 13:46:22

回答

0

您的編組代碼似乎是正確的,非託管方法的包佈局是什麼? LayoutKind.Sequential會將您的整數視爲4個字節。檢查這是否正確。