LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

C++ 与 C#混合编程 示例 (基于VS2022)

freeflydom
2025年11月4日 15:36 本文热度 197

C#使用过程中经常会遇到和C++联合开发的过程,通过C++编写动态库,封装成dll后再C#中调用,在此做个记录,

一、新建C#控制台项目

打开VisualStudio,新建一个C#控制台项目,

 

项目名称HelloWorldTest

 下一步

 

点击下一步,一个默认c#项目创建完成

 

二、创建C++库

在解决方案上右键--添加--新建项目,建一个C++动态链接库工程,

 

输入项目名称HelloDll,然后下一步

 

创建完成后如下,在 项目--右键--添加--类, 添加 TestDll 头文件 和源文件 ,文件内容如下:

 然后在 TestDll.cpp 文件 添加代码,如下

#include "pch.h"
#include "TestDll.h"
#include<iostream>
void HelloWorld(char* name)
{
    std::cout << "Hello World " << name << std::endl;
}
int Test()
{
    return 666666;
}
int Add(int a, int b)
{
    return a + b;
}

 

C++库导出有两种方式,建议两种方式同时使用

 

1、以C语言接口的方式导出

在函数前面加上 extern "C" __declspec(dllexport)

extern "C" __declspec(dllexport) void HelloWorld(char* name);
extern "C" __declspec(dllexport) int Test();
extern "C" __declspec(dllexport) int Add(int a,int b);

 

或者使用 extern "C" 包装  类文件

#pragma once
#ifdef __cplusplus
extern "C" {
#endif 
    class TestDll
    {
         __declspec(dllexport) void HelloWorld(char* name);
         __declspec(dllexport) int Test();
         __declspec(dllexport) int Add(int a, int b);
    };
#ifdef __cplusplus
}
#endif

 

2、以模块定义文件的方式导出

在源文件上点击右键,选择添加-》新建项,然后选择 代码-》模块定义文件,添加TestDll.def 文件

 

在TestDll.def 中输入 代码如下:

LIBRARY "TestDll"
EXPORTS   //下边是要导出的函数 不需要分号隔开
HelloWorld @ 1 
Test @ 2
Add @ 3

 

编译生成dll。这里需要注意的是,如果生成是64位的库,C#程序也要是64位的,否则会报错

 

三、C#项目HelloWorldTest下 添加代码

注意 导入命名空间using System.Runtime.InteropServices;

在DllImport导入C/C++编写的动态库时函数,可以加上一些约定参数,例如:

[DllImport(@"HelloDll.dll", EntryPoint = "Test", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]

CallingConvention = CallingConvention.Cdecl,来指定入口点的调用约定

C/C++编写的动态库默认的入口点约定为_cdecl,VS 默认调用动态库时的约定为_winapi

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace HelloWorldTest
{
    internal class Program
    {
        [DllImport("HelloDll.dll")]
        public static extern void HelloWorld(string name);
        [DllImport("HelloDll.dll")]
        public static extern int Test();
        [DllImport("HelloDll.dll")]
        public static extern int Add(int a, int b);
        static void Main(string[] args)
        {
            Console.WriteLine(Test().ToString());
            Console.WriteLine(Add(2, 5));
            HelloWorld("大大大大大猩猩");
            Console.ReadKey();
        }
    }
}

 

然后生成程序 ,注意生成格式要一致

 

把HelloDll.dll添加 HelloWorldTest 项目的引用中 或 把 HelloDll.dll文件放到HelloWorldTest.exe 所在目录

 F5 启动程序 

 

转自https://www.cnblogs.com/Heven-Art/p/19060889


该文章在 2025/11/4 15:36:35 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved