【问题标题】:AccessViolationExceptiond: Attempted to read/write protected memoryAccessViolationExceptiond:试图读/写受保护的内存
【发布时间】:2013-04-12 18:33:50
【问题描述】:

我有一个用 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 ...
    );

有谁知道问题出在哪里?

【问题讨论】:

  • 你试过用谷歌搜索这个吗?我很确定您已经找到了一些有用的答案,即使在 stackoverflow 中也是如此。

标签: c# c dll dllimport access-violation


【解决方案1】:

没有代码很难回答您的问题,但您可以按照 msdn 的建议使用以下步骤

前往

工具->选项

调试->常规

取消选中选项“在模块加载时抑制 JIT 优化”

【讨论】:

    【解决方案2】:

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

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

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

    在构建后事件中。

    【讨论】:

    • 请提供更多详细信息,提前致谢。
    • 查看您在此处发布的另一个问题 (stackoverflow.com/questions/15925884/…),这可能是编组问题。编辑您的问题并向我们展示 C 中函数的原始签名和 C# 中的 DllImport 语句。
    • 请查看我的 c 声明和 c# 中的 c# DLLImport 语句,并告诉我在我的 c# 代码中需要进行哪些更改。
    • 相当复杂。有一些“结构” - 你使用顺序布局属性吗? int - 它们真的是 16 位整数吗?字符串 - 字符集问题? StdCall 与 CDecl?
    • 是的,我使用了顺序布局属性。 int 是 16 位整数,字符串 - 字符集没有任何问题,我的 c 程序正确接受我的字符串参数。
    【解决方案3】:

    我建议如下:

    考虑到 DLL 返回一个指向内存的指针,请确保对您的数据/参数进行编组。您可以使用 INTPTR 指向 DLL 分配的内存。

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

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2010-11-17
      • 1970-01-01
      • 2011-01-29
      • 2011-01-08
      • 2012-09-21
      • 2012-04-16
      • 2020-07-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多