C#调用c++dll的两种方法(静态方法和动态方法)

一.c#项目创建

1.创建一个console控制台程序。

2.把dll拷贝到c#生成的.exe程序的目录内。

3.在c#的program.cs类引入命名空间System.Runtime.InteropServices。

System.Runtime.InteropServices 命名空间提供了一系列类、接口和属性,主要用于促进托管代码(C# 代码)和非托管代码(如 C 或 C++ 代码)之间的互操作性。

它允许 C# 程序与 Windows API、动态链接库(DLL)、COM 组件等进行交互,使开发人员能够在 C# 程序中调用非托管代码,以及对 COM 组件进行操作。

二.调用c++ DLL方法一(静态调用)

using System;

using System.Collections.Generic;

using System.Linq;

using System.Runtime.InteropServices;

using System.Text;

using System.Threading.Tasks;

namespace ConsoleApp3

{

class Program

{

DllImport("Testdll.dll", CallingConvention = CallingConvention.Cdecl)

extern static int add(int a, int b);

DllImport("Testdll.dll", CallingConvention = CallingConvention.Cdecl)

extern static int minus(int a, int b);

DllImport("Testdll.dll", CallingConvention = CallingConvention.Cdecl)

extern static IntPtr Getversion();

static void Main(string[] args)

{

Console.WriteLine(add(1,6));

Console.WriteLine(minus(1, 6));

IntPtr pStr = Getversion();

string version = Marshal.PtrToStringAnsi(pStr);

Console.WriteLine(version);

Console.ReadKey();

}

}

}

三.调用c++ DLL方法二(动态调用)

这样做的好处是,dll不用放到exe的根目录,可以自己放到任何地方,方便管理。

1.新建一个DLLWrapper类。

代码如下:

using System;

using System.Collections.Generic;

using System.IO;

using System.Linq;

using System.Runtime.InteropServices;

using System.Text;

using System.Threading.Tasks;

namespace ConsoleApp3

{

public class DLLWrapper

{

DllImport("kernel32.dll", SetLastError = true)

static extern IntPtr LoadLibrary(string lpFileName);

DllImport("kernel32.dll", SetLastError = true)

static extern bool FreeLibrary(IntPtr hModule);

DllImport("kernel32.dll", SetLastError = true)

static extern bool SetDllDirectory(string lpPathName);

IntPtr pDll = IntPtr.Zero;

public bool LoadDynamicLibrary(string path,string dlname)

{

if (File.Exists(Path.Combine(path, dlname)))

{

SetDllDirectory(path);

pDll = LoadLibrary(dlname);

if (pDll == IntPtr.Zero)

{

Console.WriteLine("Failed to load DLL");

return false;

}

else

{

Console.WriteLine("load DLL success");

return true;

}

}

else

{

Console.WriteLine("DLL is not exist");

return false;

}

}

public bool FreeDllIntPtr()

{

bool resultFree = FreeLibrary(pDll);

if (resultFree)

{

Console.WriteLine("DLL successfully unloaded.");

return true;

}

else

{

Console.WriteLine("Failed to unload DLL.");

return false;

}

}

}

}

2.在program.cs调用这个类

using System;

using System.Collections.Generic;

using System.Linq;

using System.Runtime.InteropServices;

using System.Text;

using System.Threading.Tasks;

namespace ConsoleApp3

{

class Program

{

DllImport("Testdll.dll", CallingConvention = CallingConvention.Cdecl)

extern static int add(int a, int b);

DllImport("Testdll.dll", CallingConvention = CallingConvention.Cdecl)

extern static int minus(int a, int b);

DllImport("Testdll.dll", CallingConvention = CallingConvention.Cdecl)

extern static IntPtr Getversion();

static void Main(string[] args)

{

DLLWrapper Wrapper = new DLLWrapper();

//加载dll,传入dll的文件夹路径

Wrapper.LoadDynamicLibrary(Environment.CurrentDirectory+ "\\Library", "Testdll.dll");

Console.WriteLine(add(1,5));

Console.WriteLine(minus(1, 5));

IntPtr pStr = Getversion();

string version = Marshal.PtrToStringAnsi(pStr);

Console.WriteLine(version);

//释放dll

Wrapper.FreeDllIntPtr();

Console.ReadKey();

}

}

}

相关推荐
whoarethenext7 分钟前
使用 C++ 实现 MFCC 特征提取与说话人识别系统
开发语言·c++·语音识别·mfcc
R-G-B7 分钟前
【MFC】Combobox下拉框中4个选项,运行后点击下拉框选项不能全部展示出来,只能显示2个选项,需要垂直滚动条滚动显示其余选项
c++·mfc
视觉人机器视觉2 小时前
Visual Studio2022和C++opencv的配置保姆级教程
c++·opencv·visual studio
liulilittle2 小时前
C++ i386/AMD64平台汇编指令对齐长度获取实现
c语言·开发语言·汇编·c++
sun0077003 小时前
std::forward作用
开发语言·c++·算法
一名用户4 小时前
unity实现梦日记式传送组件
后端·c#·unity3d
海棠玛卡4 小时前
C/C++内存管理
c++
虾球xz4 小时前
CppCon 2018 学习:THE MOST VALUABLE VALUES
开发语言·c++·学习
阿蒙Amon5 小时前
C#扩展方法全解析:给现有类型插上翅膀的魔法
开发语言·c#
2401_881244406 小时前
牛客周赛99
c++