我试图用C#调用C DLL中的函数。当我这样做时,我得到一个AccessViolationException(..attempted读取或写入受保护的内存)。 我没有原始的C代码,只有DLL。 我很确定我对结构的编组是正确的。
该程序应通过USB连接与多通道分析仪通信。库中有许多功能。他们中的大多数工作正常。
FUNCTION的原始声明看起来像这样:
$(".container > div").wrapAll('<div class="style"></div>');
STRUCT的原始声明如下所示:
int32_t CN_API AddBoard(int32_t handle, ParamStruct Params, int32_t *bId);
ConnectionType是ENUM,如下所示:
typedef struct
{
ConnectionType LinkType;
int32_t LinkNum;
int32_t Node;
uint32_t BaseAddress;
char Address[ADDR_LEN + 1];
} ParamStruct;
和数组:
typedef enum
{
conn_USB = 0L,
conn_OpticalLink = 1L,
conn_ETH = 2L,
conn_Serial = 3L,
} ConnectionType;
我已将所有内容翻译成C#代码:
#define ADDR_LEN (255)
这是我的“主要代码”:
public class Digitizer
{
[DllImport("CNLib.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern unsafe int AddBoard(int handle, ParamStruct Params, ref int bId);
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Size = 276)]
public struct ParamStruct
{
[MarshalAs(UnmanagedType.I8)]
public ConnectionType LinkType;
public int LinkNum;
public int Node;
public uint BaseAddress;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string Address;
}
public enum ConnectionType : long
{
conn_USB = 0L,
conn_OpticalLink = 1L,
conn_ETH = 2L,
conn_Serial = 3L,
}
}
有谁知道问题的原因和地点?也许垃圾收集器确实清除了什么?当我查看反汇编时,我发现它在“调用”命令时崩溃了。如果您需要更详细的代码,请告诉我。
我希望你们中的任何人都可以帮助我。我从天开始就坐在这个问题上;)。