在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:codeStationManagementSystem 
jpegtest estCarRecognition.cs:行号   
39  
      在   jpegtest.testCarRecognition.Main()   位置   D:codeStationManagementSystemjp 
egtest estCarRecognition.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了
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值