我有一个用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 ...
);
有谁知道问题是什么?
答案 0 :(得分:0)
如果没有代码,很难回答您的问题,但您可以按照msdn
的建议使用以下步骤转到
工具 - >选项
Debugging->常规
取消选中“禁止模块加载时JIT优化”选项
答案 1 :(得分:0)
声明,例如编组参数cdecl / stdcall可能是错误的。
它也可能是数据执行保护(DEP)问题。在这种情况下,请使用
editbin.exe /NXCOMPAT:NO "$(TargetPath)"
在后期活动中。
答案 2 :(得分:0)
我建议如下:
考虑到DLL将POINTER返回到内存,请确保对数据/参数进行封送处理。您可以使用INTPTR指向DLL分配的内存。
此外,请确保DLL不会隐式删除已分配的内存。如果是,请考虑重写DLL代码(如果可能)
希望这有帮助。