在C#中调用C-DLL函数时出现AccessViolationException

时间:2015-06-17 10:40:54

标签: c# exception dll

我试图用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,
    }
}

有谁知道问题的原因和地点?也许垃圾收集器确实清除了什么?当我查看反汇编时,我发现它在“调用”命令时崩溃了。如果您需要更详细的代码,请告诉我。

我希望你们中的任何人都可以帮助我。我从天开始就坐在这个问题上;)。

0 个答案:

没有答案