zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    MySQL 对于千万级的大表要怎么优化?
    随便写的一些docker使用操作命令
    零基础学python大概要多久?我用了30天
    普通人学python有意义吗?意义重大
    华为私有云组件
    Mysql 调优(二)分析思路
    MySQL 调优(一)调优原则
    shell脚本获取当前时间,分钟之前时间、小时之前时间和天之前时间
    java_windows环境变量自动设置脚本
    plsql中文乱码问题解决方案
  • 原文地址:https://www.cnblogs.com/hcfan/p/4160226.html
Copyright © 2011-2022 走看看