在c#中调用dll中方法,目的是要得到struct数组中的数据
dll中函数签名如下:
[System.Runtime.InteropServices.DllImport("XXXXX.dll")]
public static extern char Test(byte[] ImBuf, int nr, int nc, out int nResult, LPRRecogRlt[] fwOcrRlt, int XXX);
其中LPRRecogRlt数据结构如下:
public struct LPRRecogRlt
{
public int ChLen ;
public char[] Code;
public int[] Score;
public int Type;
public int Color;
public int XLeft;
public int XRight;
public int YTop;
public int YBottom;
}
我的调用如下:
LPRRecogRlt[] fwOcrRlt = new LPRRecogRlt[5];
//初始化一些数据,不重要
for (int t = 0; t < fwOcrRlt.Length; t++)
{
fwOcrRlt[t].ChLen = 0;
fwOcrRlt[t].Type = 0;
fwOcrRlt[t].Color = 1;
fwOcrRlt[t].XLeft = 10;
fwOcrRlt[t].XRight = 10;
fwOcrRlt[t].YBottom = 20;
fwOcrRlt[t].YTop = 20;
fwOcrRlt[t].Code = new char[12];
fwOcrRlt[t].Score = new int[12];
}
//******************************char result = Test(data, test.Height / 2, test.Width, out nresult, fwOcrRlt, 1);
运行是有如下问题:
未处理的异常: System.ArgumentException: 参数不正确。 (异常来自 HRESULT:0x800700
57 (E_INVALIDARG))
在 jpegtest.DLLMethod.FenWei_Car_Recog(Byte[] ImBuf, Int32 nr, Int32 nc, Int3
2& nResult, LPRRecogRlt[] fwOcrRlt, Int32 CarIndex)
在 jpegtest.testCarRecognition.testRec() 位置 D:\code\StationManagementSystem
\jpegtest\testCarRecognition.cs:行号 39
在 jpegtest.testCarRecognition.Main() 位置 D:\code\StationManagementSystem\jp
egtest\testCarRecognition.cs:行号 66
请按任意键继续. . .求教各位大侠~~~,泪奔中
dll中函数签名如下:
[System.Runtime.InteropServices.DllImport("XXXXX.dll")]
public static extern char Test(byte[] ImBuf, int nr, int nc, out int nResult, LPRRecogRlt[] fwOcrRlt, int XXX);
其中LPRRecogRlt数据结构如下:
public struct LPRRecogRlt
{
public int ChLen ;
public char[] Code;
public int[] Score;
public int Type;
public int Color;
public int XLeft;
public int XRight;
public int YTop;
public int YBottom;
}
我的调用如下:
LPRRecogRlt[] fwOcrRlt = new LPRRecogRlt[5];
//初始化一些数据,不重要
for (int t = 0; t < fwOcrRlt.Length; t++)
{
fwOcrRlt[t].ChLen = 0;
fwOcrRlt[t].Type = 0;
fwOcrRlt[t].Color = 1;
fwOcrRlt[t].XLeft = 10;
fwOcrRlt[t].XRight = 10;
fwOcrRlt[t].YBottom = 20;
fwOcrRlt[t].YTop = 20;
fwOcrRlt[t].Code = new char[12];
fwOcrRlt[t].Score = new int[12];
}
//******************************char result = Test(data, test.Height / 2, test.Width, out nresult, fwOcrRlt, 1);
运行是有如下问题:
未处理的异常: System.ArgumentException: 参数不正确。 (异常来自 HRESULT:0x800700
57 (E_INVALIDARG))
在 jpegtest.DLLMethod.FenWei_Car_Recog(Byte[] ImBuf, Int32 nr, Int32 nc, Int3
2& nResult, LPRRecogRlt[] fwOcrRlt, Int32 CarIndex)
在 jpegtest.testCarRecognition.testRec() 位置 D:\code\StationManagementSystem
\jpegtest\testCarRecognition.cs:行号 39
在 jpegtest.testCarRecognition.Main() 位置 D:\code\StationManagementSystem\jp
egtest\testCarRecognition.cs:行号 66
请按任意键继续. . .求教各位大侠~~~,泪奔中
解决方案 »
- 关于winform两个datagridview的CellFormatting
- 请问像这样的命名"xxx.xx.SC"SC是什么的缩写??
- c#的WinForm中用listview显示图片,会内存泄露吗?
- (急!!)JAVASCRIPT与C#数据传输问题
- 共享一个医院信息管理系统源码(Smart Client + C#)
- 请教:在c#中怎样连接access数据库?怎么读取xml里面的参数。谢谢!
- 在webBrowser中显示图片的时候,如果图片是内存中的流(非物理文件),该如何处理。?
- 如何将ListView中的数据放到一个DataSet里面?
- .NET Remoting 实现中,如何限制连接的客户端的数量
- 向大家请教:哪一种mailServer最好,邮箱用户上限可以达到20万以上?我公司想购买。
- winform程序随系统自动运行,并驻留在系统托盘中。怎样实现启动完成后出一个提示,就像有道词典一样,然后自动关闭提示
- 跪求例子!!
BOOLEAN=System.Int32
BYTE=System.UInt16
CHAR=System.Int16
COLORREF=System.UInt32
DWORD=System.UInt32
DWORD32=System.UInt32
DWORD64=System.UInt64
FLOAT=System.Float
HACCEL=System.IntPtr
HANDLE=System.IntPtr
HBITMAP=System.IntPtr
HBRUSH=System.IntPtr
HCONV=System.IntPtr
HCONVLIST=System.IntPtr
HCURSOR=System.IntPtr
HDC=System.IntPtr
HDDEDATA=System.IntPtr
HDESK=System.IntPtr
HDROP=System.IntPtr
HDWP=System.IntPtr
HENHMETAFILE=System.IntPtr
HFILE=System.IntPtr
HFONT=System.IntPtr
HGDIOBJ=System.IntPtr
HGLOBAL=System.IntPtr
HHOOK=System.IntPtr
HICON=System.IntPtr
HIMAGELIST=System.IntPtr
HIMC=System.IntPtr
HINSTANCE=System.IntPtr
HKEY=System.IntPtr
HLOCAL=System.IntPtr
HMENU=System.IntPtr
HMETAFILE=System.IntPtr
HMODULE=System.IntPtr
HMONITOR=System.IntPtr
HPALETTE=System.IntPtr
HPEN=System.IntPtr
HRGN=System.IntPtr
HRSRC=System.IntPtr
HSZ=System.IntPtr
HWINSTA=System.IntPtr
HWND=System.IntPtr
INT=System.Int32
INT32=System.Int32
INT64=System.Int64
LONG=System.Int32
LONG32=System.Int32
LONG64=System.Int64
LONGLONG=System.Int64
LPARAM=System.IntPtr
LPBOOL=System.Int16[]
LPBYTE=System.UInt16[]
LPCOLORREF=System.UInt32[]
LPCSTR=System.String
LPCTSTR=System.String
LPCVOID=System.UInt32
LPCWSTR=System.String
LPDWORD=System.UInt32[]
LPHANDLE=System.UInt32
LPINT=System.Int32[]
LPLONG=System.Int32[]
LPSTR=System.String
LPTSTR=System.String
LPVOID=System.UInt32
LPWORD=System.Int32[]
LPWSTR=System.String
LRESULT=System.IntPtr
PBOOL=System.Int16[]
PBOOLEAN=System.Int16[]
PBYTE=System.UInt16[]
PCHAR=System.Char[]
PCSTR=System.String
PCTSTR=System.String
PCWCH=System.UInt32
PCWSTR=System.UInt32
PDWORD=System.Int32[]
PFLOAT=System.Float[]
PHANDLE=System.UInt32
PHKEY=System.UInt32
PINT=System.Int32[]
PLCID=System.UInt32
PLONG=System.Int32[]
PLUID=System.UInt32
PSHORT=System.Int16[]
PSTR=System.String
PTBYTE=System.Char[]
PTCHAR=System.Char[]
PTSTR=System.String
PUCHAR=System.Char[]
PUINT=System.UInt32[]
PULONG=System.UInt32[]
PUSHORT=System.UInt16[]
PVOID=System.UInt32
PWCHAR=System.Char[]
PWORD=System.Int16[]
PWSTR=System.String
REGSAM=System.UInt32
SC_HANDLE=System.IntPtr
SC_LOCK=System.IntPtr
SHORT=System.Int16
SIZE_T=System.UInt32
SSIZE_=System.UInt32
TBYTE=System.Char
TCHAR=System.Char
UCHAR=System.Byte
UINT=System.UInt32
UINT32=System.UInt32
UINT64=System.UInt64
ULONG=System.UInt32
ULONG32=System.UInt32
ULONG64=System.UInt64
ULONGLONG=System.UInt64
USHORT=System.UInt16
WORD=System.UInt16
WPARAM=System.IntPtr
public struct LPRRecogRlt
{
public Int32 ChLen ;
public Int16[] Code;
public Int32[] Score;
public Int32 Type;
public Int32 Color;
public Int32 XLeft;
public Int32 XRight;
public Int32 YTop;
public Int32 YBottom;
}
运行后如下问题:未处理的异常: System.ArgumentException: 参数不正确。 (异常来自 HRESULT:0x800700
57 (E_INVALIDARG))
在 jpegtest.DLLMethod.FenWei_Car_Recog(Byte[] ImBuf, Int32 nr, Int32 nc, Int3
2& nResult, LPRRecogRlt[] fwOcrRlt, Int32 CarIndex)
在 jpegtest.testCarRecognition.testRec() 位置 D:\code\StationManagementSystem
\jpegtest\testCarRecognition.cs:行号 39
在 jpegtest.testCarRecognition.Main() 位置 D:\code\StationManagementSystem\jp
egtest\testCarRecognition.cs:行号 66
请按任意键继续. . .
问题出在一定要在引用dll方法的时候
方法签名的参数前面要加[in out]
也就是说如下:
public static extern char Test(byte[] ImBuf, int nr, int nc, out int nResult, [In, Out] LPRRecogRlt[] fwOcrRlt, int CarIndex);
数据结构如下:
[StructLayout(LayoutKind.Sequential)]
public struct LPRRecogRlt
{
[MarshalAs(UnmanagedType.I4,SizeConst=1)]
public int ChLen ;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
public char[] Code;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
public int[] Score;
[MarshalAs(UnmanagedType.I4, SizeConst = 1)]
public int Type;
[MarshalAs(UnmanagedType.I4, SizeConst = 1)]
public int Color;
[MarshalAs(UnmanagedType.I4, SizeConst = 1)]
public int XLeft;
[MarshalAs(UnmanagedType.I4, SizeConst = 1)]
public int XRight;
[MarshalAs(UnmanagedType.I4, SizeConst = 1)]
public int YTop;
[MarshalAs(UnmanagedType.I4, SizeConst = 1)]
public int YBottom;
}
调用如下
char result = DLLMethod.Test(data, test.Height / 2, test.Width, out nresult, fwOcrRlt, 1);
然后就OK了