原文: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. P1149

    这题不难,我写的一个复杂度 $ O(n^2) $ 的递归算法.. #include <bits/stdc++.h> using namespace std; #define rep(i, ...

  2. Kosaraju's algorithm

    推荐到我的这篇博客中看完整版的. 该算法用于求解有向图的强连通分量,也就是强连通子图的个数. 算法实现摘自Kosaraju's algorithm - 百度百科: #include <iostr ...

  3. 第八届极客大挑战 Web-故道白云&Clound的错误

    web-故道白云 题目: 解题思路: 0x01 首先看到题目说html里有秘密,就看了下源代码如图, 重点在红圈那里,表示输入的变量是id,当然上一行的method=“get”同时说明是get方式获取 ...

  4. linux contab

    定义格式: * * * * * commandm(0-59), h(0-23) d(1-31) M(1-12) W(0-7)周W用1-6表示分别对应:每周一….五,六,周日在国外老外周日相当于第一个工 ...

  5. 惠普台式机,如何选择U盘启动

    开机先连续点击键盘F9按键进入选择启动盘界面,找到自己的U盘(KingstonDataTraveler 3.0)

  6. Python:元组类型

    概念 有序的 不可变的 元素集合 和列表的区别就是,元组是不可以修改的 定义 空元组:() 一个元素的元组: (a,),只有一个元素,要加一个逗号进行区分 多个元素的元组:(a, b, c) 除空元组 ...

  7. spark sql 访问mysql数据库

    pom.xml <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-ja ...

  8. 解决mysql和navicat乱码问题

    1,首先进入mysql的my.ini文件,进行编码修改,全部改成utf8编码(这里就不赘述了,网上一搜一堆) 2,最重要的一点,把原先navicat创建的连接断开,重新创建新连接,在该新连接下创建库, ...

  9. 吴裕雄 python 神经网络——TensorFlow 输入文件队列

    import tensorflow as tf def _int64_feature(value): return tf.train.Feature(int64_list=tf.train.Int64 ...

  10. js图片轮换播放器

    <!DOCTYPE html> <html> <head> <title></title> <meta charset="u ...