您的位置:首页 > 编程语言 > C语言/C++

.net项目引用C++ 动态链接库.dll

2016-09-26 21:24 316 查看
 项目开发时可能需要调用其动态链接库,如C++动态链接库,实现相应功能,那么在C#里怎么调用C++库里的方法呢,如下提供两种方式。

方式一:建立一个C++项目,选择dll动态链接库如下。



//stdafx.h 文件内容
//#ifdef  func_api
//#else
//#define func_api extern "C" __declspec(dllimport)
//#endif

#define func_api extern "C" __declspec(dllexport)
func_api double Add1(double x, double y);

func_api double Sub1(double x, double y);

func_api double Multiply1(double x, double y);

func_api double Divide1(double x, double y);


如上定义个宏func_api,用于导出C++项目中函数所定义的标示符__declspec(dllexport),其中extern "C"是作用就是在编译时用c的方式编译,也就是不让函数名字变化,因为用C++编译器编译后的函数名称会变化,如add1编译后可能是@ILT+575(_Add1)或什么的不同编译器不同,为了防止客户端可以调到这个函数所以用 extern "C" 这样编译后的函数名称就不变了。

// ConsoleApplication1.cpp 文件内容: 定义 DLL 应用程序的导出函数。
//#define func_api extern "C" __declspec(dllexport)
#include "stdafx.h"
double Add1(double x, double y)
{
return x + y;
}
double Sub1(double x, double y)
{
return x - y;
}
double Multiply1(double x, double y)
{
return x * y;
}
double Divide1(double x, double y)
{
return x / y;
}


方式二:建立一个C++空项目,选择dll动态链接库如下。



添加头文件MathTest.h 代码如下。

#pragma once
namespace MathFuncs
{
class MyMathFuncs
{
public:
// Returns a + b
static __declspec(dllexport) double Add(double a, double b);

// Returns a - b
static __declspec(dllexport) double Subtract(double a, double b);

// Returns a * b
static __declspec(dllexport) double Multiply(double a, double b);

// Returns a / b
static __declspec(dllexport) double Divide(double a, double b);

};
}


添加C++文件MathTest.cpp

// MathTest.cpp
// compile with: /EHsc /LD

#include "MathTest.h"
#include <stdexcept>
using namespace std;
namespace MathFuncs
{
double MyMathFuncs::Add(double a, double b)
{
return a + b;
}

double MyMathFuncs::Subtract(double a, double b)
{
return a - b;
}

double MyMathFuncs::Multiply(double a, double b)
{
return a * b;
}

double MyMathFuncs::Divide(double a, double b)
{
if (b == 0)
{
throw new invalid_argument("b cannot be zero!");
}

return a / b;
}
}


添加模块定义文件,这个文件定义导出函数的名称,这样导出的函数名字就不会变了。

LIBRARY ConsoleApplication2
EXPORTS
Add @1
Subtract @2
Multiply @3
Divide   @4


测试姓名,建立一个C# 控制台项目。



代码如下。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
namespace TestDll
{
class Program
{
[DllImport(@"F:\test_project\C++\ConsoleApplication1\Debug\ConsoleApplication1.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern double Add1(double x, double y);
[DllImport(@"F:\test_project\C++\ConsoleApplication1\Debug\ConsoleApplication1.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern double Multiply1(double x, double y);

[DllImport(@"F:\test_project\C++\ConsoleApplication1\Debug\ConsoleApplication2.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern double Add(double x, double y);
[DllImport(@"F:\test_project\C++\ConsoleApplication1\Debug\ConsoleApplication2.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern double Multiply(double x, double y);
static void Main(string[] args)
{

double result = Add1(10, 20);
Console.WriteLine("The result of add1 is {0}", result);
double result1 = Multiply1(10, 20);
Console.WriteLine("The result of Sub1 is {0}", result1);
Console.WriteLine("========================================");

double result11 = Add(10, 20);
Console.WriteLine("The result of add is {0}", result11);
double result111 = Multiply(10, 20);
Console.WriteLine("The result of Subtract is {0}", result111);
Console.Read();

}
}
}




如果想看C++动态链接库是否有函数导出可以用这个工具dumpbin.exe ,默认路径C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin,很据你vs安装路径下找到它,如下。



注:1.extern "C" 不能导出成员函数。

2.使用标准调用方式_stdcall,函数名称还是会发生改变。

附件链接: https://pan.baidu.com/s/1o8RfgIu 密码: etha
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐