问题:
当我用
[DllImport("*.dll", EntryPoint = "*",CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
调用外部dll文件做身份证读卡的时候,出现如图的错误
令我很是意外,查其原因:
托管代码与非托管代码之间的相互调用,数据交换的问题。
那么问题来了,什么是托管代码,什么是非托管代码?
经百度得知,托管代码指的是必须依靠.NET框架解释运行的代码,非托管代码一般指的是传统的不需要借助.NET框架解释的代码。
在.NET出现之前,如VB,C++,DELPHI编写的程序都是非托管代码。
下面贴出我做数据定义的一些代码:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 8)] public struct PersonInfor { [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)] public string name; }
大家可以看到,跟平常定义属性不太一样,少了set,get 多了两个中括号。
下面来简单解释一下:
MarshalAs属性指示如何在托管代码和非托管代码之间封送数据。
UnmanagedType.ByValTStr 是数据类型。
SizeConst 是数据大小。
StructLayout 是结构体要加的属性,别问我为什么,我也不知道。
LayoutKind.Sequential属性让结构体在导出到非托管内存时按出现的顺序依次布局。
CharSet = CharSet.Unicode 很明显是字符格式。
Pack = 8 这个应该和外部的dll 定义有关系。
介绍到这里,下面说一下我为什么会出现这个错误,是因为我没有将
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 8)]
加上,所以报错。
不说了,说多了都是泪。