广告
返回顶部
首页 > 资讯 > 精选 >C# 中DllImport的作用是什么
  • 670
分享到

C# 中DllImport的作用是什么

2023-06-17 23:06:14 670人浏览 薄情痞子
摘要

C# 中DllImport的作用是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。MSDN中对DllImport Attribute的解释是这样的:可将该属性

C# 中DllImport的作用是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

MSDN中对DllImport Attribute的解释是这样的:可将该属性应用于方法。DllImport Attribute 属性提供对从非托管 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来调用,但在这个过程中遇到了几个问题:

看了一下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中,编译运行,没有问题了。

可是接上单片机之后,问题又来了,虽然OpenSerialPort1返回的结果是true,但fnGetIO读出一数据全是0,按理应该是全1才对。来了一个同事,说反正有源码,把原来的DLL弄成标准C的试试,标准C不标准C的我也没明白,让那人给改了一下,把编译之后的DLL拷到自己程序的BIN下,将EntryPoin换成正常的函数名,运行,这回是真的OK了。

读写.ini文件时,也会用到C# 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();   }   }

网上关于C# 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);

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网精选频道,感谢您对编程网的支持。

--结束END--

本文标题: C# 中DllImport的作用是什么

本文链接: https://www.lsjlt.com/news/294104.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C# 中DllImport的作用是什么
    C# 中DllImport的作用是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。MSDN中对DllImport Attribute的解释是这样的:可将该属性...
    99+
    2023-06-17
  • C++中declspec(dllexport)和declspec(dllimport) 的用法介绍
    一、创建动态文件 1.添加头文件dll.h,并输入以下代码: #ifdef DLL_EXPORTS //如果在工程里已经添加预定义宏DL...
    99+
    2022-11-13
  • c++中类的作用是什么
    在 C++ 中,类是一种用户自定义的数据类型,用于封装数据和方法以实现特定的功能。类的作用在于: 封装数据:类可以将相关的数据和...
    99+
    2023-10-24
    c++
  • C#中TimeSpan的作用是什么
    TimeSpan是C#中的一个结构,用于表示时间间隔。它可以用于计算日期和时间之间的差异,并且可以执行与时间相关的数学运算,如加法、...
    99+
    2023-10-23
    C#
  • C# 中using的作用是什么
    本篇文章为大家展示了C# 中using的作用是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。C# using作用,微软MSDN上解释总共有三种用途:引用命名空间。2、为命名空间或类型创建别名。3...
    99+
    2023-06-17
  • C#中Arraylist的作用是什么
    C#中Arraylist的作用是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Arraylist类似于一维动态数组,在Arraylist中可以存放任何对像,...
    99+
    2023-06-17
  • C++中modifystyle的作用是什么
    在C++中,modifystyle函数通常是用来修改控件的样式或者外观的函数。它可以被用于改变控件的背景颜色、字体样式、边框样式等。...
    99+
    2023-10-27
    C++
  • c++中static的作用是什么
    在C++中,`static`关键字有以下几种作用:1. 静态变量:在函数内部声明的静态变量在程序运行期间只被初始化一次,并且在函数运...
    99+
    2023-10-12
    c++
  • C++中resumethread的作用是什么
    C++中的`ResumeThread`函数用于恢复一个被暂停的线程的执行。 当一个线程被创建后,默认情况下它是处于就绪状态,可以被调...
    99+
    2023-10-28
    C++
  • c++中setprecision的作用是什么
    在C++中,setprecision()函数用于设置浮点数输出的精度。它是由库中的头文件提供的。 具体来说,setprecision...
    99+
    2023-10-28
    c++
  • C#中AttributeUsage的作用是什么
    AttributeUsage是一个特性类(Attribute Class),它用于指定自定义特性(Custom Attribute)...
    99+
    2023-10-24
    C#
  • C#中domainUpDown的作用是什么
    在C#中,DomainUpDown控件用于显示一个包含预定义项集合的旋转列表。它允许用户在列表中选择一个项,并且可以通过上下箭头按钮...
    99+
    2023-10-28
    C#
  • C#中 ReaderWriterLock的作用是什么
    这篇文章将为大家详细讲解有关C#中 ReaderWriterLock的作用是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Performance非常差UpgradeToWriterLoc...
    99+
    2023-06-17
  • c++中system的作用是什么
    C++中的system函数是一个标准库函数,用于执行系统命令。它的作用是在程序中调用操作系统的命令行解释器(如Windows的cmd.exe或Linux的shell),并执行传递给该函数的命令。通过system函数,可以在C++程序中执...
    99+
    2023-08-09
    c++ system
  • C#中oledbparameter的作用是什么
    C#中的OleDbParameter是用于向数据库传递参数的对象。它可以用于构建包含参数的SQL语句或存储过程,以确保在与数据库交互...
    99+
    2023-08-08
    C# oledbparameter
  • C#中ManualResetEvent的作用是什么
    C#中的ManualResetEvent是一个用于线程同步的类,它的作用是允许一个或多个线程等待,直到收到信号后才能继续执行。具体来...
    99+
    2023-09-26
    C#
  • C#中directory.getfiles的作用是什么
    C#中的`Directory.GetFiles`方法用于获取指定目录中所有文件的路径。它返回一个字符串数组,包含指定目录下所有文件的...
    99+
    2023-08-19
    C#
  • C++中critical_section的作用是什么
    在C++中,critical_section(临界区)是一种用于同步线程的机制。临界区是一段代码,只允许一个线程在任何时刻执行。它的...
    99+
    2023-08-30
    C++
  • C# 中ServiceController类的作用是什么
    今天就跟大家聊聊有关C# 中ServiceController类的作用是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。在.net中提供了一些类来显示和控制Windows系统上的服...
    99+
    2023-06-17
  • C# 中ThreadPool类的作用是什么
    今天就跟大家聊聊有关C# 中ThreadPool类的作用是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。在多线程的程序中,经常会出现两种情况:一种情况: 应用程序中,线程把大部分...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作