DllImport 相关错误

问题:

当我用

[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)]

加上,所以报错。

不说了,说多了都是泪。

时间: 2024-10-26 03:57:36

DllImport 相关错误的相关文章

OpenStack虚机相关错误

OpenStack配置起来还是挺麻烦的,特别是网络那块.虽然官方文档越来越清晰,但有时还是会出各种错.排错主要是看日志.看官方文档和google 以下就一些虚机相关常见的错误做一下总结(基于Icehouse版): 1.起虚机时报 'No valid host' 错误 个人觉得 No valid host 是比较简单的错,那几个单词的意思就已经告诉我们很多信息了,No valid host 原因有很多种 (1)nova compute服务异常,用openstack-status查看各个服务是否是a

Oracle中字符缓冲区相关错误

一.buffer overflow,limit of 10000 bytesdeclarebeginfor c in 1..1000 loop dbms_output.put_line('测试测试测试');end loop;end;缓冲区默认大小为10000 bytes.循环1000次就一共有6000个汉字,也就是12000 bytes.在SQL窗口的输出标签页中设置缓冲区大小. 二.数字或值错误:字符串缓冲区太小declarev varchar2(100):='';beginfor c in

C++调用Java方法时jvm.dll相关错误 【每次记录完后都被瞬间解决了……】

在编程的学习过程中,愈发感觉到了女性思维在这方面的局限性. 背景介绍: 为了学习JNI中C++对Java的调用,在阅读<JNI技术手册>的同时加以练习.但根据示例代码编写过程中总出现各种 奇怪的问题(一度后悔自己装了win7 64位系统,而电脑之前是预装win8 32位的...).由于Java部分的代码非常简单, 没有出现任何错误,javac.javah命令也能正常输出.class文件和头文件.但C++部分却报错了.所学习的示例代码意图 通过C++调用Java,生成一个.exe的启动文件. J

sql server 2008 相关错误整理(win7系统)

1.在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误.未找到或无法访问服 务器.请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接. step1:开始菜单-->如图找到sql server配置管理器 step2:打开配置管理器,如图所示 step3:右键属性如图: 里面有好多TCP/IP的端口,找到,更改IP地址 为自己电脑的IP地址(或者是127.0.0.1) 在TCP端口添加1433,已启用,更改为:是,然后单击应用,确定. step4:重新启动服

Ubuntu16.04编译Android6.0/cm13.0教程及相关错误解决办法

一.必备工作 1.安装依赖库 sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib git flex bison gperf build-essential libncurses5-dev:i386 tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386 dpkg-dev libsdl1.2-dev li

MySQL 5.6数据导入报 GTID 相关错误

用命令行mysql -uroot -p --default-character-set=<character> -f <dbname> < <backup.sql> 方式会报如下错误: ERROR 1839 (HY000) at line 24: @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_MODE = ON. 可以通过 source 方式导入解决. $ mysql -uroot -p$ use

解决Spring4.X 报MappingJacksonHttpMessageConverter相关错误

MappingJacksonHttpmessageConverter错误 spring4.x 应该使用jackson2以上的jar包,不然会导致冲突,找不到org.springframework.http.converter.json.MappingJacksonHttpMessageConverter 在spring4.x中请用org.springframework.http.converter.json.MappingJackson2HttpMessageConverter 并将maven依

网页相关状态编码(相关错误提示)

在写页面时可能会遇到的常见问题 1xx-信息提示这些状态代码表示临时的响应.客户端在收到常规响应之前,应准备接收一个或多个1xx响应. 100-继续.101-切换协议. 2xx-成功这类状态代码表明服务器成功地接受了客户端请求.200-确定.客户端请求已成功.(重点)201-已创建.202-已接受.203-非权威性信息.204-无内容.205-重置内容.206-部分内容. 3xx-重定向客户端浏览器必须采取更多操作来实现请求.例如,浏览器可能不得不请求服务器上的不同的页面,或通过代理服务器重复该

python技巧及相关错误

文件: 打开文件时,如果报错提示GBK,可能是文件内容的编码问题,可以打开时加上参数:open(filename=path,encoding=None) -------------------------------------------------------------------------------------------序列: 列表.元组和字典均可以使用索引的方式来获取值,列表和元组得到的是索引值,而字典得到则是Key.dict1.setdefault(x,y)------追加到字