1

我将Visual Basic 6.0中的函数转换为:

Declare Function RequestOperation Lib "archivedll" (ByVal dth As Long, ByVal searchRequestBuf As String, ByVal buflen As Long, ByVal FieldNum As Long, ByVal OP As Long, ByVal value As String) As Long

在 C# 中,我将函数声明为:

[DllImport("archivedll")]
public static extern int RequestOperation(int dth ,StringBuilder searchRequestBuf, int bufferLen, int fieldNum, int op, string value);

当从 C# 调用 RequestOperation 时,它会抛出一个异常:

[System.AccessViolationException] = {"试图读取或写入受保护的内存。这通常表明其他内存已损坏。"}

我已经成功地调用了许多其他这样的函数,但只有这个函数抛出了异常。

4

3 回答 3

3

这个函数显然没有抛出AccessViolationException- 相反,它通过“尝试读取或写入受保护的内存”来生成访问冲突错误。.NET 正在将该错误转换为AccessViolationException.

您必须弄清楚为什么它“试图读取或写入受保护的内存”。特别是,您是否初始化了StringBuilder您传递给它的?请发布您用于调用此方法的代码。

于 2009-11-10T04:56:40.680 回答
0
/// Return Type: int
///dth: int
///searchRequestBuf: BSTR->OLECHAR*
///buflen: int
///FieldNum: int
///OP: int
///value: BSTR->OLECHAR*
[System.Runtime.InteropServices.DllImportAttribute("<Unknown>", EntryPoint="RequestOperation")]

公共静态外部 int RequestOperation(int dth, [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.BStr)] 字符串 searchRequestBuf, int buflen, int FieldNum, int OP, [System.Runtime.InteropServices.MarshalAsAttribute( System.Runtime.InteropServices.UnmanagedType.BStr)] 字符串值) ;

于 2009-11-10T17:35:14.227 回答
0

我认为StringBuilder函数声明中的 与它有关。你应该使用 plainString代替。

于 2009-11-10T05:06:23.000 回答