2011-10-20 7 views
-2

私のC構造体/関数をC#に変換する手助けがありますか?正しい変換/マーシャル関数とDLL構造体の型をC#

正しく関数を変換し、構造を適切にマーシャリングできれば、DLLを正しく呼び出すことができると思います。

typedef struct UIclient_info { 
    char name[50]; 
    int age; 
    SECONDUSER *stParent; 
} FIRSTUSER; 

typedef struct ui_product_form {  
    char m_sCoupon; 
    double amountTotal; 
    char m_sErrorCode[50]; 
    SUBPRODUCT *pstSubProduct; 
} PRODUCT; 

typedef struct tagReport 
{ 
    REPORTSUMMARY *pstRepsum; 
    char errorMsg[100]; 
} FINAL_REPORT; 

int Save(FIRSTUSER *myUser, PRODUCT *uiStructure); 
FINAL_REPORT GenerateReport(FIRSTUSER *myUser, PRODUCT *uiStructure); 

答えて

1

これは、または動作しない場合があります。

は、ここに私の構造体と、それを使用する関数です。あなたはそれを試すことができますか、私はポインタを正しく処理したかどうかわかりません。私はこれについて他のサポートを提供することはできません。それが動作すれば、それは動作します。そうでなければ...ああ。

//typedef struct UIclient_info { 
// char name[50]; 
// int age; 
// SECONDUSER *stParent; 
//} FIRSTUSER; 

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)] 
public struct FirstUser 
{ 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst=50)] 
    public string Name; 
    public int Age; 
    [MarshalAs(UnmanagedType.LPStruct)] 
    public IntPtr Parent; 
} 

//typedef struct ui_product_form {  
// char m_sCoupon; 
// double amountTotal; 
// char m_sErrorCode[50]; 
// SUBPRODUCT *pstSubProduct; 
//} PRODUCT; 

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)] 
public struct Product 
{ 
    public char Coupon; 
    public double AmountTotal; 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst=50)] 
    public string ErrorCode; 
    [MarshalAs(UnmanagedType.LPStruct)] 
    public IntPtr SubProduct; 
} 

//typedef struct tagReport 
//{ 
// REPORTSUMMARY *pstRepsum; 
// char errorMsg[100]; 
//} FINAL_REPORT; 

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)] 
public struct FinalReport 
{ 
    [MarshalAs(UnmanagedType.LPStruct)] 
    public IntPtr ReportSummary; 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst=100)] 
    public string ErrorMsg; 
} 

static class MyLibraryHelper 
{ 
    //int Save(FIRSTUSER *myUser, PRODUCT *uiStructure); 

    [DllImport(@"MyLibrary.dll", CharSet=CharSet.Ansi)] 
    internal static extern int Save(IntPtr myUser, IntPtr uiStructure); 

    //FINAL_REPORT GenerateReport(FIRSTUSER *myUser, PRODUCT *uiStructure); 

    [DllImport(@"MyLibrary.dll", CharSet=CharSet.Ansi)] 
    internal static extern FinalReport GenerateReport(IntPtr myUser, IntPtr uiStructure); 
}