MSDN中对DllImportAttribute的解释是这样的:可将该属性应用于方法。DllImportAttribute 属性提供对从非托管 DLL 导出的函数进行调用所必需的信息。作为最低要求,必须提供包含入口点的 DLL 的名称。
并给了一个示例:
[DllImport("KERNEL32.DLL", EntryPoint="MoveFileW", SetLastError=true,
CharSet=CharSet.Unicode, ExactSpelling=true,
CallingConvention=CallingConvention.StdCall)]
public static extern bool MoveFile(String src, String dst);
上网搜了一下,最常见的就是使用它来调用WIN32的API,例如上面所示。或者调用一下C或C++编写的DLL。
这东西没怎么用过。只是前几天忽然分配下一个临时的任务,做一个“停车厂管理”的小东西,听说是一个大干部的小孩子要弄这么个东西,那干部是公司的客户,讨论正经事之余又拜托了我们做这么个小东西。其中用到了单片机模拟车辆出入的一些信号。
我对单片机一窍不通,好在有人写好了轮询单片机的DLL,我只管调用,由于是C++写的,于是将DLL拷贝到BIN目录后(这DLLImport会从程序启动目录开始查找相应名称的DLL,未找到则转至system32下查找),用DllImport来调用,但在这个过程中遇到了几个问题:
1.看了一下C++的代码,需要用到的只有三个方法:
bool OpenSerialPort1()
bool fnGetIO(unsigned char& P1, unsigned char& P2, unsigned char& P3)
bool CloseSerialPort1()
于是就在自己的程序中写了:
using System.Runtime.InteropServices;
……
[DllImport("GetIODll.dll", EntryPoint = "OpenSerialPort1")]
public static extern bool OpenSerialPort1();
[DllImport("GetIODll.dll", EntryPoint = "fnGetIO")]
public static extern bool fnGetIO(ref byte P1, ref byte P2, ref byte P3);
[DllImport("GetIODll.dll", EntryPoint = "CloseSerialPort1")]
public static extern bool CloseSerialPort1();
然而程序在运行时无论如何总是提示“找不到入口点”,搞得懵了,只好上网搜去,最后下了一个叫eXeScope的小软件,装完之后查看该DLL,果然如贴子中写的,DLL中的函数名称发生了变化,分别成了:
?OpenSerialPort1@@YA_NXZ
?fnGetIO@@YA_NAAE00@Z
?CloseSerialPort1@@YA_NXZ
将这些怪怪的名称代入到EntryPoin中,编译运行,没有问题了。
2.可是接上单片机之后,问题又来了,虽然OpenSerialPort1返回的结果是true,但fnGetIO读出一数据全是0,按理应该是全1才对。来了一个同事,说反正有源码,把原来的DLL弄成标准C的试试,标准C不标准C的我也没明白,让那人给改了一下,把编译之后的DLL拷到自己程序的BIN下,将EntryPoin换成正常的函数名,运行,这回是真的OK了。
读写.ini文件时,也会用到DllImport,不过现在.ini文件好像用得少了,下面是读写的程序:
{
publicstring path;
[DllImport("kernel32")]
privatestaticexternlong WritePrivateProfileString(string section,string key,string val,string filePath);
[DllImport("kernel32")]
privatestaticexternint GetPrivateProfileString(string section,string key,string def,StringBuilder
retVal,int size,string filePath);
public IniFile(string INIPath)
{
path = INIPath;
}
publicvoid IniWriteValue(string Section,string Key,string Value)
{
WritePrivateProfileString(Section,Key,Value,this.path);
}
publicstring IniReadValue(string Section,string Key)
{
StringBuilder temp = new StringBuilder(255);
int i = GetPrivateProfileString(Section,Key,"",temp,255,this.path);
return temp.ToString();
}
}
网上关于DllImport的很多问题是由于所调方法的参数比较复杂,现在我还没用到,看到一篇贴子,参数中带指针的,也先录下来,以备将来查用:
参数是用指针来获取一个数组:Int GetData(byte * pBuffer)
pBuffer是数组的首地址,也就是说GetData会写pBuffer[0],pBuffer[1]....pBuffer[100];
答曰:
[DllImport("yourDllFile.dll"]
Private static extern int GetValue([MarshalAs(UnmanagedType.LPArray)]byte[] pValue);
如果是out参数,可以如下
[DllImport("yourDllFile.dll")]
Private static extern int GetValue([Out,MarshalAs(UnmanagedType.LPArray)]byte[] pValue);
关于C#中的DLLImport (引)
相关文章:

Bootstrap框架和inconfont、font-awesome使用
Bootstrap框架和inconfont、font-awesome使用 iconfont的使用:https://www.cnblogs.com/clschao/articles/10387580.html Bootstrap介绍 Bootstrap是Twitter开源的基于HTML、CSS、JavaScript的前端框架。 它是为实现快速开发Web应用程序而设计的一套前端工具包。 它…

spark编程基础--6.DataFrame
使用spark安装时自带的样例数据people.json文件,生成DataFrame: 下面从示例文件people.json中创建一个DataFrame,然后保存成csv格式文件,代码如下: scala> val peopleDF spark.read.format("json").loa…

firebug 的使用
[Firebug - Console控制台视图] console API文档, http://www.getfirebug.com/console.html console.info显示(i)图标 在输出时,需要注意第一个参数被自动识别为格式字符串 需要在页面加载前启动firebug,当页面加载后启动firebug时,就没有…

cisco PIX防火墙的配置及注解完全手册
PIX Version 6.3(1)interface ethernet0 auto 设定端口0 速率为自动interface ethernet1 100full 设定端口1 速率为100兆全双工interface ethernet2 auto 设定端口2 速率为自动nameif ethernet0 outside security0 设 定端口0 名称为 outside 安全级别为0nameif ethernet1 insi…

C/C++:*(p++)慎用!!!!!
各位代码界的大佬大家好,今天跟大家分享一个在C/C中常用,但是很危险的一串代码——*(p) 为什么说这一行代码比较危险呢,因为对于C/C来说,成也指针,败也指针。C/C中指针便于我们操作一块连续的内存空间中内容࿰…

Kindeditor学习中的那些坑
Kindeditor富文本编辑器还算比较好上手的一款插件吧,下面记录一下我在学习和实践中遇到的那些坑。 编辑器初始化方法和参数网上一搜一大把,不想搜的点这里,文档上各个参数已经写得很清楚了,直接拿过来用就OK 开始说一些实际用到时…

java2实用教程--第二章基本数据类型与数组
基本数据类型--浮点类型 public class Example2_1 {public static void main (String args[]) {char chinaWord 好,japenWord あ;char you \u4F60;int position 20320;System.out.println("汉字:"chinaWord"的位置:"(int)china…

EntityCURD操作的参数和返回值
以下是netbeans根据实体自动生成的CURD模板:/** To change this template, choose Tools | Templates* and open the template in the editor.*/package com.medea.order.session;import com.medea.order.entity.Storeorder;import java.util.List; import javax.ej…

[ZT]SQL Server 的事务日志意外增大或充满的处理方法
http://support.microsoft.com/kb/317375 事务日志文件Transaction Log File是用来记录数据库更新情况的文件,扩展名为ldf。在 SQL Server 7.0 和 SQL Server 2000 中,如果设置了自动增长功能,事务日志文件将会自动扩展。一般情况下ÿ…

powershell真香
写毕设开题报告,从PDF复制后会有多余空格,一个一个手动删除略显麻烦。 delete.cpp#include<iostream> #include<cstdio> #include<string> #include<vector> using namespace std; int main() {//freopen("UAS.txt",&…

背包的硬币问题
在一个国家仅有1分,2分,3分硬币,将钱N兑换成硬币有很多种兑法。请你编程序计算出共有多少种兑法。 HDU 1284 #include <iostream> using namespace std;const int M 32768 10;int dp[M];int main() {int n;while (~scanf("%d&q…

【转帖】OnPreRender Render的区别
转自:http://hi.baidu.com/trip008/blog/item/d6139ab77b5414f130add1e9.html protected override void OnPreRender(EventArgs e) protected override void Render(HtmlTextWriter writer) 这两个的区别。可否告知 asp.net页面在触发各个子控件的事件之后&#…

微信小程序如何进行登录授权和获取用户信息
微信小程序如何进行登录授权和获取用户信息

禁止windows系统的自动运行功能
禁用Windows 系统的自动播放功能的方法:在运行中输入 gpedit.msc 后回车,打开组策略编辑器,依次点击:计算机配置->管理模板->系统->关闭自动播放-…

WCF配置文件全攻略
Code<?xml version"1.0" encoding"utf-8" ?><configuration> <system.ServiceModel> <!-- services 元素包含应用中驻留的所有service的配置要求 --> <services> <!-- 每个服务的…

图的算法专题——最小生成树
概要: Prim算法Kruskal算法1、Prim算法 算法流程: (1)对图G(V,E)设置集合S来存放已被并入的顶点,然后执行n次(2)(3) (2)每…

GridControl摘录
gvCabTotalInfo.Columns["出线平均<br>电压"].SummaryItem.SummaryType DevExpress.Data.SummaryItemType.Average; gvCabTotalInfo.Columns["出线平均<br>电压"].SummaryItem.DisplayFormat "平均:{0:N2}"; gvCabTotalInfo.Refre…

小程序将form表单数据写入云数据库
小程序将form表单数据写入云数据库 <!--pages/MyIncome/MyIncome.wxml--> <view classforms><form bindsubmitgetForm><view classgetform><view>用戶名:<input typetext nameusername placeholder請輸入用戶名/></view><view&g…
ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl
第四章 组合控件开发CompositeControl 大家好,今天我们来实现一个自定义的控件,之前我们已经知道了,要开发自定义的控件一般继承三个基 类:Control,WebControl,还有一个就是今天要说的CompositeControl。系列文章链接:ASP.NET自…

[C++对象模型][6]sizeof与对象内存布局
有了前面几节的铺垫,本节开始摸索C的对象的内存布局,平台为windows32位VS2008。 一 内置类型的size 内置类型,直接上代码,帮助大家加深记忆: Codevoid TestBasicSizeOf() { cout << __FUNCTION__ << e…

Linux负载均衡实现
配置之前清空所有服务器防火墙规则iptables -F关闭selinux:1、/usr/sbin/sestatus -v ##如果SELinux status参数为enabled即为开启状态SELinux status: enabled2、getenforce ##也可以用这个命令检查关闭SELinux:1…

【bzoj2770】YY的Treap 权值线段树
题目描述 志向远大的YY小朋友在学完快速排序之后决定学习平衡树,左思右想再加上SY的教唆,YY决定学习Treap。友爱教教父SY如砍瓜切菜般教会了YY小朋友Treap(一种平衡树,通过对每个节点随机分配一个priority,同时保证这棵…

第二章 数据类型、运算符与表达式
#include <stdio.h> #include <stdlib.h>int Add(int a,int b) {return ab; }int main() {int x,y,sum 0;printf("Input two integers:\n");scanf("%d%d",&x,&y);sum Add(x,y);printf("sum %d\n",sum);return 0; }计算圆…

从设计原则谈软件开发(二)
最近一直在一个培训公司做着极为无聊的培训,所以一直都没有时间上网。今天突然发现这里可以上无线,嘿嘿,就上来继续把这个文章完成。 上次说到了设计原则中的单一职责原则,今天时间比较紧,我就继续往下写,也…

Npm环境依赖重置
需要彻底删除node_modules 然后npm install 如果无法删除node_modules文件,可以试试这个: 安装RimRaf: npm install rimraf -g 并在项目文件夹中删除node_modules文件夹: rimraf node_modules 然后你可以去npm install转载于:http…

MySQL的information_schema
在一次清空一张比较大的表时(在清空前占用400多兆),发现该表中记录为0条但是空间并没有被释放,采用下面方式可查看占用情况 -- 查询各个数据库占用磁盘的情况 select TABLE_SCHEMA, concat(truncate(sum(data_length)/1024/1024,2…

编写spring应用
测试类自动注入失败:RunWith(SpringRunner.class)详解 CtrlAltDelete键,打开任务管理器,结束占据8080端口的Tomcat进程。 HomeController.java <!DOCTYPE html> <html xmlns"http://www.w3.org/1999/xhtml"xmlns:th&quo…

[导入]Learning.ASP.NET 2.0.with.AJAX.pdf(14.14 MB)
ASP.NET 2.0的AJAX无疑是最快,最有效,最可靠和最佳的方式支持创建交互式Web应用程序上市。结合开发工具,可以从Microsoft ,免费和商业,这是难以置信轻松地创建网站,看看伟大的表现良好。最重要的是…
c# IO线程 打造 定时打开指定程序
用IO以及线程轻松实现 定时器 ,在指定的时间打开指定的程序:) 首先是如何实现定时?这可以单独的用个线程,在时间到的时候打开程序 然后是如何打开程序 ,用Process.Start就可以了 最后就是如何把程序列表保存…

Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy
Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程…