C# 与 C++ 互操作(C# 调用 C++ 的动态链接库)
2024-09-05 23:51:31
1.新建 C++ 动态链接库项目
CPlus.cpp:
#include "stdafx.h" extern "C" __declspec(dllexport) void HelloWorld(char* name)
{
name[] = 'c';
}
stdafx.h:
#pragma once #include "targetver.h" #define WIN32_LEAN_AND_MEAN
#include <windows.h>
extern "C" __declspec(dllexport) void HelloWorld(char* name);
编译 C++ 项目得到 DLL
2.新建 C# 项目
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks; namespace CSharp
{
class Program
{
[DllImport("kernel32.dll", CharSet = CharSet.Ansi)]
static extern IntPtr LoadLibrary(string lpFileName); //加载动态链接库
[DllImport("kernel32.dll", CharSet = CharSet.Ansi)]
static extern IntPtr GetProcAddress(IntPtr hModule, string lpProcName); //获取接口地址
[DllImport("kernel32", EntryPoint = "FreeLibrary", SetLastError = true, CharSet = CharSet.Ansi)]
static extern bool FreeLibrary(IntPtr hModule);
private delegate void DelegateHelloWorld(IntPtr a); private static void Main(string[] args)
{
IntPtr hModule = LoadLibrary(@"D:\MyProject\CSharp\CSharp\bin\Debug\Cplus.dll");
IntPtr proc = GetProcAddress(hModule, "HelloWorld"); Byte[] array = new Byte[];
array[] = (byte)'a';
array[] = (byte)'b';
array[] = (byte)'c';
IntPtr ptr = Marshal.UnsafeAddrOfPinnedArrayElement(array, );
DelegateHelloWorld delegate1 = Marshal.GetDelegateForFunctionPointer(proc, typeof(DelegateHelloWorld)) as DelegateHelloWorld; delegate1(ptr);
string str = Encoding.ASCII.GetString(array).Replace("\0", "");
Console.WriteLine(str); Console.ReadLine();
}
}
}
总体效果是 C# 传入 abc 字符串,C++ 的方法将第一个字节改为 c,C# 得到 cbc。
不同语言之间互相调用需要注意各种数据类型的长度问题,还有编译时选择 32 位 , 64 位的问题。所以使用 数组进行数据交换是比较好的做法。
在将数组转换为字符串时要注意编码格式,常见的是 ASCII, ANSI, UTF8等。
最新文章
- 查看机器上安装的jdk能支持多大内存
- LNMP平台搭建---PHP安装篇
- XmlSpy / XSD 以及 验证
- Sublime Text 新建文件的模版插件: SublimeTmpl
- CSS之自适应布局webkit-box
- 第36条:坚持使用Override注解
- 【MyBatis学习笔记】
- libvirt基于安装
- DLL入门浅析(1)——如何建立DLL
- l连接远程桌面
- Linux系统编程(9)—— 进程之进程控制函数exec系列函数
- HTML DOCTYPE文档类型举例说明
- Onsen UI 前端框架(二)
- 深度学习与计算机视觉系列(2)_图像分类与KNN
- 中间件RabbitMQ之运维篇
- Jdbc连接数据库基本步骤
- CNN初探
- sql——sql中的各种连接
- SpringBoot整合Quartz定时任务 系统job Spring Boot教程 调度任务
- Javascript 思维导图 绘制基础内容(值得一看)