首页 > extern的关键字用法(C# 参考)

extern的关键字用法(C# 参考)

extern修饰符用于声明在外部实现的方法。

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

    [DllImport("avifil32.dll")]

    private static extern void AVIFileInit();



注意 

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

 将 abstract 和 extern 修饰符一起使用来修改同一成员是错误的。



使用 

   extern 修饰符意味着方法在 C# 代码的外部实现,而使用 abstract 修饰符意味着在类中未提供方法实现。注意 extern 关键字在使用上比在 C++ 中有更多的限制。

 

示例 

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

using System; using System.Runtime.InteropServices;

class MainClass

{

 [DllImport("User32.dll")]

 public static extern int MessageBox(int h, string m, string c, int type);

 static int Main()

{

string myString;

 Console.Write("Enter your message: ");

 myString = Console.ReadLine();

return MessageBox(0, myString, "My Message Box", 0);

}

}

 此示例使用 C 程序创建一个 DLL,在下一示例中将从 C# 程序调用该 DLL。

// cmdll.c // compile with:

/LD int __declspec(dllexport) SampleMethod(int i)

{

 return i*10;

 }

该示例使用两个文件 CM.cs 和 Cmdll.c 来说明 extern。

C 文件是示例 2 中创建的外部 DLL,它从C# 程序内调用。

// 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(5));

}

}

输出SampleMethod() returns 50. 备注生成项目: 使用 Visual C++ 命令行将 Cmdll.c 编译为 DLL: cl /LD Cmdll.c 使用命令行编译 CM.cs: csc CM.cs 这将创建可执行文件 CM.exe。运行此程序时,SampleMethod 将值 5 传递到 DLL 文件,该文件将此值乘以 10 返回
关于GetPrivateProfileString的相关字段的解析
 [DllImport("kernel32")]

        public static extern bool GetPrivateProfileString(string lpApplicationName, string lpKeyName, string lpDefault, StringBuilder lpReturnedString, int nSize, string lpFileName);
其中各参数的意义: 

   第一个参数的意义是 配置文件中的字段名


   前二个参数与 WritePrivateProfileString中的意义一样(配置文件中的键值).



   lpDefault : 如果INI文件中没有前两个参数指定的字段名或键名,则将此值赋给变量. 



   lpReturnedString : 接收INI文件中的值的CString对象,即目的缓存器.



   nSize : 目的缓存器的大小.



   lpFileName : 是完整的INI文件名.



转载于:https://www.cnblogs.com/joly-han/archive/2011/05/17/2049013.html

更多相关:

  • nan 是not a number ,inf是无穷大 numpy.nan_to_num(x): 使用0代替数组x中的nan元素,使用有限的数字代替inf元素...

  • 简介 Simple Reference  基础CUDA示例,适用于初学者, 反映了运用CUDA和CUDA runtime APIs的一些基本概念.Utilities Reference  演示如何查询设备能力和衡量GPU/CPU 带宽的实例程序。Graphics Reference  图形化示例展现的是 CUDA, OpenGL,...

  • 在做开发的过程中难免需要给内核及下载的一些源码打补丁,所以我们先学习下Linux下使用如如何使用diff制作补丁以及如何使用patch打补丁。...

  • 我在调研ATS 4.2.3挂载SSD的过程中,遇到很多坑,特此详细记录我摸索的主要过程,以便大家以后避免之。 基本思路可以完全照搬参考文献[2][3] 下面的安装假定是以root用户身份进行的,Linux服务器已经安装好系统,磁盘已经做好分区。 首先需要认识我们的Linux服务器的硬件配置和软件情况 硬件配置: DELL...

  • 该博文整理一些在使用stl编程过程中遇到的小经验: 1.在多线程环境下面打印调试,如何使用cout及时刷新到屏幕上? 在C中我们经常这样使用: printf("Hello World "); fflush(stdout); 如果使用stl,我们可以这样使用: cout << "Hello World" << endl <...

  •         Apache POI是一个开源的利用Java读写Excel,WORD等微软OLE2组件文档的项目。        我的需求是对Excel的数据进行导入或将数据以Excel的形式导出。先上简单的测试代码:package com.xing.studyTest.poi;import java.io.FileInputSt...

  • 要取得[a,b)的随机整数,使用(rand() % (b-a))+ a; 要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a; 要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1; 通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。 要取得a到b之间的...

  • 利用本征图像分解(Intrinsic Image Decomposition)算法,将图像分解为shading(illumination) image 和 reflectance(albedo) image,计算图像的reflectance image。 Reflectance Image 是指在变化的光照条件下能够维持不变的图像部分...

  • 题目:面试题39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 限制: 1 <= 数组长度 <= 50000 解题: cl...

  • 题目:二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树:      5     /    2   6   /  1   3示例 1: 输入: [1,6,3,2,5] 输出...