我在 dll 中有以下 C 代码签名:
extern __declspec(dllexport) unsigned char *
funct_name (int *w, int *h, char **enc, int len, unsigned char *text, int *lp, int *mp, int *ep)
C 函数可以修改 w、h、enc、lp、mp 和 ep(尽管后三个可以为 null,它不会做任何事情。
我在 C# 中使用以下内容
[DllImport("iec16022ecc200.dll", EntryPoint = "iec16022ecc200", ExactSpelling = false, CharSet = CharSet.Ansi, SetLastError = true, CallingConvention=CallingConvention.Cdecl)]
static extern IntPtr CallEncode(
[In,Out,MarshalAs(UnmanagedType.LPArray)] Int32[] width,
[In,Out,MarshalAs(UnmanagedType.LPArray)] Int32[] height,
[In,Out,MarshalAs(UnmanagedType.LPStr)] ref StringBuilder encoding,
int barcodeLen,
[MarshalAs(UnmanagedType.LPStr)] StringBuilder barcode,
IntPtr lenp,
IntPtr maxp,
IntPtr eccp
);
public void Foo (string textToEncode,out int width, out int height) {
StringBuilder text = new StringBuilder(textToEncode);
StringBuilder encoding = new StringBuilder(new string('a', text.Length));
Int32[] w = new Int32[1];
Int32[] h = new Int32[1];
string encodedStr = Marshal.PtrToStringAnsi(CallEncode(w, h, ref encoding, text.Length, text, (IntPtr)0, (IntPtr)0, (IntPtr)0));
width = w[0];
height = h[0];
}
我收到了 SystemAccessViolation,但我不完全确定我的问题是什么时候出现的。