dll中的原结构是
typedef struct 
{
UCHAR   basicinfosec;//基础信息扇区
UCHAR   publicexchangesec;//公共交换信息扇区
UCHAR   WorkSec[13];//用于特定用途的扇区使用信息
} SEC_USED_INFO; //使用扇区信息
函数是
int GetLicInfo(LPSTR CommPassword,LPSTR UserPassword,UCHAR *SysCardNo,SEC_USED_INFO  &sec_used_status)我在c#中是这样定义的
结构体
public struct SEC_USED_INFO
    {
        public Byte basicinfosec;//基础信息扇区
        public Byte publicexchangesec;//公共交换信息扇区
        public Byte[] WorkSec;//用于特定用途的扇区使用信息
    }
函数
 [DllImport("a.dll", EntryPoint = "GetInfo", CharSet = CharSet.Ansi)]
  public static extern int GetInfo([MarshalAs(UnmanagedType.LPStr)]  string CommPassword, [MarshalAs(UnmanagedType.LPStr)] out string UserPassword, out int SysCardNo, out SEC_USED_INFO sec_used_status);调试时,老是出现"尝试读取或写入受保护的内存,这通常指示其他内存已损坏";用断点调试看出此函数前两个参数没有返回值,后面两个参数有返回!
请高手指点一二,急死了!

解决方案 »

  1.   

    public Byte[] WorkSec;//用于特定用途的扇区使用信息
    这里用marshal指定长度信息
      

  2.   

    [ StructLayout( LayoutKind.Sequential )]
    public class SEC_USED_INFO
        {
            public Byte basicinfosec;//基础信息扇区
            public Byte publicexchangesec;//公共交换信息扇区
           [ MarshalAs( UnmanagedType.ByValArray, SizeConst=13 )]         public Byte[] WorkSec;//用于特定用途的扇区使用信息
        }
      

  3.   

    楼上的老兄,还是不行啊!出现下面的错误!
      "运行库遇到了错误。此错误的地址为 0x79e812af,在线程 0xb00 上。错误代码为 0xc0000005。此错误可能是 CLR 中的 bug,或者是用户代码的不安全部分或不可验证部分中的 bug。此 bug 的常见来源包括用户对 COM-interop 或 PInvoke 的封送处理错误,这些错误可能会损坏堆栈"是不是这两个参数有问题
    [MarshalAs(UnmanagedType.LPStr)]  string CommPassword,
    [MarshalAs(UnmanagedType.LPStr)] out string UserPassword
    ?
    我转换错了?
      

  4.   

    把out 改成 ref。也不行啊!