0

我有一个DLL用 C 编写的文件。我尝试在我的 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 ...
    );

有谁知道问题是什么?

4

3 回答 3

0

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

工具->选项

调试->常规

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

于 2013-04-11T08:27:10.937 回答
0

我建议如下:

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

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

希望这可以帮助。

于 2013-04-12T08:26:30.593 回答
0

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

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

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

在 postbuild 事件中。

于 2013-04-11T09:26:46.127 回答