Правильное преобразование функции / marshall C и типа структуры DLL в C#

#c #c#-4.0 #interop #marshalling

#c #c #-4.0 #взаимодействие #маршаллинг

Вопрос:

Может кто-нибудь, пожалуйста, помочь мне преобразовать мою структуру / функцию C в 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);
}