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

VS创建C++动态库和C#访问过程

以C++ 14版本和net 8.0为例,使用vs2022工具

1 新建项目

在这里插入图片描述

2 添加类文件

在这里插入图片描述

3 项目文件列表如下

在这里插入图片描述

4 写头文件

#pragma once#ifdef TIMECONVERTER_EXPORTS
#define TIMECONVERTER_API __declspec(dllexport)
#else
#define TIMECONVERTER_API __declspec(dllimport)
#endifextern "C" 
{// 将时间转换为字符串TIMECONVERTER_API const char* ConvertTimeToString(int year, int month, int day,int hour, int minute, int second);TIMECONVERTER_API const char* GetCurrentTimeString();// 释放字符串内存TIMECONVERTER_API void FreeString(char* str);
}

5 写cpp文件

#include "pch.h"#include "TimeConverter.h"
#include <string>
#include <sstream>
#include <iomanip>
#include <iostream>using namespace std;// 导出的函数:将时间转换为字符串
extern "C" TIMECONVERTER_API const char* ConvertTimeToString(int year, int month, int day,int hour, int minute, int second)
{try {// 验证输入参数if (year < 1900 || year > 2100) return nullptr;if (month < 1 || month > 12) return nullptr;if (day < 1 || day > 31) return nullptr;if (hour < 0 || hour > 23) return nullptr;if (minute < 0 || minute > 59) return nullptr;if (second < 0 || second > 59) return nullptr;// 格式化时间字符串stringstream ss;ss << setw(4) << setfill('0') << year << "-"<< setw(2) << setfill('0') << month << "-"<< setw(2) << setfill('0') << day << " "<< setw(2) << setfill('0') << hour << ":"<< setw(2) << setfill('0') << minute << ":"<< setw(2) << setfill('0') << second;string result = ss.str();// 分配内存并返回字符串char* output = new char[result.length() + 1];strcpy_s(output, result.length() + 1, result.c_str());return output;}catch (...) {return nullptr;}
}// 导出的函数:释放字符串内存
extern "C" TIMECONVERTER_API void FreeString(char* str)
{if (str != nullptr){delete[] str;}
}extern "C" TIMECONVERTER_API const char* GetCurrentTimeString()
{try {time_t now = time(nullptr);tm timeInfo;localtime_s(&timeInfo, &now);return ConvertTimeToString(timeInfo.tm_year + 1900,timeInfo.tm_mon + 1,timeInfo.tm_mday,timeInfo.tm_hour,timeInfo.tm_min,timeInfo.tm_sec);}catch (...){return nullptr;}
}

6 注意配置信息

配置属性 → C/C++ → 预处理器 → 预处理器定义:添加 TIMECONVERTER_EXPORTS

配置属性 → 常规 → 配置类型:动态库(.dll)

在这里插入图片描述
在这里插入图片描述

7 新建C#项目拷贝dll文件

拷贝C++的dll文件到C#项目生成文件目录下

8 引用dll测试

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;namespace StringTimeTest
{public partial class UserControl1: UserControl{public UserControl1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){Console.WriteLine("C++ 时间转换器测试");Console.WriteLine("==================");TestTimeConversion("当前时间");// 测试用例1:当前时间TestTimeConversion(2024, 1, 15, 14, 30, 45, "测试用例1 - 当前时间");// 测试用例2:午夜时间TestTimeConversion(2024, 12, 31, 0, 0, 0, "测试用例2 - 午夜时间");// 测试用例3:边界值测试TestTimeConversion(2024, 1, 1, 23, 59, 59, "测试用例3 - 边界值");// 测试用例4:无效时间(应该返回空)TestTimeConversion(2024, 13, 32, 25, 61, 61, "测试用例4 - 无效时间");// 测试用例5:使用DateTime.NowDateTime now = DateTime.Now;TestTimeConversion(now.Year, now.Month, now.Day,now.Hour, now.Minute, now.Second,"测试用例5 - 实时时间");Console.WriteLine("\n按任意键退出...");}// 导入C++ DLL函数[DllImport("TimeConverter.dll", CallingConvention = CallingConvention.Cdecl)]private static extern IntPtr ConvertTimeToString(int year, int month, int day,int hour, int minute, int second);[DllImport("TimeConverter.dll", CallingConvention = CallingConvention.Cdecl)]private static extern void FreeString(IntPtr str);[DllImport("TimeConverter.dll", CallingConvention = CallingConvention.Cdecl)]private static extern IntPtr GetCurrentTimeString();static void TestTimeConversion(int year, int month, int day,int hour, int minute, int second, string testName){Console.WriteLine($"\n{testName}:");Console.WriteLine($"输入: {year}-{month:D2}-{day:D2} {hour:D2}:{minute:D2}:{second:D2}");IntPtr resultPtr = ConvertTimeToString(year, month, day, hour, minute, second);if (resultPtr != IntPtr.Zero){string result = Marshal.PtrToStringAnsi(resultPtr);Console.WriteLine($"输出: {result}");// 释放C++分配的内存FreeString(resultPtr);}else{Console.WriteLine("输出: 无效的时间参数!");}}static void TestTimeConversion( string testName){Console.WriteLine($"\n{testName}:");IntPtr resultPtr = GetCurrentTimeString();if (resultPtr != IntPtr.Zero){string result = Marshal.PtrToStringAnsi(resultPtr);Console.WriteLine($"输出: {result}");// 释放C++分配的内存FreeString(resultPtr);}else{Console.WriteLine("输出: 无效的时间参数!");}}}
}
http://www.dtcms.com/a/509002.html

相关文章:

  • Linux服务器编程实践57-功能强大的网络信息函数getaddrinfo:支持IPv4与IPv6
  • 美食网站html静态mooc网站建设
  • 网站备案申请书最新网站建设语言
  • DAX的日期相减DATEDIFF 函数
  • day15(do-while循环语句)
  • 并行任务太多,优先级怎么排
  • 自建商城网站用什么技术好公司网站建设款计什么科目
  • wordpress建站解析做网站怎么把导航每个页面都有
  • 动态内容可以缓存到CDN吗?
  • 东莞乐从网站建设邯郸专业网站建设报价
  • 服务好的企业建站alexa全球排名
  • 郑州服装网站建设公司阿里 域名解析 网站建设
  • 【学习系列】SAP RAP 11:行为定义-Feature Control
  • 国社科申报选题秘籍:如何把“具体问题”变成评审眼中的“好问题”?利用AI只需三步高效辅助(附AI提示词模板)
  • 张店网站优化网站登陆页面怎么做
  • 如何建设公司的网站上海响应式建站
  • 怎么登陆网站后台管理系统手机制作小程序
  • Kubernetes 简介和集群环境搭建
  • k8s安装-kubeadm join,将工作节点加入k8s集群
  • 免费网站源码建站系统wordpress移动端顶部导航栏
  • 怎样使用网站模板微信公众平台内做网站
  • 网站备案图标小程序登录入口在哪
  • 【C++闯关笔记】STL:deque与priority_queue的学习和使用
  • 灵巧手——Task-Oriented Hand Motion Retargeting for Dexterous Manipulation Imitation
  • 记事本怎么做网站网络科技有限公司和科技有限公司的区别
  • YOLOv3 核心机制与网络架构详解
  • Maven 核心概念及生命周期
  • 郑州做网站企起下载模板
  • Java 二进制及相关运算学习指南
  • 凡科做的网站怎么打不开了广州网站建设q.479185700棒