AccessViolationExceptiond:尝试读取/写入受保护的内存

时间:2013-04-11 08:15:39

标签: c# c dll dllimport access-violation

我有一个用C语言编写的DLL文件。我尝试在C#代码中使用C DLL(ImportDLL)。我的方法返回参数。正确调用C方法但在处理后崩溃并给出错误**"System.AccessViolationException: Attempted to read or write protected memory.

这通常表明其他内存已损坏,“**在完成流程后。

我的C声明

int preProcessAndBestImagesC(
      char* ...,
      size_t* ...,
      char** ...,
      size_t* ...,
      (struct)* ...,
      size_t* ...,
      int** ...,
      (struct)** ...,
      int ...,
      int printStatus
    );

我的C#宣言

[DllImport(@"abc.dll", CallingConvention = CallingConvention.StdCall, SetLastError = true, BestFitMapping = true, EntryPoint = "xxx")]
    [return: MarshalAs(UnmanagedType.I4)]
    unsafe private static extern int xxx(
        String p_ ...,                                               
        [MarshalAs(UnmanagedType.I2)] out UInt16 p_numImageFilesOrDirs,

        String[] p_vecImageFilesOrDirs,             

        [MarshalAs(UnmanagedType.I2)] out UInt16 ...,
        [MarshalAs(UnmanagedType.LPArray)] out (struct)[] ...,
        [MarshalAs(UnmanagedType.I2)] out UInt16 ...,
        out Int16[] ...,
        [MarshalAs(UnmanagedType.LPArray)] out (struct)[] ...,
        [MarshalAs(UnmanagedType.I2)] Int16 ...,
        [MarshalAs(UnmanagedType.I2)] Int16 ...
    );

有谁知道问题是什么?

3 个答案:

答案 0 :(得分:0)

如果没有代码,很难回答您的问题,但您可以按照msdn

的建议使用以下步骤

转到

工具 - >选项

Debugging->常规

取消选中“禁止模块加载时JIT优化”选项

答案 1 :(得分:0)

声明,例如编组参数cdecl / stdcall可能是错误的。

它也可能是数据执行保护(DEP)问题。在这种情况下,请使用

editbin.exe /NXCOMPAT:NO "$(TargetPath)"

在后期活动中。

答案 2 :(得分:0)

我建议如下:

考虑到DLL将POINTER返回到内存,请确保对数据/参数进行封送处理。您可以使用INTPTR指向DLL分配的内存。

此外,请确保DLL不会隐式删除已分配的内存。如果是,请考虑重写DLL代码(如果可能)

希望这有帮助。