`

关于C#中的DLLImport

阅读更多

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用法和路径问题 .rar

    在C#编程中,`DllImport`特性是用于导入非托管代码...以上就是关于C#中`DllImport`的使用方法和解决路径问题的基本知识。通过正确理解和应用这些概念,开发者可以顺利地在.NET环境中调用非托管代码,实现更丰富的功能。

    C#通过DllImport导入C++的动态链接库

    本文将详细介绍如何在C#项目中使用`DllImport`特性来导入并调用C++生成的DLL。 #### 生成C++ DLL 在详细介绍如何在C#项目中导入C++ DLL之前,首先简要介绍一下如何生成C++ DLL。由于本文的重点在于C#端的操作,...

    C# DllImport用法和路径问题 .docx

    ### C# DllImport用法详解及路径问题探讨 #### 一、DllImport基本概念 `DllImport`是.NET Framework中用于实现平台调用服务(Platform Invoke, 简称P/Invoke)的一种机制,它允许.NET应用程序调用非托管代码中的...

    c#的dllimport使用方法详解.docx

    C#中的DllImport使用方法详解 C#中的DllImport是System.Runtime.InteropServices命名空间下的一个属性类,其功能是供应从非托管DLL导出的函数的必要调用信息。DllImport属性应用于方法,要求最少要供应包含入口点的...

    C#dllimport调用 C# 调用Win32

    在"C#dllimport调用 C# 调用Win32 闪烁窗体的调用"这个场景中,可能是指利用Win32 API来控制窗口的行为,例如改变窗口样式、处理消息循环,或者解决窗体在某些操作下闪烁的问题。Windows API提供了`UpdateWindow`和`...

    C# 利用动态库DllImport(kernel32)读写ini文件.docx

    ### C# 使用动态链接库 DllImport(kernel32) 实现 INI 文件的读写 #### 背景介绍 在软件开发过程中,有时需要在应用程序中存储一些配置信息或临时数据,对于这类需求,使用数据库显得过于复杂且消耗资源较多。而 ...

    C# DllImport的用法

    ### C#中DllImport的使用详解 在日常的学习与工作中,我们常常会遇到这样一个问题:如何在C#中直接调用已经存在于其他环境或语言中的功能,例如Windows API中的一些功能或者C++中已经编写好的一些方法。对于这个...

    c# DLLImport 属性 讲解

    ### C# 中的 DLLImport 属性详解 在 C# 编程中,当我们需要调用非托管代码(通常是 Windows API 函数)时,就需要用到 `DllImport` 属性。这一特性使得 C# 开发者能够方便地访问由 C/C++ 编写并封装在 DLL 文件中的...

    C#例子代码 A0900_DllImport_StrCmpLogicalW

    C#例子代码 A0900_DllImport_StrCmpLogicalWC#例子代码 A0900_DllImport_StrCmpLogicalWC#例子代码 A0900_DllImport_StrCmpLogicalWC#例子代码 A0900_DllImport_StrCmpLogicalWC#例子代码 A0900_DllImport_...

    关于C#的static

    全局变量在C#中的主要区别和用途 在C#中,`static`关键字扮演着重要的角色,它在类、变量和方法中都有特定的应用。理解`static`的关键在于它的两个核心概念:静态生命周期和作用域。 1. **静态生命周期与作用域** ...

    获取系统中可用的驱动器列表,C#源代码[DllImport("shell32")]

    获取系统中可用的驱动器列表,C#源代码[DllImport("shell32")] private static extern int SHGetFileInfo(string pszPath, int dwFileAttributes, ref SHFILEINFO psfi, int cbFileInfo, int uFlags); const int ...

    c#的dllimport使用方法详解

    标题所述的“DllImport”是C#语言中一个重要的特性,它允许.NET代码调用非托管的动态链接库(DLL)中的函数。要想深入了解DllImport的使用方法,首先需要了解以下几个方面: 1. **DllImport属性**:DllImport属性...

    c# libusb开发代码

    libusb的C接口需要被转换为C#可以理解的形式,这通常通过定义C#中的DllImport特性来实现。 1. **P/Invoke基础**:在C#中,P/Invoke(Platform Invoke)是.NET框架提供的一种机制,使得托管代码(C#)能够调用非托管...

    C#使用DllImport调用非托管的代码的方法

    在C#中,主要通过以下几种方式来调用非托管代码:COM互操作、`DllImport`、加载非托管DLL、直接执行机器码。其中,`DllImport`是一种常见的方法,因为它相对简单且灵活。 `GetShortPathName`是Windows API中定义的...

    C# winform 运行前释放令一个文件(或DLL)

    3. **C#中的DllImport Attribute**:如果需要在C#代码中使用非托管代码(如C++编写的DLL),我们可以使用`DllImport`特性来声明并调用DLL中的函数。但在运行时,我们需要确保DLL已经存在于程序的搜索路径中。 4. **...

    C#中加载和卸载DLL

    ### C#中加载和卸载DLL #### 一、引言 在软件开发过程中,动态链接库(Dynamic Link Library,简称DLL)作为一种重要的模块化工具,广泛应用于多种编程语言中。在C++中,通过`LoadLibrary`和`FreeLibrary`函数可以...

    C#调用GPU计算案例

    本案例聚焦于如何在C#环境中调用CUDA的DLL链接库进行GPU计算。 首先,了解CUDA的基本概念至关重要。CUDA为开发者提供了一套完整的工具包,包括CUDA C/C++语言、CUDA Toolkit以及Visual Studio插件等,使得编写和...

    Visual Studio 2010 C# 演示 [System Runtime InteropServices DllImport gdi32

    在本文中,我们将深入探讨Visual Studio 2010中C#编程中使用`[System.Runtime.InteropServices.DllImport]`特性的概念,特别是在调用Windows API函数,如gdi32.dll库中的函数时的应用。`DllImport`特性是.NET ...

    C#屏蔽Windows快捷键及任务管理器

    C#屏蔽Windows快捷键及任务管理器 public delegate int HookProc(int nCode, int wParam, IntPtr lParam); private static int hHook = 0; public const int WH_KEYBOARD_LL = 13; //LowLevel键盘截获,如果是WH...

Global site tag (gtag.js) - Google Analytics