在VS2015中用C++创建动态库并用C#调用

42 篇文章 1 订阅

引用:https://blog.csdn.net/songyi160/article/details/50741329

 

在VS2015中用C++创建动态库并用C#调用

2016年02月25日 23:39:38 songyi160 阅读数:10785

版权声明:本文为【CSDN博主:松一160】原创文章,未经允许不得转载。 https://blog.csdn.net/songyi160/article/details/50741329

VS2015用C++创建动态库DLL步骤如下:

(1)启动VS2015》文件》新建》项目,按下图进行选择填写,选择Win32控制台应用程序或Win32项目都可以,这两相都会弹出相同的创建窗口,如第二张图,第三张图。

(2)在Win32应用程序向导对话框中选择【下一步】

(3)按下图进行勾选

导出符号作用:生成的代码中会自动包含一个导出变量、一个导出函数和一个导出类的示例,并且对应的.h文件中也会创建相应的导出操作,可加快程序开发。

预编译头作用:VS 默认情况下会创建并使用预编译头文件(也就是自动创建 StdAfx.h 和 StdAfx.cpp 这两个文件),以便在编译时加快编译速度,预编译器将它编译后,会生成一                               个 Pre-compiled header ,也就是 pch 文件,这样下次就可以直接使用这里已经编译好了的代码了。

(4)整个测试项目创建后,整体效果如下图:

(5)将DLLTest.cpp中红色框内VS自动创建的示例代码删除掉

(6)将DLLTest.h中红色框内VS自动创建的示例代码删除掉

(7)DLLTest.cpp中添加如下图红色框中的函数Test1和Test2,其中一个有参数,一个无参数

(8)DLLTest.h中添加函数Test1和Test2的导出形式,注意是EXTERN_C,以C语言函数名导出可以保证导出的函数名不变

(9)生成解决方案,此时在项目的目录的Debug文件夹下会看到生成的DLL,如下图

VS2015用C#调用刚才C++创建动态库DLL步骤如下:

(1)在解决方案上右击进行如下图所示选择

(2)按下图进行选择,创建C#控制台程序(控制台程序比较方便所以没建其它C#程序)调用C++创建的DLL

(3)创建后的整体效果如下图:

(4)因为要用到DllImport,所以先导入命名空间using System.Runtime.InteropServices;

          打开Program.cs文件并添加下图所示代码:

          注意在DllImport导入C/C++编写的动态库时函数,加上CallingConvention = CallingConvention.Cdecl,来指定入口点的调用约定,否则有可能会               出现下面第二张图提示错误,因为C/C++在导出时默认的调用约定是_cdecl,详细剖析见下篇博客【VS2015用C++创建的动态库导出函数名乱码原因分析】。

(5)在CallDll项目上右击选择【设为启动项目】,然后运行程序,结果如下图所示:

 

、、===================================以上是转载文档,测试时候记得将CPU改为any CPU。

下面是测试代码

DLL1.h ==========================================================================

// 下列 ifdef 块是创建使从 DLL 导出更简单的
// 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 DLL1_EXPORTS
// 符号编译的。在使用此 DLL 的
// 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将
// DLL1_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的
// 符号视为是被导出的。
#ifdef DLL1_EXPORTS
#define DLL1_API __declspec(dllexport)
#else
#define DLL1_API __declspec(dllimport)
#endif

EXTERN_C DLL1_API int Test1();
EXTERN_C DLL1_API int Test2(int a,int b);

此类是从 DLL1.dll 导出的
//class DLL1_API CDLL1 {
//public:
//    CDLL1(void);
//    // TODO:  在此添加您的方法。
//};
//
//extern DLL1_API int nDLL1;
//
//DLL1_API int fnDLL1(void);

 

DLL1.cpp ==========================================================================

// DLL1.cpp : 定义 DLL 应用程序的导出函数。
//

#include "stdafx.h"
#include "DLL1.h"

DLL1_API int Test1()
{
    return 123456;
}

DLL1_API int Test2(int a,int b)
{
    return a + b;
}

//
这是导出变量的一个示例
//DLL1_API int nDLL1=0;
//
这是导出函数的一个示例。
//DLL1_API int fnDLL1(void)
//{
//    return 42;
//}
//
这是已导出类的构造函数。
有关类定义的信息,请参阅 DLL1.h
//CDLL1::CDLL1()
//{
//    return;
//}
//======================================================================================

C# 建立一个windowForm窗口程序,点击按钮执行C++里面的DLL

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.Runtime.InteropServices;

namespace CallDLL
{
    public partial class Form1 : Form
    {

        [DllImport("DLL1.dll", EntryPoint = "Test1")]
        extern static int Test1();

        [DllImport("DLL1.dll", EntryPoint = "Test2",CallingConvention =CallingConvention.Cdecl)]
        extern static int Test2(int a,int b);

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show(Test1().ToString());

            MessageBox.Show(Test2(6,9).ToString());

        }
    }
}

效果如下=====

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值