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

所属分类: 软件编程 / C#教程 阅读数: 122
收藏 0 赞 0 分享

找到GetShortPathName的方法签名,

DWORD GetShortPathName(LPCTSTR tpszLongPath,TPTSTR lpszShortPath,DWORD cchBuffer);

非托管及托管数据类型对应关系:

LPCTSTR         String

LPTSTR           StringBuilder

DWORD          int

DllImport的导入规则:

1、方法名与Win API完全一样。如果在C#中调用时显示完全不同的方法名称,则需要引入EntryPoint属性,使用别名显示。

2、函数除需要DllImport类修饰符外,还需要声明public static extern类型。

3、函数返回值和参数必须和调用的API的完全一样。

4、必须引入System.Runtime.InteropServices命名空间。

代码:

复制代码 代码如下:

using System.Runtime.InteropServices;

public class Test

        {

            [DllImport("kernel32.dll",CharSet=CharSet.Auto,EntryPoint="GetShort")]

public static extern int GetShortPathName(

                [MarshalAs(UnmanagedType.LPTStr)] String path,

                [MarshalAs(UnmanagedType.LPTStr)] StringBuilder shortPath,

int shortPathLength);

        }


代码调用中kernel32.dll的路径之所以没写是因为DllImport会按照以下三种顺序查找Dll:

1、exe所在目录;2、System32目录;3、环境变量目录。

MarshalAs为可选类型,因为每个数据类型都有默认的封送行为,该属性指示如何在托管代码和非托管代码之间的封送数据,可将该属性用于参数、字段和返回值。大多数情况下该属性只是用UnmanagedType枚举类型就能满足大多数非托管的数据类型,如默认情况下字符会被当作BStr传入到Dll中,可以使用MarshalAs将字符串指定为LPTStr、LPWStr或LPStr等。

DllImport可选属性解释

EntryPoint             可对方法采用不同的名称,使用别名

CharSet                  函数调用使用Unicode还是Ansi

ExactSpelling        False,表示让编译器自己选择使用Unicode或Ansi

CallingConvetnion             它的参数指示入口点调用的约定;不指定默认为CallingConvention.WinAPI

PreserveSig                    指示方法签名应当被保留还是被转换,当被转换时它被转换为一个具有HRESULT返回值和该返回值的一个名为retval的附加输出参数的签名,默认为true。

SetLastError                   指定是否保留上一次错误,默认为false

更多精彩内容其他人还在看

C# 大小写转换(金额)实例代码

C# 大小写转换(金额)实例代码,需要的朋友可以参考一下
收藏 0 赞 0 分享

C# WinForm中Panel实现用鼠标操作滚动条的实例方法

由于在WinForm中Panel不能直接响应鼠标的滚动事件,只好采用捕获窗体的滚动事件。
收藏 0 赞 0 分享

C#访问应用程序配置文件的方法

C#访问应用程序配置文件的方法,需要的朋友可以参考一下
收藏 0 赞 0 分享

C#读写文件的方法汇总

C#读写文件的方法汇总,需要的朋友可以参考一下
收藏 0 赞 0 分享

C#计算代码执行时间的方法

在一些测试工作时我们需要获得高精度的代码执行时间以比较其效率。
收藏 0 赞 0 分享

C# 动画窗体(AnimateWindow)的小例子

C# 动画窗体(AnimateWindow)的小例子,需要的朋友可以参考一下
收藏 0 赞 0 分享

C# zxing二维码写入的实例代码

C# zxing二维码写入的实例代码,需要的朋友可以参考一下
收藏 0 赞 0 分享

c#判断输入的是不是数字的小例子

c#判断输入的是不是数字的小例子,需要的朋友可以参考一下
收藏 0 赞 0 分享

c# 深拷贝与浅拷贝的区别分析及实例

浅拷贝(影子克隆):只复制对象的基本类型,对象类型,仍属于原来的引用. 深拷贝(深度克隆):不紧复制对象的基本类,同时也复制原对象中的对象.就是说完全是新对象产生的.
收藏 0 赞 0 分享

C#利用com操作excel释放进程的解决方法

最近利用Microsoft.Office.Interop.Excel.Application读取一个excel后,进程中一直存在excel,在网上找了一阵子,其中有几个解决方案
收藏 0 赞 0 分享
查看更多