原文:https://blog.csdn.net/michellehsiao/article/details/7629746
        extern 修饰符用于声明在外部实现的方法。extern 修饰符的常见用法是在使用 Interop 服务调入非托管代码时与DllImport 特性一起使用。在这种情况下,还必须将方法声明为static,如下示例所示:
  1. [DllImport("user32.dll.dll")]
  2. private static extern void IsWindowVisible();

extern 关键字还可以定义外部程序集别名,使得可以从单个程序集中引用同一组件的不同版本。将 abstract和 extern 修饰符一起使用来修改同一成员是错误的,使用 extern 修饰符意味着方法在 C# 代码外部实现,而使用 abstract 修饰符意味着在类中未提供方法实现。这里定义声名动态链接库user32.dll作为静态入口点。

在VS项目中通过DllImport引入一个DLL和添加引用方式添加一个DLL区别在于:DllImpor针对非托管的,非托管的指的是不利用.net 生成的DLL;引用是针对托管的。

static extern int IsWindowVisible(); 表示声明一个外部实现方法IsWindowVisible(), 自己的dll里必须有这个方法才行。你的IsWindowVisible方法必须在dll中存在还有dll不必须注册,注册就是让系统知道它在哪里以及一些信息,你自己指明位置跟注册一个效果。DLLimport支持的是非.net框架下面的DLL如C++ 这类编写的  用.net框架编写出来的dll 就可以直接引用啦。

应用举例:

示例使用 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() 返回 50。

生成项目:

  • 使用 Visual C++ 命令行将 Cmdll.c 编译为 DLL:

    cl /LD Cmdll.c

  • 使用命令行编译 CM.cs:

    csc CM.cs

这将创建可执行文件 CM.exe。 运行此程序时,SampleMethod 将值 5 传递到 DLL 文件,该文件将此值乘以 10 返回。

C# 中[DllImport("user32.dll")]和extern用法和示例----转载的更多相关文章

  1. Win32 API中的user32.dll中的ShowWindow方法参数整理

    在使用ShowWindow方法来设置窗体的状态时,由于不知道参数值,用起来非常容易混乱,所以整理了以下其参数的枚举值,方便以后的的使用.   public class User32API { #reg ...

  2. C#中调用user32.dll库的keybd_Event函数,操作键盘

    keybd_event()的函数原型是: void keybd_event( byte bVk,          //虚拟键码 byte bScan,       //该键的硬件扫描码 dword ...

  3. C#中可直接调用WIN32的API函数--USER32.DLL

    Win32的API函数可以直接在C#中直接调用,在做WinForm时还是很有帮助的.有时候直接调用Win32的API,可以很高效的实现想要的效果. using System; using System ...

  4. Winform API "user32.dll"中的函数

    命名空间:System.Runtime.InteropServices /// <summary> /// 该函数检索一指定窗口的客户区域或整个屏幕的显示设备上下文环境的句柄,以后可以在G ...

  5. 【转】c# 调用windows API(user32.dll)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.R ...

  6. user32.dll

    user32.dll中的所有函数 using System; using System.Collections.Generic; using System.Linq; using System.Tex ...

  7. [DllImport("kernel32.dll")]是什么意思??

    转载自:http://blog.csdn.net/sp6645597/article/details/8683737 1.简单说明 这叫引入kernel32.dll这个动态连接库(顾名思义就是一个链接 ...

  8. C#中DllImport用法和路径问题

    DllImport是System.Runtime.InteropServices命名空间下的一个属性类,其功能是提供从非托管DLL导出的函数的必要调用信息.    DllImport属性应用于方法,要 ...

  9. 【WinAPI】User32.dll注释

    #region User32.dll 函数 /// <summary> /// 该函数检索一指定窗口的客户区域或整个屏幕的显示设备上下文环境的句柄,以后可以在GDI函数中使用该句柄来在设备 ...

随机推荐

  1. mac机器smb映射

    1  finder中打开前往 2  输入:smb://10.216.90.*  链接 3  输入 账户和密码(名称和密码是你机器的smb密码:比如123***)

  2. 不要在mutation回调函数之外,修改vuex仓库里属性的状态

    [vuex] do not mutate vuex store state outside mutation handlers. import * as types from './mutation- ...

  3. 组件向外暴露v-model绑定的参数

    <template> <div class="search-box"> <i class="icon-search">< ...

  4. sql语句查询指定月份数据

    要求:查询出emp表中1981年2月份入职的员工 emp表 常用的两种方式: 1.YEAR查询年,MONTH查询月 SELECT * FROM emp WHERE ' 2.date_format (使 ...

  5. 【Go语言系列】1.1、GO语言简介:什么是GO语言

    一.Go的起源 Go语言的所有设计者都说,设计Go语言是因为 C++ 给他们带来了挫败感.在 Google I/O 2012 的 Go 设计小组见面会上,Rob Pike 是这样说的: 我们做了大量的 ...

  6. No space left on device(总结)

    ..1 提示磁盘满了 df -hT 没有满 请问可能原因 可能是inode满了,原因是机器上的小文件太多了 使用df -hi 查看 ..2 提示没有磁盘空间已经满了 ..2.1 问题描述: 发现是日志 ...

  7. GIT 协同开发

    Git 是一个开源的分布式版本控制系统,用于敏捷高效的处理任何项目的版本问题.Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件.与cvs, ...

  8. 第三方控件引起的"类型Universe无法解析程序集"的血案

    前一阵子在项目中添加了IrisSkin2皮肤控件,今天用VS打开悲剧了. 提示"类型Universe无法解析程序集:System.Design,Version=2.0.0.0,Culture ...

  9. Maven中配置jdk的版本

    在单个项目中配置 在maven项目的pom.xml文件中加入以下内容 <build> <plugins> <plugin> <groupId>org.a ...

  10. 《掌握融资必备知识》---创业学习---训练营第一课---HHR---

    一,<开始学习> 1,四个思考题: (1)从你决定开始融资,到你拿到钱,你都需要经历哪些环节? (2)你知道投资机构内部的工作流程吗? (3)融资最好的时机是什么时候? (4)创投圈的专业 ...