【已完成】Visual studio2022打包安装成exe程序

前言

在机器视觉或深度学习落地项目中,我们经常需要在 C# (WinForms/WPF) 环境下调用 YOLO 等目标检测模型,并借助 ONNX Runtime 或 TensorRT 进行推理加速。

然而,代码在 Visual Studio 的 Debug 模式下能完美运行,并不意味着使用 Setup Project 打包部署就能一帆风顺。很多底层依赖和架构配置在打包时会引发各种意想不到的报错。本文详细记录了我在打包 C# + YOLO + ONNX 项目时遇到的一系列经典踩坑过程,并整理了保姆级的解决方案,希望能帮到遇到同样问题的同学。


坑位一:底层依赖类库编译报错 CS0227 与 CS0006

🔴 错误现象:

在准备切换到 Release 模式进行整体打包时,解决方案编译失败,错误列表爆红:

  • CS0227: 不安全代码只会在使用 /unsafe 编译的情况下出现 (源自底层的 YOLO/ONNX 封装类库)
  • CS0006: 未能找到元数据文件"xxx\YoloOnnx.dll" (源自依赖该类库的主程序)

🔍 原因分析:

在 C# 中处理图像指针、进行 TensorRT/ONNX 底层内存操作时,往往需要使用 unsafe 关键字。如果没有在项目属性中显式开启"允许不安全代码",底层类库(如 YoloOnnx)就会编译中断。底层 DLL 没生成,上层主程序自然就会报找不到元数据文件(CS0006)的连锁错误。

✅ 解决步骤:

  1. 找对项目 :在"解决方案资源管理器"中,找到真正报 CS0227 错误的底层项目(注意:千万不要选错成顶层的主 UI 程序)。
  2. 修改属性 :右键该底层项目 -> 选择 属性 (Properties) -> 左侧菜单选择 生成 (Build)
  3. 开启选项 :勾选 "允许不安全代码 (Allow unsafe code)"
  • 注意:请确保属性页面顶部的"配置"下拉框选为 Release所有配置
  1. 重新编译 :点击 VS 顶部菜单栏的"生成" -> "清理解决方案",然后点击"重新生成解决方案"。此时所有报错应全部消失。

坑位二:Setup 打包项目出现红色波浪线警告

🔴 错误现象:

在 Setup 打包项目的 Detected Dependencies(检测到的依赖项)文件夹中,部分系统 DLL(如 System.Net.Http.dllSystem.Memory.dll 等)下方出现了红色波浪线。

🔍 原因分析:

这是依赖项解析冲突。Visual Studio 在自动检测依赖时,可能拉取了不同版本的同一个 DLL,或者拉取了目标机器上 .NET 运行环境本身就自带的基础组件。强行把这些冗余的系统框架 DLL 打包进去,就会引发冲突警告。

✅ 解决步骤:

  1. 在打包项目中展开 Detected Dependencies 文件夹。
  2. 右键点击那些带有红线的、以 System. 开头的系统级 DLL。
  3. 选择 Exclude(排除)
  4. 排除后,文件图标旁会出现一个红色的禁止符号,红线和相应的警告就会彻底消除。

坑位三:目标平台架构不兼容(AMD64 vs x86)

🔴 错误现象:

右键生成打包项目时,直接失败,输出窗口提示 ERROR:
ERROR: File 'YoloDemo.exe' ... targeting 'AMD64' is not compatible with the project's target platform 'x86'

🔍 原因分析(高频踩坑点):

深度学习库通常要求主程序必须编译为 64 位(x64)。你可能已经在"配置管理器"中把 C# 代码改成了 x64,但是 VS 打包项目 (Setup Project) 默认的底层架构依然是 32 位 (x86)!32 位的安装包容器拒绝接收你 64 位的 EXE 程序。

✅ 解决步骤:

这里有一个极易踩坑的视觉盲区,千万不要右键点击项目选"属性"

  1. 在"解决方案资源管理器"中,鼠标左键单击选中你的打包项目(只需点一下,让它高亮显示)。
  2. 按下键盘上的 F4 键(或者点击顶部菜单:视图 -> 属性窗口),此时会在 VS 右下角唤出一个属性面板。
  3. 在这个属性面板中找到 TargetPlatform 这一项。
  4. 将其从默认的 x86 下拉修改为 x64
  5. 修改完成后,再次右键点击打包项目,选择"重新生成"即可成功。

坑位四:安装后程序运行崩溃 TypeInitializationException(终极杀手)

🔴 错误现象:

安装包成功生成并安装到电脑后,双击桌面快捷方式打开程序,一执行到模型加载的代码时,程序直接闪退或报错:

  • System.TypeInitializationException: "Microsoft.ML.OnnxRuntime.NativeMethods"的类型初始值设定项引发异常。
  • 内部异常: System.NullReferenceException: 未将对象引用设置到对象的实例。

🔍 原因分析:

这是 C# 托管代码调用 C++ 非托管库时最容易掉进去的坑。

VS 的打包工具非常"死板",它只能自动识别并打包基于 .NET 的托管 DLL(如 Microsoft.ML.OnnxRuntime.dll)。但是,ONNX Runtime 真正干活的底层 C++ 引擎库根本不会被自动打包进 .msi 安装包里

结果就是:安装包把你 C# 的外壳装到了目标电脑上,却把最重要的计算核心落在了原先的开发文件夹里。

✅ 解决步骤:

1、先安装好程序,记录好安装位置;

2、必须手动将这些非托管的底层依赖项强行塞进安装包:

直接在你原来可以运行的debug/bin 里面的文件夹的所有文件保存然后保存到你安装的路劲中复制即可


💡 附加经验:分发安装包时,选 setup.exe 还是 .msi

打开打包输出目录,你会看到 setup.exeSetup1.msi 两个文件。给客户部署时,到底用哪个?

  • 强烈建议使用 setup.exe 进行安装。
  • 区别所在.msi 是真正的安装包核心文件;而 setup.exe 是一个引导程序(Bootstrapper)。运行 setup.exe 时,它会先扫描目标机器的系统环境,如果发现缺少程序运行必须的基础组件(比如特定版本的 .NET Framework),它会先帮你把环境装好,然后再自动调用 .msi 安装你的软件。这能最大程度避免"软件装上了却打不开"的尴尬境地。
相关推荐
怒放de生命20106 小时前
IDEA 2025 最新版jrebel 破解
java·ide·intellij-idea
猿小猴子6 小时前
主流 AI IDE 之一的 CodeFlicker 介绍
ide·人工智能
零号全栈寒江独钓7 小时前
visual studio编译wxWidgets
c++·visual studio
hhzz8 小时前
JupyterLab、Jupyter Notebook 和 Voilà 的安装与使用指南
ide·python·jupyter
Billy_Zuo8 小时前
Android Studio 打aar包
android·ide·android studio
虎大猫猫9 小时前
JupyterLab的安装与使用完全指南
ide·python·jupyter
码码不爱我9 小时前
Jupyter在Pycharm中出现Connection reset错误调试
ide·jupyter·pycharm
zhensherlock9 小时前
Protocol Launcher 系列:一键唤起 Windsurf 智能 IDE
javascript·ide·vscode·ai·typescript·github·ai编程
bug的abc9 小时前
ide通过Scratches and Consoles存储文件,ide执行bat文件
ide