extern(C# 参考)

extern 修饰符用于声明在外部实现的方法。 extern 修饰符的常见用法是在使用 Interop 服务调入非托管代码时与 DllImport 特性一起使用。在这种情况下,还必须将方法声明为 static,如下面的示例所示:

[DllImport("avifil32.dll")]
private static extern void AVIFileInit();

extern 关键字还可以定义外部程序集别名,使得可以从单个程序集中引用同一组件的不同版本。

将 abstract 和 extern 修饰符一起使用来修改同一成员是错误的做法。使用 extern 修饰符意味着方法是在 C# 代码的外部实现的,而使用 abstract 修饰符意味着类中未提供方法实现。
extern 关键字用于 C# 中时会比用于 C++ 中时受到更多的限制。

示例 1. 在此示例中,程序接收来自用户的字符串并将该字符串显示在消息框中。程序使用从 User32.dll 库导入的 MessageBox 方法。

C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices; namespace ConsoleApp1
{
class Program
{
[DllImport("User32.dll", CharSet = CharSet.Unicode)]
public static extern int MessageBox(IntPtr h, string m, string c, int type); static void Main(string[] args)
{
string myString;
Console.Write("Enter your message:");
myString = Console.ReadLine();
MessageBox((IntPtr), myString, "my Message Box:", ); }
}
}

示例 2. 此示例阐释了调入 C 库(本机 DLL)的 C# 程序。
1.1 创建以下 C 文件并将其命名为 cmdll.c:

// cmdll.c
// Compile with: /LD
int __declspec(dllexport) SampleMethod(int i)
{
return i*;
}

1.2 从 Visual Studio 安装目录打开 Visual Studio x64(或 x32)本机工具命令提示符窗口,并通过在命令提示符处键入 CL /LD cmdll.c 来编译 cmdll.c 文件。

2.1.在相同的目录中,创建以下 C# 文件并将其命名为 cm.cs:

// cm.cs
using System;
using System.Runtime.InteropServices;
public class MainClass
{
[DllImport("Cmdll.dll")]
public static extern int SampleMethod(int x); static void Main()
{
Console.WriteLine("SampleMethod() returns {0}.", SampleMethod());
Console.ReadLine();
}
}

2.2.从 Visual Studio 安装目录打开一个 Visual Studio x64(或 x32)本机工具命令提示符窗口,并通过键入以下内容来编译 cm.cs 文件:

csc cm.cs(针对 x64 命令提示符)
- 或 -
csc /platform:x86 cm.cs(针对 x32 命令提示符)
这将创建可执行文件 cm.exe。

3.运行 cm.exe。 SampleMethod 方法将值 5 传递到 DLL 文件,这将返回该值与 10 相乘后的结果。程序生成以下输出:

SampleMethod() returns 50.

其他参考资料:

在 C# 中通过 P/Invoke 调用Win32 DLL

https://msdn.microsoft.com/zh-cn/library/aa686045.aspx

extern 修饰符的更多相关文章

  1. [.net 面向对象编程基础] (8) 基础中的基础——修饰符

    [.net 面向对象编程基础] (8) 基础中的基础——修饰符 在进入C#面向对象核心之前,我们需要先对修饰符有所了解,其实我们在前面说到变量和常量的时候,已经使用了修饰符,并且说明了变量和常量的修改 ...

  2. 【转】C# 中访问修饰符

    用通过代码:  类内部 using System;class Mod{    void defaultMethod()    {        Console.WriteLine("this ...

  3. c# 访问修饰符的访问权限

    1. 访问修饰符. 指定声明的类型和类型成员的可访问性. (1) public:是类型和类型成员的访问修饰符.公共访问是允许的最高访问级别.对访问公共成员没有限制. (2) private:是一个成员 ...

  4. C# 中4个访问符和8个修饰符详解

    4个访问修饰符(是添加到类.结构或成员声明的关键字) Public:公有的,是类型和类型成员的访问修饰符.对其访问没有限制. Internal:内部的,是类型和类型成员的访问修饰符.同一个程序集中的所 ...

  5. 理解C语言中几个常见修饰符

    写在前面 今天下午一个同事问「register」关键字是什么作用?噢,你说的是「register」啊,它的作用是……脑袋突然断片儿,我擦,啥意思来着,这么熟悉的陌生感.做C语言开发时间也不短了,不过好 ...

  6. C# 之 4个访问修饰符和8个声明修饰符详解

    一.4个访问修饰符(是添加到类.结构或成员声明的关键字) [1] Public:公有的,是类型和类型成员的访问修饰符.对其访问没有限制. [2] Internal:内部的,是类型和类型成员的访问修饰符 ...

  7. 【.Net】 C#访问修饰符

    一 类的修饰符:  C#中类的默认修饰符是internal.1 private 只有对包.NET中的应用程序或库才能访问.2 public 不限制对类的访问. 3 protected 只可以被本类和其 ...

  8. 【语法】修饰符 static extern const

    转载自:http://my.oschina.net/u/2560887/blog/552683 一.C语言中的static的作用 在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有 ...

  9. C#.net 中 修饰符 详解 (来自MSDN)

    自己理解的不够深刻,无奈基础较差!记上一笔,记忆深刻些,哈哈…… 1. 访问修饰符 public 同一程序集中的任何其他代码或引用该程序集的其他程序集都可以访问该类型或成员. private 只有同一 ...

随机推荐

  1. 67. Add Binary

    public class Solution { public String addBinary(String a, String b) { char[] aa=a.toCharArray(); cha ...

  2. Codeforces Round #303 (Div. 2) B 水 贪心

    B. Equidistant String time limit per test 1 second memory limit per test 256 megabytes input standar ...

  3. C++ Primer :第十章 :泛型算法之再探迭代器以及其他算法

    除了为每个容器定义的迭代器之外,标准库在头文件<iterator>还定义了额外集中迭代器, 包括: 插入迭代器,这些迭代器被绑定到一个容器上,可以向容器插入元素. 流迭代器,    这些迭 ...

  4. 转:db2 iptables相关用法(1)

    如果你的IPTABLES基础知识还不了解,建议先去看看. 开始配置 我们来配置一个filter表的防火墙. (1)查看本机关于IPTABLES的设置情况 [root@tp ~]# iptables - ...

  5. leetcode 129. Sum Root to Leaf Numbers ----- java

    Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number ...

  6. Hibernate--Enum类型的set集合映射到数据库(xml配置文件实现方式)

    使用enum 存储Permission的值 package demo; public enum Permission {    CREATE,DELETE,UPDATE;} Role与Permissi ...

  7. Hive 复习

    hive分为CLI(command line)(用的比较多) JDBC/ODBC-ThriftServer hiveServer(hive -service hiveserver),JDBC访问,一个 ...

  8. debug,trace,release项目配置区别

    Debug模式是用来调试用的,它生成的执行文件中含有大量调试信息,所以很大: Release模式生成的执行文件消除了这些调试信息,可用来作为成品发布 Debug只在debug状态下会输出,Trace在 ...

  9. linux工具之putty

    http://blog.csdn.net/qk_zhu/article/details/6272247 对于putty,似乎很多人只知道下载回来之后,双击,输入ip,然后登陆使用.其实putty有很多 ...

  10. 最短路径—Dijkstra算法和Floyd算法【转】

    本文来自博客园的文章:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html Dijkstra算法 1.定义概览 Dijk ...