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

C++方法封装成dll及C#调用示例

1,编译生成dll时可能出现错误,解决办法:pch.h文件头部,添加声明
#define _CRT_SECURE_NO_WARNINGS

2, c++头文件声明
extern "C" __declspec(dllexport)  char* getvalue(const char * param1, const char * param2);

3, c++方法实现
 char* getvalue(const char * param1, const char * param2) {
     //process,省略
    //return
    std::string value = "result";
    char* cStr = new char[value.length() + 1]; // 加1是为了存储结束的空字符
    strcpy(cStr, value.c_str());
    return cStr;

}

4, c#端

 [DllImport("test.dll", EntryPoint = "getvalue", CallingConvention = CallingConvention.Cdecl)]
 static extern IntPtr getvalue([MarshalAs(UnmanagedType.LPStr)] string param1, [MarshalAs(UnmanagedType.LPStr)] string param2);

 
//调用
try
{
    string param1 = "param1";
    string param2 = "param2";
    IntPtr retPtr = getvalue(param1, param2);
    if (retPtr != IntPtr.Zero)
    {
        try
        {
            // 将指针转换为托管字符串
            string result = Marshal.PtrToStringAnsi(retPtr);                        
            Console.WriteLine("getvalue result: " + result);
            Console.WriteLine();
        }
        finally
        {
            // 释放C++分配的内存
            //Marshal.FreeCoTaskMem(retPtr);
        }
    }
}
finally
{
    // 清理分配的内存
    //Marshal.FreeHGlobal(ptr);
    //Marshal.FreeHGlobal(ptr2);
}

5,参考文档
(1),C++封装成DLL并调用
https://blog.csdn.net/kenjianqi1647/article/details/102833477
https://blog.csdn.net/weixin_44244190/article/details/123504926
(2),VS中用C#调试DLL
https://www.cnblogs.com/lzhu/p/9268280.html
 
(3),生成32位dll注意事项 
 取消使用预编译头
属性-》配置属性-》C/C++ -》预编译头-》预编译头-》
参考资料
https://blog.csdn.net/qq_34059233/article/details/113837245

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Spring Boot + Mybatis Plus实现登录注册
  • UbuntuServer 22.04.4安装GitLab
  • 生成式人工智能 - 本地windows 11 + PyCharm运行stable diffusion流程简述
  • C++类与对象(拷贝与类的内存管理)
  • Ubuntu 22.04 下 CURL 分块上传文件(C++)
  • AIRNet模型使用与代码分析(All-In-One Image Restoration Network)
  • 【小白学Python】自定义图片的生成(二)
  • 用Python绘制yolo训练结果比较图-论文需要
  • 鸿蒙轻内核A核源码分析系列六 MMU协处理器(1)
  • 【稳定检索/投稿优惠】2024年智慧金融与财务管理国际会议(SFFM 2024)
  • C#操作MySQL从入门到精通(21)——删除数据
  • C# 设置PDF表单不可编辑、或提取PDF表单数据
  • 开发TEE的踩坑之配置PCCS
  • 子域名爆破工具
  • 拜托:不要像鲍勃大叔那样重构
  • javascript从右向左截取指定位数字符的3种方法
  • java第三方包学习之lombok
  • leetcode388. Longest Absolute File Path
  • PV统计优化设计
  • Shadow DOM 内部构造及如何构建独立组件
  • Vue UI框架库开发介绍
  • 电商搜索引擎的架构设计和性能优化
  • 对象管理器(defineProperty)学习笔记
  • 分布式熔断降级平台aegis
  • 记一次和乔布斯合作最难忘的经历
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 前嗅ForeSpider采集配置界面介绍
  • 十年未变!安全,谁之责?(下)
  • 双管齐下,VMware的容器新战略
  • 小程序开发之路(一)
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • ​ssh免密码登录设置及问题总结
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • ()、[]、{}、(())、[[]]命令替换
  • (1)虚拟机的安装与使用,linux系统安装
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (六)Flink 窗口计算
  • (转)四层和七层负载均衡的区别
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • (转载)(官方)UE4--图像编程----着色器开发
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .NET 动态调用WebService + WSE + UsernameToken
  • .NET 设计模式—适配器模式(Adapter Pattern)