gpt4 book ai didi

c# - 当我调用从 dll 导入的方法时抛出 AccessViolationException

转载 作者:太空狗 更新时间:2023-10-29 21:44:30 25 4
gpt4 key购买 nike

在库的 C++ 头文件中有以下代码

#define STR_DATE        24+1    
#define STR_SIZE 32+1
#define STR_SSIZE 64+1
#define STR_MSIZE 128+1
#define STR_LSIZE 1024+1
#define STR_IPSIZE 15+1
#define STR_MOD_SIZE 20+1
#define STR_AGESIZE 4+1
#define STR_GENDERSIZE 1+1

typedef struct ADO_PINFO{
char P_ID[STR_SSIZE];
char F_Name[STR_SSIZE];
char M_Name[STR_SSIZE];
char L_Name[STR_SSIZE];

char Reg_Num[STR_SSIZE];
UINT nGender;
UINT nAge;

COleDateTime BirthDay;
char csBirthDay[STR_SIZE];

COleDateTime V_Date;
char csV_Date[STR_SIZE];

char Address[_MAX_PATH];
char SubAddress[_MAX_PATH];

char Telephone[STR_SIZE];
char H_Phone[STR_SIZE];

char csMail[STR_SSIZE];
char csPicName[_MAX_PATH];
COleDateTime InDate;
char csInDate[STR_SIZE];
}*PADO_PINFO;

_ADODLL long ADO_AddPatientData(const ADO_PINFO &pPatientInfo);

我正在尝试将 dll 导入我的 C# 应用程序:

[StructLayout(LayoutKind.Sequential)]
public struct ADO_PINFO
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 65)] public string P_ID;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 65)] public string F_Name;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 65)] public string M_Name;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 65)] public string L_Name;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 65)] public string Reg_Num;

public uint nGender;

public uint nAge;

public DateTime BirthDay;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 33)] public string csBirthDay;

public DateTime V_Date;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 33)] public string csV_Date;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] public string Address;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] public string SubAddress;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 33)] public string Telephone;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 33)] public string H_Phone;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 65)] public string csMail;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] public string csPicName;

public DateTime InDate;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 33)] public string csInDate;
}

public class VatechLibrary
{
[DllImport("AdodllE.dll")]
public static extern long ADO_AddPatientData(ref ADO_PINFO patientInfo);
}

但是当我尝试 co 调用它时:

var pInfo = new ADO_PINFO();
pInfo.P_ID = "77";
pInfo.F_Name = "name";

var res = VatechLibrary.ADO_AddPatientData(ref pInfo);

我收到 AccessViolationException。我做错了什么?

最佳答案

我能看到的问题:

  1. 您对 COleDateTime 字段的编码是错误的。那是因为 COleDateTime 是一个 C++ 类,它们根本不是二进制互操作的有效类型。和.net DateTime肯定不匹配。这肯定是您的访问冲突的根源。
  2. 该函数返回一个 C++ long,它在 Windows 上是 32 位宽。所以你的 C# 函数声明是错误的,因为 C# long 是 64 位宽。将 C# 中的返回值更改为 int
  3. 您的 C# 调用约定是 stdcall。 C++函数的调用约定是什么?这大概包含在 _ADODLL 中。您需要检查它是否是 stdcall。如果不指定调用约定,则为cdecl

COleDateTime 的问题是这里的大问题。其他的很容易固定。 COleDateTime 不是这样。您可以更改 C++ 代码以接受日期的互操作友好表示。如果您无法更改 C++ 代码来处理第 1 项的问题,那么您的解决方案将涉及编写混合模式 C++/CLI 包装器。

关于c# - 当我调用从 dll 导入的方法时抛出 AccessViolationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19932536/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com