C#使用DllImport调用非托管的代码的方法
找到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#将dll打包到程序中的具体实现
直接进入主题 先来看一个栗子,假设现在有一个第三方dll 复制代码 代码如下: namespace TestLibrary1{ public class Test { public void Point() { Console.WriteLine("aaabbbccc"); } }} TestLibrary1.dll 在项目中引用,然后调用其中的方法Test,将输出aaabbbccc 复制代码 代码如下:
-
C#调用Matlab生成的dll方法的详细说明
其实整个过程比较简单,但是需要心细一点. 需要的工具:VS2005及以上版本,MATLAB2008B及以上版本,另外非常重要的需要安装一个MATLAB Compiler Runtime,这个文件(MCRInstall.exe)在安装完MATLAB之后就会在安装文件夹下存在,需要搜索一下(因为不同版本的MATLAB可能存放位置不同),把它安装一下就OK了. 接下来在MATLAB中写一个m文件,当然是一个函数啦.然后在matlab命令行下运行deploytool,在图形界面里选.net组件,然后进入
-
C# 调用C++写的dll的实现方法
dll的编写,首先是打开VS新建一个C++的控制台程序,下一步后选择dll以及空文档即可.然后就是添加一个类添加一个方法.方法排头固定格式 extern"C"__declspec(dllexport) 后面加方法即可. 例如如下代码: C++dll代码: 复制代码 代码如下: extern"C"__declspec(dllexport) char* ShowImages(BYTE img[],int w,int h){;} C#调用dll基本也是固定格式,如下样式,
-
C# 利用Aspose.Words.dll将 Word 转成PDF
只要把aspose.words.dll 在bin中添加引用即可. 复制代码 代码如下: using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using Aspose.Words;using Aspose.Words.Saving;usi
-
c#的dllimport使用方法详解
DllImport是System.Runtime.InteropServices命名空间下的一个属性类,其功能是提供从非托管DLL导出的函数的必要调用信息 DllImport属性应用于方法,要求最少要提供包含入口点的dll的名称.DllImport的定义如下: 复制代码 代码如下: [AttributeUsage(AttributeTargets.Method)]public class DllImportAttribute: System.Attribute{public DllImportA
-
windows中使用C# 调用 C语言生成的dll
首先建立一个C语言源文件test.c void swap(int* a, int* b) { int c = *a; *a = *b; *b = c; } 然后下载mingw64,解压,进入到bin目录,查看是否有gcc.exe ,只要下载正确肯定是有的,可以把这个bin目录加入环境变量,就可以在任意地方运行gcc.偷懒的做法是直接把刚才做好的test.c复制到这个bin目录中,和gcc.exe在一个目录,然后在此目录下,按住shift键不松,再在空白处点击鼠标右键,就可以在右键菜单看见"在此目
-
C#中使用IrisSkin2.dll美化WinForm程序界面的方法
一.添加控件IrisSkin2.dll.方法: 1.右键"工具箱"."添加选项卡",取名"皮肤". 2.右键"皮肤","选择项"弹出对话框 3.点击"浏览",找到IrisSkin2.dll,,next,next,确定. 4.在皮肤里会出现. 5.把SkinEngine拖到设计界面,会出现在下面. 二,把皮肤文件中以ss
-
C#使用DllImport调用非托管的代码的方法
找到GetShortPathName的方法签名, DWORD GetShortPathName(LPCTSTR tpszLongPath,TPTSTR lpszShortPath,DWORD cchBuffer): 非托管及托管数据类型对应关系: LPCTSTR String LPTSTR StringBuilder DWORD int DllImport的导入规则: 1.方法名与Win API完全一样.如果在C#中调用时显示完全不同的方法名
-
从C#程序中调用非受管DLLs的方法
本文实例讲述了从C#程序中调用非受管DLLs的方法.分享给大家供大家参考.具体方法如下: 前言: 从所周知,.NET已经渐渐成为一种技术时尚,那么C#很自然也成为一种编程时尚.如何利用浩如烟海的Win32 API以及以前所编写的 Win32 代码已经成为越来越多的C#程序员所关注的问题.本文将介绍如何从C#代码中调用非受管DLLs.如果某个函数是一个带有串类型(char*)输出参数的Win32 API 或者是DLL输出函数,那么从C#中如何调用它呢?对于输入参数的情形问题到不大,但如何获取从参数
-
C#调用非托管动态库中的函数方法
C#如何调用一个非托管动态库中的函数呢,比如用VC6写的动态库,总之C#调用动态库的过程是比Java调用DLL动态库方便快捷多了,下面举例说明这个过程. 1.创建一个非托管动态库 代码如下: 复制代码 代码如下: //这一句是声明动态库输出一个可供外不调用的函数原型. extern "C" __declspec(dllexport) int add( int , int ); int add( int a, int b) { //实
-
jQuery调用RESTful WCF示例代码(GET方法/POST方法)
不废话了,直奔主题吧 wcf端: 近几年比较流行restful,为了能让ajax调用,同时也为了支持restful风格的uri,在创建一个Ajax-enabled Wcf Service后,必须手动修改svc文件,指定Factory,即: <%@ ServiceHost Language="C#" Debug="true" Service="ajaxSample.HelloWorld" CodeBehind="HelloWorld
-
C#中托管DLL和非托管DLL的区别详解
首先解释一下,托管DLL和非托管DLL的区别.狭义解释讲,托管DLL就在Dotnet环境生成的DLL文件.非托管DLL不是在Dotnet环境生成的DLL文件. 托管DLL文件,可以在Dotnet环境通过 "添加引用" 的方式,直接把托管DLL文件添加到项目中.然后通过 Using DLL命 名空间,来调用相应的DLL对象 . 非托管DLL文件,在Dotnet环境应用时,通过 DllImport 调用. C# 调用非托管DLL文件.DLL文件是用C语言编写的. 托管DLL就是能够在公共
-
详解C# 托管资源和非托管资源
托管资源指的是.NET可以自动进行回收的资源,主要是指托管堆上分配的内存资源.托管资源的回收工作是不需要人工干预的,有.NET运行库在合适调用垃圾回收器进行回收. 非托管资源指的是.NET不知道如何回收的资源,最常见的一类非托管资源是包装操作系统资源的对象,例如文件,窗口,网络连接,数据库连接,画刷,图标等.这类资源,垃圾回收器在清理的时候会调用Object.Finalize()方法.默认情况下,方法是空的,对于非托管对象,需要在此方法中编写回收非托管资源的代码,以便垃圾回收器正确回收资源. 在
-
C#托管内存与非托管内存之间的转换的实例讲解
c#有自己的内存回收机制,所以在c#中我们可以只new,不用关心怎样delete,c#使用gc来清理内存,这部分内存就是managed memory,大部分时候我们工作于c#环境中,都是在使用托管内存,然而c#毕竟运行在c++之上,有的时候,(比如可能我们需要引入一些第三方的c++或native代码的库,在Unity3d开发中很常见)我们需要直接在c#中操纵非托管的代码,这些non-managed memory我们就需要自己去处理他们的申请和释放了, c# 中提供了一些接口,完成托管和非托管之间
-
c#关于非托管内存的释放问题及解读
目录 关于非托管内存的释放问题 托管内存与非托管内存之间的转换 1.managed memory-> unmanaged memory 2.un-managed memory->managed memory 3.在c#直接申请一个un-managed mem传给c++ 总结 关于非托管内存的释放问题 硬件:大华sdk 软件平台:win10+vs2015 背景:近期在做大华工业相机SDK的采集的时候,用到Marshal.copy,将托管的代码转换成非托管的指针内存,由于没有及时释放内存指针,导致
-
.net非托管资源的回收方法
本文实例讲述了.net非托管资源的回收方法,分享给大家供大家参考.具体分析如下: 释放未托管的资源有两种方法 1.析构函数 2.实现System.IDisposable接口 一.析构函数 构造函数可以指定必须在创建类的实例时进行的某些操作,在垃圾收集器删除对象时,也可以调用析构函数.析构函数初看起来似乎是放置释放未托管资源.执行一般清理操作的代码的最佳地方.但是,事情并不是如此简单.由于垃圾回收器的运行规则决定了,不能在析构函数中放置需要在某一时刻运行的代码,如果对象占用了宝贵而重要的
-
带你复习c# 托管和非托管资源
前言 c# 托管和非托管比较重要,因为这涉及到资源的释放. 现在只要在计算机上运行的,无论玩出什么花来,整个什么概念,逃不过输入数据修改数据输出数据(计算机本质),这里面有个数据的输入,那么我们的内存有限啊,这里面就牵扯到数据释放. 看下c# 的垃圾回收是怎么样的. 了解垃圾回收之前首先要了解数据,了解数据需要了解数据类型啊,数据类型分为值类型还有引用类型. windows 使用一个虚拟寻址系统,该系统把程序可用的内存地址映射到硬件内存中的实际地址上,这些任务完全由windows 在后台管理.我
随机推荐
- mysql 无限级分类实现思路
- Python实现从脚本里运行scrapy的方法
- JS获取浏览器版本及名称实现函数
- js用于树型结构级联选择
- php版阿里大于(阿里大鱼)短信发送实例详解
- 理解PHP中的stdClass类
- 浅谈Python单向链表的实现
- MySQL5.6.31 winx64.zip 安装配置教程详解
- Docker 命令教程(附中文解释)
- Android编程之判断SD卡状态的方法
- JAVA实现KMP算法理论和示例代码
- 微信小程序 LOL 英雄介绍开发实例
- 基于Java实现的图的广度优先遍历算法
- Android笔记之:App列表之下拉刷新的使用
- python如何使用正则表达式的前向、后向搜索及前向搜索否定模式详解
- C++实现判断一个字符串是否为UTF8或GBK格式的方法
- Python自定义简单图轴简单实例
- iOS中封装.framework及使用的方法详解
- 对Layer UI 模块化的用法详解
- laravel实现登录时监听事件,添加登录用户的记录方法