四个步骤

1.创建C++ Win32项目动态库dll

2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库

3.导出C接口

4.c#调用c++动态库

开始你的表演...

①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目

空白解决方案的创建:

添加Visual C++ , Win32 项目

这样一个c++的动态库dll就创建好了,它最终会生成一个dll文件,供c#调用的。

②c++动态库dll引用静态库lib

先将lib头文件和lib库文件复制粘贴到项目目录下

和硬件相关的lib文件一般是分x86 和 x64的

添加外部依赖项 头文件.h :工程---属性---配置属性---c/c++---常规---附加包含目录:加上头文件存放目录。

注意:把配置的Debug和Release 平台的Win32(x86) 和 x64都记得选上路径。

添加引用lib库:工程---属性---配置属性---链接器---常规---附加库目录:加上lib文件存放目录。

注意:把配置的Debug和Release 平台的Win32(x86) 和 x64 都对应选上,一般lib库会有x86 和 x64 ,需要对应选择路径。

添加附加依赖项 lib文件名工程---属性---配置属性---链接器---输入---附加依赖项:加上lib文件名。

注意:把配置的Debug和Release 平台的Win32(x86) 和 x64 都对应加上lib文件名

这样算是把lib库引进来了。

添加Win32Project1.h头文件。

③导出C接口

在源文件Win32Project1.cpp中引入lib头文件并继承lib库,实现里面的方法函数。

#include "stdafx.h"
#include "IntelSRUtility.h"
#include "Win32Project1.h"class IntelSR : SRUtility
{
public:IntelSR() {};~IntelSR() {};BOOL ToggleSRRegkey(DWORD enable) {return toggleSRRegkey(enable);};BOOL ConfigureSuperResolutionMode(DWORD mode) {return configureSuperResolutionMode(mode);};
};BOOL SetSuperRStatus(DWORD enable) {IntelSR *s_IntelAPI = new IntelSR();BOOL rm = s_IntelAPI->ToggleSRRegkey(enable);delete s_IntelAPI;return rm;
}BOOL SetSuperRMode(DWORD mode) {IntelSR *s_IntelAPI = new IntelSR();BOOL rm = s_IntelAPI->ToggleSRRegkey(mode);delete s_IntelAPI;return rm;
}

在头文件Win32Project1.h中导出c接口

#pragma once
#define PLUGIN_API __declspec(dllexport)
typedef int                 BOOL;
typedef unsigned long       DWORD;extern "C" PLUGIN_API BOOL SetSuperRStatus(DWORD enable);extern "C" PLUGIN_API BOOL SetSuperRMode(DWORD mode);

重新生成解决方案,在项目根目录找到dll文件

这样你拿到C++的动态库就可以用c#调用了

④c# 调用c++动态库。

把c++动态库dll拷贝到c#的项目bin目录下面,在c#中调用。

方法一:

/// <summary>
/// SR开关
/// </summary>
/// <param name="enable">1将在驱动程序中启用SR, 0将禁用SR</param>
/// <returns>成功时返回0</returns>
[DllImport("Win32Project1.dll", EntryPoint = "SetSuperRStatus", CallingConvention = CallingConvention.Cdecl)]
public static extern int SetSuperRStatus(int enable);/// <summary>
/// SR模式
/// </summary>
/// <param name="mode">0表示默认模式,1表示质量模式(低性能),2表示混合模式,3表示性能模式(低质量)</param>
/// <returns>成功时返回0</returns>
[DllImport("Win32Project1.dll", EntryPoint = "SetSuperRMode", CallingConvention = CallingConvention.Cdecl)]
public static extern int SetSuperRMode(int mode);

方法二:

using System;
using System.IO;
using System.Runtime.InteropServices;namespace InvokeIntel
{public class InvokeIntelAPI{private DllInvoke dll;public DllInvoke DLL{get{if (dll == null){dll = new DllInvoke(Path.Combine(Environment.CurrentDirectory, "Win32Project1.dll"));}return dll;}set{value = dll;}}public delegate int SetSuperRStatus(int enable);public delegate int SetSuperRMode(int mode);public InvokeIntelAPI(){try{SetSuperRMode mode = (SetSuperRMode)DLL.Invoke("SetSuperRMode", typeof(SetSuperRMode));mode(1);SetSuperRStatus status = (SetSuperRStatus)DLL.Invoke("SetSuperRStatus", typeof(SetSuperRStatus));status(1);}catch (Exception){throw;}}}public class DllInvoke{[DllImport("kernel32.dll")]private extern static IntPtr LoadLibrary(String path);[DllImport("kernel32.dll")]private extern static IntPtr GetProcAddress(IntPtr lib, String funcName);[DllImport("kernel32.dll")]private extern static bool FreeLibrary(IntPtr lib);private IntPtr hLib;public DllInvoke(String DLLPath){hLib = LoadLibrary(DLLPath);}~DllInvoke(){FreeLibrary(hLib);}//将要执行的函数转换为委托public Delegate Invoke(String APIName, Type t){IntPtr api = GetProcAddress(hLib, APIName);return (Delegate)Marshal.GetDelegateForFunctionPointer(api, t);}}
}

方法三:指定环境变量。

​/// <summary>
/// SR开关
/// </summary>
/// <param name="enable">1将在驱动程序中启用SR, 0将禁用SR</param>
/// <returns>成功时返回0</returns>
[DefaultDllImportSearchPaths(DllImportSearchPath.AssemblyDirectory)]
[DllImport("Win32Project1.dll", EntryPoint = "SetSuperRStatus", CallingConvention = CallingConvention.Cdecl)]
public static extern int SetSuperRStatus(int enable);/// <summary>
/// SR模式
/// </summary>
/// <param name="mode">0表示默认模式,1表示质量模式(低性能),2表示混合模式,3表示性能模式(低质量)</param>
/// <returns>成功时返回0</returns>
[DefaultDllImportSearchPaths(DllImportSearchPath.AssemblyDirectory)]
[DllImport("Win32Project1.dll", EntryPoint = "SetSuperRMode", CallingConvention = CallingConvention.Cdecl)]
public static extern int SetSuperRMode(int mode);​

c# 调用c++ lib静态库相关推荐

  1. C++中.lib静态库、.dll动态库的生成及调用2

    关于动.静态库的介绍及静态库的生成及调用参见:C++中.lib静态库..dll动态库的生成及调用<1>,本文主要介绍基于VS2015平台的动态库dll的生成及调用方法. 一.动态库的生成 ...

  2. C++中.lib静态库、.dll动态库的生成及调用1

    一.前言 1.动态链接库(dll)与静态链接库(lib): 动态链接库(dll)是一个可以被其他应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源.在链接步骤中,连接器将从库文件取得所需的代 ...

  3. VS2019:C++程序lib静态库、dll动态库的生成和使用

    一.静态库 静态库的使用需要(1).h头文件:(2).lib静态库文件: 1.静态库生成 (1)项目-右键属性-常规-配置类型-选静态库: (2)点击生成,Debug文件夹下出现lib静态库: 2.静 ...

  4. Unity3D中C#调用iOS的静态库(*.a)

    Unity3D中C#调用iOS的静态库(*.a) https://blog.csdn.net/skylin19840101/article/details/51039176 C#端的处理 C#调用其他 ...

  5. VS2017添加lib静态库文件引用

    1.右键项目,打开proterties 2.打开C/C++ ---> General --->Additional Include Directies ,把与lib相关的头文件所在的目录添 ...

  6. html5调用静态库,如何在VS2010项目中引用Lib静态库(以Openssl为例)

    Openssl是个为网络通信提供安全及数据完整性的一种安全协议,囊括了主要的密码算法.常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用. 首先下载Openssl包 ...

  7. 生成调用自己的静态库lib

    打包静态库lib的主要作用在于--方便下次调(zhuang)用(bi),防止修改实现文件cpp带来不好的影响,所以封装一下 静态库dll类似 1.生成自己的lib 首先新建VS项目,选择项目属性--生 ...

  8. [转]在VS2010 VC++项目中引用Lib静态库(以Openssl为例)

    本文转自:http://kb.cnblogs.com/page/94467/ Openssl是个为网络通信提供安全及数据完整性的一种安全协议,囊括了主要的密码算法.常用的密钥和证书封装管理功能以及SS ...

  9. lib静态库逆向分析

    当我们要分析一个lib库里的代码时,首先需要判断这是一个静态库还是一个导入库. 库类型判断 lib文件其实是一个压缩文件. 我们可以直接使用7z打开lib文件,以查看里面的内容. 如果里面的内容是ob ...

最新文章

  1. 【FFmpeg】使用过的命令汇总(持续更新中...)
  2. 关于ubuntu 16.04 docker常用命令
  3. 小逗比机器人聊天接口api
  4. IDC简报:3月国外最佳共享虚拟主机提供商Top5
  5. wince模拟器访问网络_Windows 10X开发模拟器上手
  6. Geoserver怎样设置地图shp文件为相对路径,可轻松复制移植
  7. imx6的kernel3.4.15启动流程
  8. dedecms 在模板里引入php文件夹,dedecms如何添加并引入php文件
  9. 信息学奥赛一本通 1096:数字统计 | 1949:【10NOIP普及组】数字统计 | OpenJudge NOI 1.5 41
  10. 老司机们看一下!支付宝又为你省下一笔钱了,还有6大免费承诺
  11. 告别3D Touch 2019款iPhone手机或将拿掉屏幕压感功能
  12. mac下多个php版本快速切换的方法
  13. hadoop22---wait,notify
  14. Android中将EditText里面的内容设置成任意想要的状
  15. 计算机03年word做母亲节贺卡,制作图文并茂的作品---用word制作母亲节贺卡PPT课件...
  16. 光学表面面形的计算机仿真,光学表面面形的计算机仿真
  17. 【美影】通灵男孩诺曼.Paranorman
  18. java编程括号匹配,Java正则表达式括号内容匹配
  19. HCIE--mac地址 详解
  20. vue中关闭浏览器清除localStorage,并且刷新时保持状态不受影响

热门文章

  1. JavaScript基础之函数与作用域(二)
  2. 序列学习——RNN网络之 LSTM 原理
  3. 【高通平台】安卓平板,使用QQ 视频通话,视频旋转90度问题修改
  4. 服务器CPU跑满了怎么办
  5. proc文件系统下各参数解析
  6. U8到货拒收单API接口示例(参照采购到货)
  7. Windows下cmd(命令提示符)中的复制粘贴操作
  8. 最佳实践|用腾讯云AI图像搜索打造属于自己的拍立淘
  9. 像容忍自己一样容忍他人
  10. eCryptfs源码注释(2)