.net项目引用C++ 动态链接库.dll
项目开发时可能需要调用其动态链接库,如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 == )
{
throw new invalid_argument("b cannot be zero!");
} return a / b;
}
}
添加模块定义文件,这个文件定义导出函数的名称,这样导出的函数名字就不会变了。
LIBRARY ConsoleApplication2
EXPORTS
Add @
Subtract @
Multiply @
Divide @
测试姓名,建立一个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(, );
Console.WriteLine("The result of add1 is {0}", result);
double result1 = Multiply1(, );
Console.WriteLine("The result of Sub1 is {0}", result1);
Console.WriteLine("========================================"); double result11 = Add(, );
Console.WriteLine("The result of add is {0}", result11);
double result111 = Multiply(, );
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
.net项目引用C++ 动态链接库.dll的更多相关文章
- ASP.net发布项目引用了C++DLL后页面提示找不到指定模块的异常
1.在引用C++dll的DllImport位置指定dll位置 [DllImport(@"C:\Windows\System32\DDyn_Method.dll", EntryPoi ...
- GZFramwork数据库层《前言》DLL项目引用
新建项目: 1. 项目引入GZFramwork.dll NuGet地址:Install-Package GZFramwork 每个项目都引用 2.BLL层 设置数据库连接维护类:继承于:GZFramw ...
- 同一个解决方案或有依赖关系的两个项目引用同名但不同版本的DLL
问题描述 我们最近在使用Redis作Session的集中化,中间碰到了一个如下问题:我们有一些项目比较老,引用了NewtonJson的4.0.3.0版本的DLL,但是Redis提供的C#集成DLL引用 ...
- 在 Target 中获取项目引用的所有依赖(dll/NuGet/Project)的路径
原文:在 Target 中获取项目引用的所有依赖(dll/NuGet/Project)的路径 在项目编译成 dll 之前,如何分析项目的所有依赖呢?可以在在项目的 Target 中去收集项目的依赖. ...
- visual studio项目多级引用不拷贝dll的问题
最近碰到一个visual studio项目多级引用不拷贝dll的问题,花了很久查了很多资料,特此记录 A项目引用B项目, B项目引用C项目,C项目引用ef及oracle.ef using Oracle ...
- VC++动态链接库(DLL)编程深入浅出(zz)
VC++动态链接库(DLL)编程深入浅出(zz) 1.概论 先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用 ...
- VS2010编写动态链接库DLL及单元测试用例,调用DLL测试正确性
转自:http://blog.csdn.net/testcs_dn/article/details/27237509 本文将创建一个简单的动态链接库,并编写一个控制台应用程序使用该动态链接库,该动态链 ...
- vs2010创建和使用动态链接库(dll)
本文将创建一个简单的动态链接库,并编写一个应用台控制程序使用该动态链接库,并提出了与实现相关的几个问题,供初学者交流. 本文包含以下内容: 创建动态链接库项目 向动态链接库添加类 创建引用动态链接库的 ...
- 动态链接库 DLL
动态链接库DLL 不使用时不会有任何作用,只有在其他模块调用动态链接库中的函数时,它才发挥作用. 一.静态库与动态库 1.静态库 函数和数据被编译进一个二进制文件(.LIB),编译时,会将其组合起来创 ...
随机推荐
- 初识jsonp
jsonp 全称是JSON with Padding,是为了解决跨域请求资源而产生的解决方案.很多时候我们需要在客户端获取服务器数据进行操作,一般我们会使用ajax+webservice做此事,但是如 ...
- 据说每个大牛、小牛都应该有自己的库——JavaScript原生对象拓展
在据说每个大牛.小牛都应该有自己的库——框架篇中我扬言要做个小牛,没想到一天没更新,小伙儿伴们就戏谑的问我,油哥是不是要太监了?其实事情是这个样子的,这不是太监的节奏,一是,关于写个自己的库的想法由来 ...
- ssh/openssh
http://www.cnblogs.com/wwufengg/articles/ssh-openssh-detail.html http://www.cnblogs.com/jjkv3/archiv ...
- 知方可补不足~row_number,rank,dense_rank,ntile排名函数的用法
回到目录 这篇文章介绍SQL中4个很有意思的函数,我称它的行标函数,它们是row_number,rank,dense_rank和ntile,下面分别进行介绍. 一 row_number:它为数据表加一 ...
- 爱上MVC3~在控制器或Action上动态设定模板页(Layout)
回到目录 很多境况下,我们需要设置自己模块的layout,即它的布局页面,在MVC2中叫它模板页面,你可以在return view方法时设置它,当然,这不是一种好方法,因为我不想每个action都去设 ...
- EF架构~在global.asax里写了一个异常跳转,不错!
回到目录 一般地,网站出现异常后,我们会通过设置web.config的方法来实现友好页的显示,这个方法比较常用,但捕捉的信息不是很具体,在程序测试阶段,我们可以通过global.asax来实现友好的, ...
- Atitit 迭代法 “二分法”和“牛顿迭代法 attilax总结
Atitit 迭代法 "二分法"和"牛顿迭代法 attilax总结 1.1. ."二分法"和"牛顿迭代法"属于近似迭代法1 1. ...
- Atitti css transition Animation differ区别
Atitti css transition Animation differ区别 1.1. transition的优点在于简单易用,但是它有几个很大的局限. 1 1.2. Transition ...
- 高并发、海量数据处理尽量少使用using也能提升效率
请看下面两段: 第一种方式: MemoryStream stream = new MemoryStream(); string text = "aasasdfasdfad;sas;fkqew ...
- KnockoutJS 3.X API 第四章 表单绑定(11) options绑定
目的 options绑定主要用于下拉列表中(即<select>元素)或多选列表(例如,<select size='6'>).此绑定不能与除<select>元素之外的 ...