首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 图形图象-> CORELDRAW教程
关于c#中的dllimport_c#应用
作者:网友供稿 点击:0
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 

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);

http://www.cnblogs.com/KissKnife/archive/2006/11/04/549990.html


文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·使用Winsock控件,实现网络点对点通信-.NET教程,组件控件开发
·用正则表达式来校验数据的合法性-ASP教程,正则表达式
·java中实现IP地址的各种表现形式之间的转换-JSP教程,Java技巧及代码
·tomcat 中 /servlet url 映射-JSP教程,Jsp/Servlet
·coreldraw文字排版实战技巧
·javascript控制页面控件隐藏显示的两种方法-ASP教程,组件开发
·IIS的一个莫名错误Server Application Unavailable-ASP教程,ASP技巧
·什么是LDAP-PHP教程,PHP应用
·ibm联想将笔记本外包给quanta与wistron
·coreldraw版面设计教程
最新文章
·google关键词广告创建的十二高招_网赚技巧
·个人站长怎么样在短期内赚钱_网赚技巧
·颠峰对决:google adsense和百度主题推广_网赚技巧
·网站定位方法汇总篇_站长心得
·b2b网站探索合作新模式_站长心得
·分析一下网站赚不到钱的四大原因_站长心得
·什么是wiki?_站长心得
·留住访客 如何最优化设计网站的首页?(3)_站长心得
·google开始可以抓取框架内容_google推广
·google pagerank 技术解密 2_google推广
相关主题
  • 关于c#中的datetime类型的细节问题_c#应用
  • 关于c#中timer类 在c#里关于定时器类就有3个_c#应用
  • 关于c#中的事件处理机制_c#应用
  • 关于c#中枚举打印机_c#应用
  • 关于c#中两个DataGrid绑定到主表和子表的数据同步问题-.NET教程,C#语言
  • 西部数码虚拟主机

    友情链接
    CNNIC 西部数码
    万网 自助建站
    虚拟主机 asp空间
    域名注册 域名
    域名申请 主页空间
    论坛空间 网站空间
    国际域名 虚拟空间
    空间租用 DDOS防火墙
    成都主机托管 四川主机托管
    主机租用 服务器租用
    网站目录 自助建站
    虚拟主机 网址大全
    软件下载
    自助链接
    虚拟主机资讯 特价虚拟主机
    版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
    关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
    特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
    发表评论 打印  刷新     关闭