美文网首页
[C++] 使用C++编写dll,并用C#调用dll

[C++] 使用C++编写dll,并用C#调用dll

作者: Erland | 来源:发表于2018-06-14 11:05 被阅读0次

最近心血来潮,和一个朋友打算一起写一个放假查询应用软件。
我负责编写假期识别算法,对方负责界面设计,交互设计,以及上层API获取等。对方使用C#语言进行桌面应用开发,也是我们使用的主语言,但我更熟悉C++,因此我们商定:由我负责使用C++编写动态链接库(dll)给上层的C#提供接口

DLL文件创建和编译

IDE:Visual Studio 2015
新建项目:选择 Visual C++、Win32、Win32项目,确定。

新建项目
选择DLL,这里尽量不要使用空项目,IDE会自动生成几个文件。
创建DLL
自动生成的文件包括:stdafx.h、targetver.h、dllmain.cpp、stdafx.cpp、以及ReadMe.txt。具体可以打开查看文件注释,我们只需要在此基础上添加自己的代码。
类的设计
头文件示例如下:
class __declspec(dllexport) StatusDay
{
public:
  static const int ILLEGAL = -1;      // illegal
  StatusDay();
  StatusDay(int status);
  ~StatusDay();
  void setstatus(int new_status);
  int getstatus();
private:
  int status;
  // 0 work day
  // 1 work but holiday
  // 2 holiday: 6, 7
  // 3 holiday: festival
  // 4 holiday: summer, winter
};

__declspec(dllexport):说明这个类是个导出类,从本DLL文件导出。
源文件示例如下:

StatusDay::StatusDay()
{
  setstatus(0);
}

StatusDay::StatusDay(int status)
{
  setstatus(status);  // init the status of this day.
}

void StatusDay::setstatus(int nowstatus)
{
  status = nowstatus;
}

int StatusDay::getstatus()
{
  if (status >= 0 && status <= 4) return status;
  else return ILLEGAL;
}

StatusDay::~StatusDay()
{
}

不再赘述。
为了方便C#的调用,类设计完成之后,还需要把类转换成函数接口,示例如下:

#pragma once
#include "stdafx.h"
namespace LastCalender
{
  extern "C" __declspec(dllexport) void __stdcall init(int now_year);
  extern "C" __declspec(dllexport) void __stdcall read_festival(int month, int day, int is_festival);
  extern "C" __declspec(dllexport) void __stdcall read_vacation(int start_month, int start_day, >int end_month, int end_day, bool is_summer);
  extern "C" __declspec(dllexport) void __stdcall calcu_holiday();
  extern "C" __declspec(dllexport) bool __stdcall seek_status(int month, int day);
  extern "C" __declspec(dllexport) int __stdcall Test();
}
#include "seek.h"
#include "LastCalender.h"

namespace LastCalender
{
  Seek *seek;

  void __stdcall init(int now_year)
  {
      if (now_year > 0)
          seek = new Seek(now_year);
      else
          seek = new Seek();
  }

  void __stdcall read_festival(int month, int day, int is_festival)
  {
      seek->read_festival(month, day, is_festival);
  }

  void __stdcall read_vacation(int start_month, int start_day, int end_month, int end_day, bool is_summer)
  {
      seek->read_vacation(start_month, start_day, end_month, end_day, is_summer);
  }

  void __stdcall calcu_holiday()
  {
      seek->holiday_in_year();
  }

  bool __stdcall seek_status(int month, int day)
  {
      return seek->seek_in_date(month, day);
  }

  int __stdcall Test()
  {
      return seek->for_test();
  }
}

以上将类的成员函数转成 extern "C" __declspec(dllexport) 声明的函数,给外部调用。
到此编译即可生成dll文件。

DLL文件的调用

新建C#项目,将上面生成的dll文件复制到此项目文件夹下。
新建一个类,导入dll文件中的函数

 public class Calender
 {
       [DllImport("LastCalender.dll")]
       public static extern int init(int n);

       [DllImport("LastCalender.dll")]
       public static extern int read_festival(int month, int day, int is_festival);

       [DllImport("LastCalender.dll")]
       public static extern int read_vacation(int start_month, int start_day, int end_month, int end_day, bool is_summer);

       [DllImport("LastCalender.dll")]
       public static extern int calcu_holiday();

       [DllImport("LastCalender.dll")]
       public static extern int seek_status(int month, int day);
}

调用新类中所需函数即可。

特别鸣谢:我的队友,Small Snow。

相关文章

  • [C++] 使用C++编写dll,并用C#调用dll

    最近心血来潮,和一个朋友打算一起写一个放假查询应用软件。我负责编写假期识别算法,对方负责界面设计,交互设计,以及上...

  • C#调用OpenCV函数的实现

    C#调用OpenCV函数的实现步骤:1、C++编写调用OpenCV函数的方法,编译成dll;2、C#引用C++生成...

  • C#与C++类型互转

    一、C#调用DLL文件时参数对应表 二、C#调用C++编写的DLL函数, 以及各种类型的参数传递 如果函数只有传入...

  • C++编写dll与调用

    重要参考 c++ dll编写与加载;C++编程笔记:dll的生成与使用;8.DLL导出C++类; 在 Visual...

  • C#调用C++ dll编写的程序

    title: 'C#调用C++ dll编写的程序'date: 2016-04-10 18:37:16tags: C...

  • mql4文件调用的dll

    编写 MT4调用DLL MT4本身是C++编写的,现在mql4语言能调用的DLL 必须是用C++开发的。VB,C#...

  • DLL调用

    使用VS2012生成DLL文件(1)在C++中调用DLL中的函数(2)在C++中调用DLL中的函数(3)在VS20...

  • 关于用mfc(c++)调用wpf(C#)编写的dll,实现界面消

    关于用mfc(c++)调用wpf(C#)编写的dll,实现界面消息回调的方法。 这几天有一个小项目。使用wpf...

  • C#与c++对应的类型

    //C#调用C++的DLL搜集整理的所有数据类型转换方式-转载//c++:HANDLE(void *) ---- ...

  • java 自定义点击、键盘事件

    首先必要的:c++ dll编写与加载c++ windows平台的Hook掌握hook与dll编写。 学习jni,因...

网友评论

      本文标题:[C++] 使用C++编写dll,并用C#调用dll

      本文链接:https://www.haomeiwen.com/subject/wuvseftx.html