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

c++调用 c# dll 通过 P/Invoke (详细避坑)

项目场景:

VS2022 .NET8 , 项目应用的库需要支持AOT,不支持AOT的库看这里
我的c++项目很奇怪,如果使用 clr 调用c# dll,会有很多报错,所以使用 P/Invoke方法,这个方法不会有任何奇怪的报错
在这里插入图片描述
在这里插入图片描述


解决方案

示例代码

using System.Runtime.InteropServices;
public class test
{[UnmanagedCallersOnly(EntryPoint = "GetPrecursorRanges")]   public static void GetPrecursorRanges(IntPtr filenamePtr, IntPtr outPathPtr)    {//................}[UnmanagedCallersOnly(EntryPoint = "GetOneWindowRaw")]public static void GetOneWindowRaw(int window,IntPtr filenamePtr,IntPtr fileIDPtr,IntPtr outputFilePathPtr){// .................}
}

vs要配置项目
在这里插入图片描述
打开项目的配置文件.csproj, 检查是不是X64平台, 还要添加 <PublishAot>true</PublishAot>

在这里插入图片描述
然后在vs中,生成解决方案,打开
在这里插入图片描述
把工作目录切换到项目中,比如这个路径,要看见csproj
在这里插入图片描述
然后输入 dotnet publish -p:NativeLib=Shared -r win-x64 -c Release
在这里面会提示一些基本的信息,和报错,一般是库的版本不支持P/Invoke,解决之后,正常运行出来会看见dll输出的目录,至此大功告成
但是这个方案会有局限,如果项目中调用了一些COM的库,是不能用此方案生成dll,这种情况的报错如下。

COM Interop requires ComWrapper instance registered for marshalling.

解决方案参考另外一篇用C++/CLI解决的

在这里插入图片描述


http://www.lryc.cn/news/488278.html

相关文章:

  • 李春葆《数据结构》——图相关代码
  • Linux驱动开发第2步_“物理内存”和“虚拟内存”的映射
  • 告别多品牌乱战,吉利开始觉醒
  • Target-absent Human Attention
  • <QNAP 453D QTS-5.x> 日志记录:在 Docker 中运行的 Flask 应用安装 自签名 SSL 证书 解决 Chrome 等浏览器证书安全
  • 通过huggingface-cli下载Hugging Face上的公开数据集或模型至本地
  • 论文阅读——Intrusion detection systems using longshort‑term memory (LSTM)
  • SparkSQL的执行过程:从源码角度解析逻辑计划、优化计划和物理计划
  • Leetcode打卡:新增道路查询后的最短距离II
  • Spring Web入门练习
  • 计算机毕业设计 | SpringBoot+vue汽车资讯网站 汽车购买咨询管理系统(附源码+论文)
  • stm32下的ADC转换(江科协 HAL版)
  • 解决IntelliJ IDEA的Plugins无法访问Marketplace去下载插件
  • react 如何修改弹出的modal的标题
  • C#中的二维数组的应用:探索物理含义与数据结构的奇妙融合
  • HTML5拖拽API学习 托拽排序和可托拽课程表
  • 内容补充页(相关公式解释)
  • vue中动态渲染静态图片资源
  • 管伊佳ERP,原名华夏ERP,一个简约易上手的国产ERP系统
  • 学习虚幻C++开发日志——委托(持续更新中)
  • 开窗函数 - first_value/last_value
  • 「一」HarmonyOS端云一体化概要
  • nodejs21: 快速构建自定义设计样式Tailwind CSS
  • 从JSON数据提取嵌套字段并转换为独立列的简洁方法
  • 湘潭大学软件工程算法设计与分析考试复习笔记(四)
  • 特征交叉-DeepCross Network学习
  • stm32cubemx+VSCODE+GCC+makefile 开发环境搭建
  • Go语言中的Defer机制详解与示例
  • H.265流媒体播放器EasyPlayer.js H5流媒体播放器如何验证视频播放是否走硬解
  • ms-hot目录