热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#学习教程:C#使用DllImport调用非托管的代码的方法分享

找到GetShortPathName的方法签名,DWORDGetShortPathName(LPCTSTRtpszLongPath,TPTSTRlpszShortPath,DWOR

找到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#的dllimport使用方法详解C#如何通过probing指定dll寻找文件夹详解C#调用易语言写的Dll文件方法C#使用反射(Reflect)获取dll文件中的类型并调用方法C#嵌入dll的方法利用unity代码C#封装为dll的步骤分享C#编译生成dll文件供程序调用的两种方法C#连接Oracle数据库使用Oracle.ManagedDataAccess.dlljava使用jna调用c#中dll的方法详解C#[ImportDll()]知识小结

标签: 方法 调用 mp port por

return和break的区别解析

C++ Primer 第一部分基本语言

上述就是C#学习教程:C#使用DllImport调用非托管的代码的方法分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—编程笔记


推荐阅读
author-avatar
李da寕
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有