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();

}

}

}

相关推荐
程序设计实验室43 分钟前
C# 扩展方法只会写 this 吗?C# 14 新语法直接把扩展方法玩出了花
c#
得物技术1 小时前
搜索 C++ 引擎回归能力建设:从自测到工程化准出|得物技术
c++·后端·测试
唐青枫3 小时前
C#.NET SignalR 深入解析:实时通信、Hub 与连接管理实战
c#·.net
唐宋元明清21889 小时前
.NET Win32磁盘动态卷/跨区卷触发“函数不正确”问题排查
windows·c#·存储
hez201010 小时前
Satori GC:同时做到高吞吐、低延时和低内存占用
c#·.net·.net core·gc·clr
xlp666hub21 小时前
Leetcode 第三题:用C++解决最长连续序列
c++·leetcode
会员源码网1 天前
构造函数抛出异常:C++对象部分初始化的陷阱与应对策略
c++
xlp666hub1 天前
Leetcode第二题:用 C++ 解决字母异位词分组
c++·leetcode
不想写代码的星星1 天前
static 关键字:从 C 到 C++,一篇文章彻底搞懂它的“七十二变”
c++
唐青枫1 天前
C#.NET Channel 深入解析:高性能异步生产者消费者模型实战
c#·.net