C#使用DllImport调用非托管的代码的方法
找到GetShortPathName的方法签名,
DWORDGetShortPathName(LPCTSTRtpszLongPath,TPTSTRlpszShortPath,DWORDcchBuffer);
非托管及托管数据类型对应关系:
LPCTSTR String
LPTSTR StringBuilder
DWORD int
DllImport的导入规则:
1、方法名与WinAPI完全一样。如果在C#中调用时显示完全不同的方法名称,则需要引入EntryPoint属性,使用别名显示。
2、函数除需要DllImport类修饰符外,还需要声明publicstaticextern类型。
3、函数返回值和参数必须和调用的API的完全一样。
4、必须引入System.Runtime.InteropServices命名空间。
代码:
usingSystem.Runtime.InteropServices;
publicclassTest
{
[DllImport("kernel32.dll",CharSet=CharSet.Auto,EntryPoint="GetShort")]
publicstaticexternintGetShortPathName(
[MarshalAs(UnmanagedType.LPTStr)]Stringpath,
[MarshalAs(UnmanagedType.LPTStr)]StringBuildershortPath,
intshortPathLength);
}
代码调用中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# mysql executenonquery_C#与数据库访问技术总结(八)之ExecuteNonQuery方法
- c# mysql executenonquery_C#与数据库访问技术之ExecuteNonQuery方法
- C#实现Oracle批量写入数据的方法分享
- MongoDB入门教程之C#驱动操作实例
- C#程序员经常用到的10个实用代码片段
- C#实现图片分割方法与代码
- C#从实体对象集合中导出Excel的代码
- javascript中字符串替换函数replace()方法与c#、vb替换有一点不同
- C#WinForm捕获全局变量异常SamWang解决方法
- C#最简单的关闭子窗体更新父窗体的实现方法
- C#启动windows服务方法的相关问题分析
- C#实现ComboBox自动匹配字符
- C#三种判断数据库中取出的字段值是否为空(NULL)的方法
- c#重写TabControl控件实现关闭按钮的方法
- C#SkinEngine控件给窗体添加皮肤的方法
- 使用@符号让C#中的保留字做变量名的方法详解
- 解析c#操作excel后关闭excel.exe的方法
- C#使用非托管代码直接修改字符串的方法
- javaScript函数中执行C#代码中的函数方法总结
- C#和asp.net中链接数据库中参数的几种传递方法实例代码
- c#简单判断是否是闰年的方法代码
- C#读写txt文件多种方法实例代码
- C#防SQL注入代码的三种方法
- C#判断两张图片是否一致的快速方法
- C#数据库操作类AccessHelper实例
- 从C#程序中调用非受管DLLs的方法
- C#中参数个数可变的方法实例分析
- C#利用XML创建Excel文档的实现方法
- 采用C#实现软件自动更新的方法
- C#判断日期是否到期的方法