当前位置: 首页 > article >正文

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

        }

    }

}


http://www.kler.cn/a/513462.html

相关文章:

  • CSS语言的数据类型
  • day 21
  • Python 脚本-扫描当前目录和所有子目录并显示它们的大小。
  • JavaScript学习笔记(1)
  • WPS数据分析000001
  • 七大排序算法
  • 大华相机DH-IPC-HFW3237M支持的ONVIF协议
  • Apache SeaTunnel 2.3.9 正式发布:多项新特性与优化全面提升数据集成能力
  • 【Python项目】小区监控图像拼接系统
  • Spring 6 第5章——面向切面:AOP
  • Spring Boot框架下的上海特产销售商城网站开发之旅
  • Java复习第四天
  • 如何写出优秀的提示词?ChatGPT官方的六种方法
  • 【科研建模】Pycaret自动机器学习框架使用流程及多分类项目实战案例详解
  • 【蓝桥杯】43694.正则问题
  • Axios发起HTTP请求时的先后执行顺序
  • 1/20赛后总结
  • 22. C语言 输入与输出详解
  • 云计算、AI与国产化浪潮下DBA职业之路风云变幻,如何谋破局启新途?
  • docker load报错(unexpected EOF)
  • 深入解析 Spring 框架中的事务传播行为
  • 视频修复最强算法 部署笔记2025
  • Java面试专题——面向对象
  • JavaScript中的数据类型以及存储上的差别
  • Python----Python高级(文件操作open,os模块对于文件操作,shutil模块 )
  • 深入探究分布式日志系统 Graylog:架构、部署与优化