惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Attack and Defense Labs
Attack and Defense Labs
T
Threatpost
C
Cybersecurity and Infrastructure Security Agency CISA
H
Hackread – Cybersecurity News, Data Breaches, AI and More
I
Intezer
C
Cyber Attacks, Cyber Crime and Cyber Security
The Register - Security
The Register - Security
量子位
Security Latest
Security Latest
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
大猫的无限游戏
大猫的无限游戏
小众软件
小众软件
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
C
CXSECURITY Database RSS Feed - CXSecurity.com
MyScale Blog
MyScale Blog
J
Java Code Geeks
Apple Machine Learning Research
Apple Machine Learning Research
Google DeepMind News
Google DeepMind News
WordPress大学
WordPress大学
Spread Privacy
Spread Privacy
Jina AI
Jina AI
博客园 - 【当耐特】
P
Palo Alto Networks Blog
Last Week in AI
Last Week in AI
SecWiki News
SecWiki News
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
G
GRAHAM CLULEY
宝玉的分享
宝玉的分享
Hacker News - Newest:
Hacker News - Newest: "LLM"
T
The Blog of Author Tim Ferriss
V
Vulnerabilities – Threatpost
有赞技术团队
有赞技术团队
T
Tor Project blog
H
Hacker News: Front Page
A
Arctic Wolf
NISL@THU
NISL@THU
A
About on SuperTechFans
云风的 BLOG
云风的 BLOG
Engineering at Meta
Engineering at Meta
V
V2EX
N
News and Events Feed by Topic
Webroot Blog
Webroot Blog
Know Your Adversary
Know Your Adversary
P
Privacy International News Feed
I
InfoQ
D
Docker
L
LINUX DO - 最新话题
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
U
Unit 42

博客园 - 杨连国

win10 IoT开发 Serial​Device 返回 null .NET Delegates: A C# Bedtime Story【转载】 C++ 和 C# 变量定义的一点区别 变量定义 接口(CLR via C# 读书笔记) 生成器模式(builder) 类型和成员基础(CLR via C#) 基本类型、引用类型、值类型——(CLR via C#) 抽象工厂模式(abstract factory) 李建忠C#面向对象设计模式纵横谈 —— 单件模式 李建忠C#面向对象设计模式纵横谈 —— 面向对象设计模式与原则 程序设计和重构的目标 OO设计原则——读《你必须知道的.NET》 输入法灰掉bug解决 半角全角Bug解决 由迭代模式想到得——用设计模式理解 .NET ASCII 表设计之妙 调用VC封装的DLL时,两个类型匹配问题 Invoke 和 BeginInvoke 的区别
调用非托管Dll
杨连国 · 2008-03-31 · via 博客园 - 杨连国
 

    本周因为工作需要,针对“东进电话语音模拟卡”提供的API接口,写个测试程序,需要用C#调用VC封装的DLL动态库,上网查找,查来查去始终都是一个人的大作,不是很满意,自己查看MSDN帮助,动手总结一下,这是MSDN帮助的URL

ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_fxinterop/html/eca7606e-ebfb-4f47-b8d9-289903fdc045.htm

看完这个帮助后,可以在再查看一下DllImportAttribute的相关属性,就差不多了。

       MSDN 的帮助太详细了,而且链接跳了跳去,看的头大,自己就想暂时能调用DLL就可以了,所以下边是自己简要提取的帮助:

一、平台调用详解(基本原理)

ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_fxinterop/html/ba9dd55b-2eaa-45cd-8afd-75cb8d64d243.htm

平台调用依赖于元数据在运行时查找导出的函数并封送其参数。下图显示了这一过程。

对非托管 DLL 函数的“平台调用”调用


当“平台调用”调用非托管函数时,它将依次执行以下操作:

1.        查找包含该函数的 DLL

2.        将该 DLL 加载到内存中。

3.        查找函数在内存中的地址并将其参数推到堆栈上,以封送所需的数据。

注意

只在第一次调用函数时,才会查找和加载 DLL 并查找函数在内存中的地址。

4.        将控制权转移给非托管函数。

平台调用会向托管调用方引发由非托管函数生成的异常。

二、调用方法(实际操作)

1标识 DLL 中的函数

最低限度上,必须指定函数的名称和包含该函数的 DLL 的名称

例:

using System.Runtime.InteropServices;

[DllImport("user32.dll") EntryPoint=" MessageBox ")]

public static extern int MessageBox(int hWnd, String text,

                                       String caption, uint type);

注意:1、必须引用 System.Runtime.InteropServices 命名空间

      2、如果函数不需要重新命名,入口属性 EntryPoint 可以不写,

但动态库引用必须设定。

2创建用于容纳 DLL 函数的类

C#内声明的Dll函数,必须包含在一个具体类中,可以使用现有类,或为每一非托管函数创建单独的类,或者创建包含一组相关的非托管函数的一个类。

注意:在一个类中,每个要调用的 DLL 函数定义为静态方法。

3. 在托管代码中创建原型

[C#] 使用 DllImportAttribute 标识 DLL 和函数。

static extern 修饰符标记方法。

  有关DllImportAttribute具体属性,请参看CSDN帮助

4. 调用 DLL 函数

像处理其他任何托管方法一样调用托管类上的方法。