嘿! 我刚开始摆弄pinvoke并遇到问题。我得到了AccessViolationException。首先,有什么方法可以调试或追踪哪个字段导致此错误?唯一写入的是结果结构体。Pinvoke结构编组帮助需要 - System.AccessViolationException
C++的呼叫看起来像:
MyFunc(int var1, _tuchar *var2, _tuchar *var3, _tuchar *var4, MyStruct *Result,
_tuchar *var5, _tuchar *var6);
的C++结构:
typedef struct MyStruct
{
_tuchar *id;
_tuchar *ErrorMessages;
int int1;
_tuchar language[3];
_tuchar *result;
int type;
int number;
int *type2;
_tuchar **blocks;
}
C#的结构:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct MyStruct
{
[MarshalAs(UnmanagedType.LPStr)]
public string Id;
[MarshalAs(UnmanagedType.ByValArray, SizeConst=500)]
public char[] ErrorMessages;
public int int1;
[MarshalAs(UnmanagedType.LPStr)]
public string language;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 15)]
public char[] result;
public int type;
public int number;
public int type2;
[MarshalAs(UnmanagedType.ByValArray)]
public string[] blocks;
C#的方法声明:
[DllImport(MyPath, EntryPoint = "MyEntryPoint", SetLastError = true,
CharSet = CharSet.Unicode)]
internal static extern int MyFunc(int var1, string var2, string var3,
string var4, ref MyStruct Result, string var5, string var6);
C#的召唤:
var result = new MyStruct();
MyFunc(0, "var2", "var3", "var4", ref result, "var5", "var6");
希望我什么都不会被排除在外。 感谢您的帮助!
“MyFunc”声明在C#中是什么样的? – Justin 2011-04-28 05:18:01
啊我忘了一些东西,谢谢队友^^ – Dashu 2011-04-28 05:21:54
在C++中'int'的大小保证是32位/可以用System.Int32转换吗? System.Int32有一个非常精确的保证 - 即使是跨性别的。 – 2011-04-28 05:47:54