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等。

最新文章

  1. 查看机器上安装的jdk能支持多大内存
  2. LNMP平台搭建---PHP安装篇
  3. XmlSpy / XSD 以及 验证
  4. Sublime Text 新建文件的模版插件: SublimeTmpl
  5. CSS之自适应布局webkit-box
  6. 第36条:坚持使用Override注解
  7. 【MyBatis学习笔记】
  8. libvirt基于安装
  9. DLL入门浅析(1)——如何建立DLL
  10. l连接远程桌面
  11. Linux系统编程(9)—— 进程之进程控制函数exec系列函数
  12. HTML DOCTYPE文档类型举例说明
  13. Onsen UI 前端框架(二)
  14. 深度学习与计算机视觉系列(2)_图像分类与KNN
  15. 中间件RabbitMQ之运维篇
  16. Jdbc连接数据库基本步骤
  17. CNN初探
  18. sql——sql中的各种连接
  19. SpringBoot整合Quartz定时任务 系统job Spring Boot教程 调度任务
  20. Javascript 思维导图 绘制基础内容(值得一看)

热门文章

  1. android5.1修改系统默认音量
  2. PF_INET 与驱动
  3. Sass Maps的函数-map-keys($map)
  4. 【串线篇】Mybatis之动态sql
  5. springboot+jsp项目实例(第二弹)(成功)
  6. pipelines和重定向命令
  7. Mac下通过npm安装webpack 、vuejs,以及引入jquery、bootstrap等(初稿)
  8. leetcode-167周赛-1291-顺次数
  9. uiautomator python版本
  10. 网站升级HTTPS教程