.net项目引用C++ 动态链接库.dll
2016-09-26 21:24
316 查看
项目开发时可能需要调用其动态链接库,如C++动态链接库,实现相应功能,那么在C#里怎么调用C++库里的方法呢,如下提供两种方式。
方式一:建立一个C++项目,选择dll动态链接库如下。
如上定义个宏func_api,用于导出C++项目中函数所定义的标示符__declspec(dllexport),其中extern "C"是作用就是在编译时用c的方式编译,也就是不让函数名字变化,因为用C++编译器编译后的函数名称会变化,如add1编译后可能是@ILT+575(_Add1)或什么的不同编译器不同,为了防止客户端可以调到这个函数所以用 extern "C" 这样编译后的函数名称就不变了。
方式二:建立一个C++空项目,选择dll动态链接库如下。
添加头文件MathTest.h 代码如下。
添加C++文件MathTest.cpp
添加模块定义文件,这个文件定义导出函数的名称,这样导出的函数名字就不会变了。
测试姓名,建立一个C# 控制台项目。
代码如下。
如果想看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
方式一:建立一个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
相关文章推荐
- .NET 项目中引用的DLL 版本不一致的问题
- .NET 项目中引用的DLL 版本不一致的问题
- .Net项目中添加DLL引用后无法编译的解决方案
- Swig转c++ lib项目到c#可引用的dll
- [Setting]VS2008项目怎样添加“依赖(lib)”、“库目录(Libs)”、“包含目录(include)”和“引用动态链接库(dll)”
- 通过lib对动态链接库DLL进行引用的项目,发布时DLL放置的位置
- .net在同一个项目中要引用两种不同版本的dll(dll hell)的解决办法
- Swig转c++ lib项目到c#可引用的dll
- .net 项目添加Dll成功,却无法引用其中的命名空间的现象
- 通过lib对动态链接库DLL进行引用的项目,发布时DLL放置的位置
- eclipse中的java工程项目如何引用外部jar包和dll动态链接库?
- Swig将C++编译lib项目转换为C#可引用的dll[勘误后]
- .net在同一个项目中要引用两种不同版本的dll(dll hell)的解决办法
- eclipse中的java工程项目如何引用外部jar包和dll动态链接库?
- 关于在C++开发的项目中引用后缀名为.c文件的一句话提醒
- VS2005 .Net项目升级到VS2008后新建Aspx页面找到System.Linq.Dll引用的解决办法
- 遭遇 VS 的 无法调试引用的类库项目(DLL)问题(生成下面的模块时,启用了优化或没有调试信息)
- 【原创】C++创建和使用动态链接库之常规DLL
- Windows Via C/C++ 读书笔记 13 动态链接库基础DLL Basics
- 移动项目开发笔记(管理不同解决方案下的DLL文件相互引用之心得体会)