ChaoQun

正在慢慢成长的程序猿

C# 中使用C++导出的DLL文件

摘要

本篇博客主要介绍使用C++生成DLL库,并在C#工程之中进行调用。本技术可以用于Unity开发中,可以将一些复杂计算量较大的工作使用C++编写,生成DLL文件后在Unity中使用C#脚本进行调用。

本演示实例中会对涉及到的部分提出详细的解释说明。本工程使用的编程工具为 Microsoft Visual Studio Community 2015 Version 14.0.25431.01 Update 3

C++生成DLL库文件

 新建工程

首先让我们新建一个C++的DLL工程,新建过程如下图:
这里写图片描述
这里写图片描述

  1. 选择Visual C++ Win32工程,设置好工程名和路径。
  2. 选择应用类型为DLL,并且新建空工程。

添加代码文件

这里展示普通的C++ 函数,和C++ 类的静态函数。
新建一个类Add 具体代码文件如下所示。

其中__stdcall 关键字 是Microsoft 专用的。 __stdcall 调用约定用于调用 Win32 API 函数。 被调用方将清理堆栈,以便让编译器生成 vararg 函数 __cdecl。 使用此调用约定的函数需要一个函数原型。

__stdcall 是生命DLL文件导出函数的一种语法,需要结合.def 文件使用。

函数语法

return-type __stdcall function-name[(argument-list)]  
// Add.h

#pragma once
class Add
{
public:
    Add();
    ~Add();
    static double __stdcall add(double a, double b);    // 将要导出的静态函数

};
// Add.cpp

#include "Add.h"

Add::Add()
{
}

Add::~Add()
{
}

double Add::add(double a, double b)
{
    return a + b;
}

增加一个需要导出的普通函数。新建一个文件 multiple.h

// multiple.h


#pragma once

double  __stdcall mult(double a, double b);
// multiple.cpp


#include "multiple.h"

double  mult(double a, double b)
{
    return a * b;
}

新建def文件

模块定义 (.def) 文件为链接器提供有关被链接程序的导出、特性及其他方面的信息。 生成 DLL 时,.def 文件最有用。 由于存在可代替模块定义语句使用的链接器选项,通常不需要.def文件。 也可以将 __declspec(dllexport)用作指定导出函数的手段。

这里我们新建一个简单的def文件,将刚才的两个静态函数导出。
这里写图片描述

文件内容如下:

LIBRARY CPP_DLL
EXPORTS
mult    @1
add     @2

关于DEF文件中的细节语法,请看参考链接。

其中 LIBRARY 后紧跟导出的DLL文件的名称
EXPORTS 是确认导出的函数的关键字。EXPORTS语法介绍

C# 管理工程

我们还可用C#将C++的DLL库再封装一次,然后便可以更加方便的其他的C# 文件中使用。

新建工程

我们直接在该工程中新建一个C# Class Library工程,名称设置为 Dll_test
这里写图片描述

新建一个CS文件, plus.cs内容如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;   // 加载DLL函数需要

namespace Dll_test
{
    public class Plus
    {
        [DllImport("CPP_DLL")]
        private static extern double add(double a, double b);   // 从DLL文件中寻找到add 函数

        [DllImport("DPP_DLL")]
        private static extern double mult(double a, double b);

        public double plus(double a, double b)
        {
            return add(a, b);
        }

        public double multiple(double a,double b)
        {
            return mult(a, b);
        }
    }
}

 测试DLL文件

我们可以在每个工程的输出路径下找到各自的dll文件。
在这里

CPP_DLL :project\x64\Release\CPP_DLL.dll
Dll_test.dll: project\Dll_test\bin\Release\Dll_test.dll

如果我们需要在新的工程中使用,那么将这两个文件拷贝到新的工程的根路径下。

我们新建一个C#的控制台程序来测试是否能够使用这两个文件。
这里写图片描述

右键工程 add->References,选择浏览,找到Plus.dll。然后勾选改文件。

参考链接

  1. DLL中.def文件的使用
  2. MSDN DEF文件
  3. __stdcall介绍
  4. vs2010中c#中类库dll制作和引用方法
阅读更多
版权声明:本文为博主原创文章,转载时应附上本文链接。 如有其他任何问题需要交流或帮助,请邮件联系博主 mcoder2014@sina.com https://blog.csdn.net/jcq521045349/article/details/75269597
个人分类: 日常学习
想对作者说点什么? 我来说一句

C++ DLL 导出类 示例

2015年08月06日 25KB 下载

没有更多推荐了,返回首页

不良信息举报

C# 中使用C++导出的DLL文件

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭