#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);
}