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

    加上,所以报错。

    不说了,说多了都是泪。

    欢迎指正:haizi2014@qq.com
  • 相关阅读:
    [POI2009]SLOElephants
    java回顾之集合概述
    java回顾之初始化
    java回顾之包装类
    java回顾之Set
    action,category
    java回顾之继承 二
    java回顾之TreeSet
    java回顾之final
    java回顾之继承
  • 原文地址:https://www.cnblogs.com/hcfan/p/4160226.html
Copyright © 2020-2023  润新知