使用Mono Runtime Bundle制作安装包让C#桌面应用程序脱离net framework

.NET到底是啥?Runtime、BCL、SDK、CLI四层拆解 .NET不是一门语言,也不是操作系统,而是一个分层演进的跨平台开发平台。其核心由Runtime(执行引擎,负责JIT编译IL字节码)、BCL(基础类库,封装OS能力的预编译二进制集合)、SDK(含Roslyn编译器与CLI工具链的开发套件)和CLI(底层构建协议,比IDE更真实的控制入口)四大部件构成。这种分层结构决定了.NET既能实现C#语法统一,又能支撑Windows专属API(如WMI、注册表)与Linux/macOS跨平台运行并存的技术现实。理解这四者关系,是解决Runtime版本冲突、自包含部署失 阅读详情

之前有一个C#版本和ios版本(支持下载学生名单,点名等更多功能,该版本未上app store)的教辅助手帮助学校老师提交成绩到教务系统(浙大正方web版),一直打算用mfc写一个vc++版本的可以方便的在未安装net framework的电脑上使用,前几天看到一篇文章再谈为什么要使用MONO  ,既然Unity3D游戏(mono内核)可以单独打包脱离net framework,那我的教辅助手一定可以。可是在网上找了一下,中文资料很少,没有讨论具体技术细节的文章( 让C#程序独立运行(脱离 .NET Framework运行,绿色运行) 是我在移植完成后写教程的时候看到的文章,我的思路和他不太一样,我使用了mkbundle)。

教辅助手虽然功能比较简单,但是比hello world还是有技术含量的。我在测试打包的时候使用hello world没有问题,能够脱离net framework正常显示,但如果更复杂的功能和代码以及引入第三方类库的话,到底有没有问题,我心里没底。 实际在我移植的过程中确实碰到很多问题,这个是简单的测试hello world移植所解决不了的。因此我在解决问题后,写下此文记录一下。

先说一下教辅助手的功能(由于工作原因无法放出该程序代码),简单点说就是要导入excel成绩表并直接提交到教务系统的页面中,为清楚列表如下

1 导入excel成绩表

2 提交至web教务系统

3 可视界面操作

使用的相应技术

1 使用System.Data.Oledb访问excel并将取得内容放入System.Data.DataSet

2 使用System.Net.HttpWebRequest模拟教务系统登录(该系统使用cookieless方式,所以需要先访问一次得到url中生成的sessionid),然后填入课程相关信息,模拟post提交,使用System.Text.RegularExpressions的正则表达式得到所有学生列表,并根据DataSet内容产生新的Post信息,再次利用post方式提交到教务系统中。

3 使用Winform窗口形式

相关软件

window7 professional  64bit

Cygwin

net 2.0/3.5/4.0 framework

mono 2.10.6

gtk 2.12

MonoDevelop 2.8.2

下面说一下我的具体过程

1 首先使用Mono Migration Analyzer(MoMA) 检查已有代码是否可以移植到mono上。我的代码检查通过,但在后继过程发现访问excel功能报错,原因后面会说 。个人感觉MoMA不是很靠谱。

2 使用mono编译教辅助手源码。 这里我使用了MonoDeveloper工具,当然也可以使用类似csc.exe的mcs.exe命令行编译方式。不过由于MonoDevelop没有winform的设计器,而且winform是Win32技术,兼容性在Linux下不是很好, mono建议使用GTK#这种第三方的Form技术来做UI,我这里为了使用MonoDeveloper把winform的代码用gtk重写了,用了一个小时吧,代码分层比较好,比较容易剥离。当然如果你习惯csc.exe的命令行方式,而且你的移植后的程序只在window下面运行,那你可以使用mcs.exe并且不需要gtk重写(未尝试此种方式,感觉应该可行,如果哪位朋友有过相关经验,请告知)。

使用MonoDevelop要求安装mono和gtk,这里要特别注意的是MonoDevelop可以选择使用net framework还是mono进行编译,开始我没有注意我在MonoDevelop下使用net framework编译运行成功,打包后在mono下运行总是出问题,而且出错信息始终为空,浪费了大量时间。

3 在MonoDevelop下选择mono,编译成功后运行失败,报libgda错误,这里解释下问题出现的原因mono下的ole db应该是封装了libgda,而且mono oledb 支持Sql Server,Oralcle,MySql,SqlLite,不支持Excel;至于为什么不支持Excel,很简单Excel实际上是通过COM访问的(这个是微软的,*nix下不支持)。解决的办法就是不用ole db,于是换用CodePlex上的ExcelDataReader,支持mono,ok。

4 MonoDevelop运行时正常而打包后运行时System.Net.HttpWebRequest出错。在运行的时候发现HttpWebRequest无法正常工作,甚至简单的HttpWebRequest.Create(开始怀疑过是cookie container以及url路径问题,均排除,痛苦过程不表)。解决的办法是将machine.config文件一并打包。

参见Issue with embedding machine.config 实际上我们可以从machine.config发现相关HttpWebRequest的配置信息,该文件路径:mono安装目录\etc\mono\mono版本号\machine.config。

5 mkbundle打包。 实际上4和5可以一并说,4中描述的问题导致我频繁的测试mkbundle,尝试加载不同的dll。一度怀疑是打包时dll未正确包含所致,将所需的所有类库lib(system.web.dll、system.net.dll、gac目录等)一并拷贝到运行目录下,仍报错且无任何错误提示,抓狂。这里犯了低级错误检讨一下,mono官网提到mkbundle是一种static linker方式,会将所用到的dll连同应用程序一并embed到一个exe文件中,实际上mkbundle后不再需要类库的dll。

mono的mkbundle使用Unix-like toolchain,所以要在window下使用mkbundle需要安装cygwin(同样痛苦的过程),选择gcc-mingw, mingw-zlib, pkg-config,zlib(注意不要选gcc全部安装,网上说有问题我试过也是如此,完全卸掉gcc只选择gcc-mingw), 然后配置cygwin的~/.bashrc文件中配置

export PATH=$PATH:/cygdrive/c/Mono-2.6.1/bin 
export PKG_CONFIG_PATH=/cygdrive/c/Mono-2.10.6/lib/pkgconfig

这里参考Can not compile simple C# application with mkbundle 非常详细

结合我的实际使用说明一下:

无法单独使用mkbundle –o  –-deps 的方式使用mono runtime, 因为mkbundle有一个bug,详见 New: Mkbundle Fails Due To Missing Reference To G_utf16_to_utf8 (2.8.0, Windows XP) 如果直接使用会报

temp.c: In function `main': 
temp.c:170: warning: implicit declaration of function `g_utf16_to_utf8' 
temp.c:170: warning: assignment makes pointer from integer without a cast 
temp.c:185: warning: assignment makes pointer from integer without a cast 
/tmp/ccgvpEs0.o: In function `main': 
/cygdrive/d/paco/jpegp4d-deploy/temp.c:170: undefined reference to 
`_g_utf16_to_ 
utf8' 
/cygdrive/d/paco/jpegp4d-deploy/temp.c:185: undefined reference to 
`_g_utf16_to_ 
utf8' 
collect2: ld returned 1 exit status 
[Fail]

因此采用mkbundle –c(2012-1-12 更新 在cmd下执行)和gcc -mno-cygwin(2012-1-12 更新 在cygwin下执行)的结合的方式

以下引自Can not compile simple C# application with mkbundle ,感谢Lavir the Whiolet

    • 执行: "mkbundle -c -o host.c -oo bundle.o --deps YourAssembly.exe <additional arguments>". 可选-z进行压缩. 完成后得到host.c和bundle.o文件.
    • 在host.c文件中移除_WIN32。增加#undef _WIN32如下:

      #ifdef _WIN32
      #include <windows.h>
      #endif
      

      得到:

      #ifdef _WIN32
      #include <windows.h>
      #endif
      #undef _WIN32
      
    • 执行: "gcc -mno-cygwin -o ResultantBundle.exe -Wall host.c`pkg-config --cflags --libs mono-2|dos2unix` bundle.o <additional arguments>". 如果你mkbundle 加了-z参数, 你必须在这步增加 –lz

我的补充

     (1) 执行mkbundle是需要embed machine.config的话 增加—machine.config C:\Mono-2.10.6\etc\mono\4.0\machine.config,参考mono project bundles

     (2) 如果引入第三方dll的话(比如我使用了第三方ExcelDataReader的excel.dll), 应该加到mkbundle 的<additional arguments>位置,参考Embedding a JavaScript interpreter with Mono

以我的mkbundle为例

     mkbundle –c –o host.c –oo bundle.o –deps myProgram.exe Excel.dll  --machine-config C:\Mono-2.10.6\etc\mono\4.0\machine.config

更新(2012-01-12):

mkbundle -c -o host.c -oo bundle.o --deps MonoTA.exe Excel.dll -z --machine-config C:\Mono-2.10.6\etc\mono\4.0\machine.config

6 发布 

   生成的exe文件已经embed mono runtime了,我的应用程序原来32k,使用-z压缩生成后是5MB,有点大不过可以接受。但要脱离net framework在window上执行,还需要调用几个文件,罗列如下(针对mono4.0,我一个个找的,是不是可以做个工具自动查找依赖?)

freetype6.dll 
glibsharpglue-2.dll 
gtksharpglue-2.dll 
intl.dll 
libatk-1.0-0.dll 
libcairo-2.dll 
libexpat-1.dll 
libfontconfig-1.dll 
libgdk_pixbuf-2.0-0.dll 
libgdk-win32-2.0-0.dll 
libgio-2.0-0.dll 
libglib-2.0-0.dll 
libgmodule-2.0-0.dll 
libgobject-2.0-0.dll 
libgthread-2.0-0.dll 
libgtk-win32-2.0-0.dll 
libpango-1.0-0.dll 
libpangocairo-1.0-0.dll 
libpangoft2-1.0-0.dll 
libpangowin32-1.0-0.dll 
libpng14-14.dll 
mono-2.0.dll 
MonoPosixHelper.dll 
zlib1.dll

总共16.9MB

7 后记

个人感觉,虽然过程曲折了点,但使用mono runtime让软件脱离net framework是完全可行的,而且应该是可以用到生产环境的,也希望mono越来越好。

从Electron到Godot+C#:高性能跨平台桌面应用开发实战 跨平台桌面应用开发中,性能与资源占用是关键挑战。传统基于Web技术的方案如Electron,虽然开发效率高,但常面临内存占用大、启动慢、包体积臃肿等问题,尤其在处理复杂数据时易出现堆内存溢出。其核心原理在于依赖完整的浏览器运行时,导致资源开销难以优化。为追求更接近原生的性能体验,开发者开始探索轻量级替代方案。Godot游戏引擎凭借其高效裁剪的运行时和跨平台渲染能力,结合C#强类型语言的企业级生态,为构建高性能桌面应用提供了新思路。这一组合特别适用于对UI流畅度、资源占用有严格要求的应用场景,如数据可视化工具 阅读详情

相关推荐

MonoMac跨平台开发:C#调用Objective-C的底层原理与实践

跨语言互操作是现代软件开发的核心能力之一,其本质在于不同运行时环境间的ABI兼容、内存模型对齐与消息传递机制协同。.NET通过P/Invoke和Runtime桥接实现与原生API通信,而MonoMac正是这一技术范式的早期典范——它将C#类型系统与Objective-C Runtime深度耦合,借助btouch绑定生成、Selector缓存、Messaging封装等关键技术,达成对Cocoa UI层的完整映射。这种方案不仅支撑了早期macOS原生GUI应用的C#开发,更奠定了Xamarin乃至.NET MA

diedangxiang4092的博客 405

其他笔记 - Mono for Windows 跨平台 Runtime 在Win10上编译和安装

目录在Windows上编译Mono安装环境下载Mono源码预配置编译安装说明详细的编译说明启用BTLS作为Windows构建的加密后端为Windows版本启用LLVM使用monolite代替预装的Mono发行版使用 Visual Studio 安装 Mono对于Visual Studio 2015 64位Mono Runtime构建:对于Visual Studio 2017 64位Mono Runtime构建:Visual Studio MSBuild构建属性配置make为使用Visual Studio构建

参谋谋的博客 5010

Unity拥抱.NET Core:底层革命如何重塑游戏开发范式

在软件开发领域,运行时环境是应用程序执行的基石,它决定了语言特性的支持范围、代码执行效率以及生态系统兼容性。其核心原理在于提供内存管理、即时编译和类型系统等基础服务。对于游戏开发而言,高效的运行时能直接提升开发迭代速度和最终产品的性能表现。Unity引擎正在进行的从Mono到.NET CoreCLR的迁移,正是为了解决长期存在的技术债务,让开发者能够使用现代C#语言特性,并享受更先进的垃圾回收机制。这一变革将深刻影响游戏开发流程,特别是在需要快速原型迭代和追求高性能的场景中。通过引入代码热重载和更完善的异步

weixin_34323858的博客 394

【游戏引擎 - C#脚本系统】2、配置Mono Runtime环境

11111

记录值得记录的东西 2041

Unity编译策略实战:Mono与IL2CPP原理、选择与优化指南

在Unity游戏开发中,脚本编译后端的选择直接影响应用的性能、包体大小和平台兼容性。Mono作为传统的即时编译方案,通过虚拟机解释执行中间语言,提供了快速的开发迭代和灵活的调试体验,尤其适合开发前期。而IL2CPP则采用静态编译策略,将C#代码转换为C++并编译为本地机器码,显著提升了运行时性能,增强了代码安全性,并更好地满足了iOS等平台的安全规范。从技术价值看,理解两者的核心差异有助于开发者在项目初期做出合理的架构决策,避免后期因性能瓶颈或平台限制导致的重构。在实际应用场景中,独立开发者和技术团队需要根

weixin_33910759的博客 471

C#程序脱离.net框架的多种方法与应用一步之遥

C#程序脱离.net框架的多种方法与应用一步之遥

mono桌面应用移到android,Mono制作安装包让C#桌面应用程序脱离net framework步骤

1、 下载安装Cygwin安装时,请将mingw-gcc、mingw-zlib、pkg-config、libiconv这几个组件选上,这是将.NET程序转化为本地程序的必要的编译环境。Cygwin环境中标题栏右键设置字符集解决中文乱码 2、启动cgywin并设置环境变量:1、点击开始菜单或桌面上的cygwin图标,启动且进入cygwin环境。2、输入下面的命令,设置或修改必要的环境变量:exp...

weixin_30181187的博客 492

xwt:跨平台的UI工具包,用于使用.NET和Mono创建桌面应用程序

本文档是XWT的简介,XWT是用于创建桌面应用程序的跨平台UI工具包。 如果您对XWT有任何疑问,或者想为XWT贡献一个讨论组,请访问: 介绍 Xwt是一个新的.NET框架,用于创建从同一代码库在多个平台上运行的桌面应用程序。 Xwt通过在所有环境中公开一个统一的API来工作,该API映射到每个平台上的一组本机控件。 这意味着Xwt倾向于专注于提供适用于所有平台的控件。 但是,这并不意味着可用的功能是所有平台的共同点。 如果某个特定功能或窗口小部件在平台的本机框架中不可用,则会将其模拟或实现为一组本机窗口小部件。 Xwt可以用作支持整个应用程序的独立框架,也可以嵌入到现有主机中。 这允许开发人员使用本机组件(例如Windows上的Ribbon,Linux上的工具栏)开发“外壳”,并将Xwt用于应用程序的特定位,例如对话框或跨平台表面。 Xwt通过在运行时创建一个引擎来工作,该引擎将

Mono制作安装包让C#桌面应用程序脱离net framework步骤

1、  下载安装Cygwin http://www.cygwin.com/ 安装时,请将mingw-gcc、mingw-zlib、pkg-config、libiconv这几个组件选上,这是将.NET程序转化为本地程序的必要的编译环境。 Cygwin环境中标题栏右键设置字符集解决中文乱码 2、 启动cgywin并设置环境变量: 1、点击开始菜单或桌面上的cygwin图标,启动且进入

依宸2016 2489

Mono Android 滑动菜单demo

该demo由深圳-侯爷(大光)传至Mono For Android 交流群 223541981 可实现右滑动菜单

从‘哒哒’声到静音顺滑:一文搞懂42步进电机细分控制的原理与实战(以TMC5160为例)

本文详细解析了42步进电机细分控制技术,以TMC5160为例,探讨如何通过正弦波电流调制和自适应波形整形实现静音运行。文章提供了实战配置指南,包括硬件连接、寄存器配置和调试技巧,帮助用户有效消除电机噪声,提升3D打印机、CNC机床等设备的运行效率。

weixin_42657024的博客 312

Unity中Mono所搭建的脚本核心基础

Mono基本介绍 Mono组件 C#编译器——MCS:MCS的作用就是将C#编译为CIL(通用中间语言) Mono运行时(mono Runtime):运行时中的编译器将CIL的Byte Code在转译为原生码,同时提供即时编译(JIT),提前编译(AOT),完全静态编译(Full-AOT)三种转译方式 基础类库:提供广泛的基础类 Mono类库:提供额外的有用功能,尤其是构建Linux方面 Mono如何提供脚本功能 总所周知Unity是由C++写成的,将Mono运行时嵌入到由C++写成的应用后,该应用便会获取

jkkk_的博客 7529

高压脉冲发生器的各种电路图

高压脉冲发生器的各种电路图

qq_65102825的博客 5898

对"使用Mono Runtime Bundle制作安装包让C#桌面应用程序脱离net framework"增加说明

http://www.cnblogs.com/basilwang/archive/2011/11/29/2267809.html 想做独立引用的估计都看过这一篇文章,但是因为软件更新,很多地方已经不适应了,所以我使用的时候遇到很多麻烦,所以记录下来,让后来人少走弯路。 Cygwin Terminal这个更新比较快,所以对于的安装也有改变,比如gcc 比如我在Cygwin的home目...

weixin_30318645的博客 169

解密CANoe数据回放:从BLF到ASC的格式转换与优化策略

本文深入解析CANoe数据回放中BLF与ASC格式的转换与优化策略,帮助工程师高效处理汽车电子测试数据。详细介绍了两种格式的特性、转换方法及性能优化技巧,包括CANoe内置功能、命令行自动化和第三方工具应用,提升故障诊断和系统验证效率。

weixin_28331555的博客 535

UniApp实战:5分钟搞定后台持续定位与轨迹实时更新(附完整代码)

本文详细介绍了在UniApp中实现后台持续定位与动态轨迹地图系统的完整方案。针对物流配送、运动健身等场景,文章深入讲解了权限申请、坐标系选择、定位防抖优化、地图轨迹线(polyline)实时绘制等核心步骤,并提供了可复用的完整代码,帮助开发者高效解决App切后台定位停止、轨迹漂移等常见难题。

weixin_29266679的博客 482

Unity跨平台开发核心:.Net运行时、IL2CPP与Mono后端深度解析

在软件开发领域,跨平台技术是实现代码一次编写、多端运行的关键。其核心原理在于通过中间层抽象,将高级语言代码转换为平台无关的中间表示,再由各平台的运行时环境执行。.Net框架正是这一理念的杰出代表,其公共语言运行时(CLR)和中间语言(IL)机制构成了跨平台的技术基石。对于游戏开发而言,Unity引擎深度集成了.Net生态系统,通过Mono和IL2CPP两种脚本运行时后端,将C#代码高效部署到iOS、Android、PC等多元平台。理解.Net运行时与Unity的协作机制,不仅能优化游戏性能、解决平台兼容性问

cnracht8153的博客 287

Trae+雪球MCP,化身专业的股票分析师(玩转100个MCP系列第二弹)

大家好呀,我是程序员夏叶,深度AI编程使用者,专注于分享AI编程方面的使用技巧、经验以及前沿资讯,有兴趣的可以关注我的公众号,一起学习,共同进步。第二弹,使用Trae+雪球MCP,获取股票实时行情,分析股票走向等,写代码间隙看看股票价格,研究研究行情,哈哈。真的很不错呀,最关键的是,足够隐蔽,同事以为你在写代码,实际你在浏览股票行情,哈哈,感兴趣的可以试一下哦。说实话,沧州明珠这只股我算是砸手里了,不过还好买的不多,哈哈。

cpp加油站的专栏 517

Unity Mono与IL2CPP性能深度对比及Android打包配置全指南

在Unity游戏开发中,脚本后端的选择直接影响应用性能与包体大小。Mono采用即时编译(JIT)技术,在运行时将C#中间语言(CIL)动态编译为机器码,支持快速迭代和完整反射,但存在运行时开销和优化限制。IL2CPP则采用提前编译(AOT)技术,在构建阶段通过静态分析将CIL转换为高度优化的C++代码,再编译为原生机器码,从而在运行时获得卓越的CPU计算性能和更稳定的内存表现,尤其适用于对执行效率要求高的中重度游戏。其技术价值在于通过深度编译优化,显著提升逻辑运算效率并降低GC压力,但需权衡构建时间增长和包

weixin_34151004的博客 332

基于 YOLOv26 的高速抛物识别系统:微小目标检测

本文提出了一种基于YOLOv26的高速抛物识别系统,专注于微小目标检测。系统采用多模块协同架构,包括视频预处理、YOLOv26检测、目标跟踪和抛物行为分析等模块。关键技术包括YOLOv26s模型检测、DeepSORT目标跟踪和边缘计算部署。通过构建包含多种抛物类型的专业数据集,并应用数据增强技术提升模型性能。系统实现了车辆检测、微小抛物目标识别、抛物轨迹分析和风险等级评估等功能,可实时检测高速公路上的抛物行为并触发告警,为交通管理提供智能化解决方案。

一键难忘的博客 632

本地玩转AI还得靠这个,SillyTavern(酒馆)到底有多强?

SillyTavern是一款本地运行的LLM交互前端,支持文本生成、图像生成、语音合成等功能。它最初是TavernAI的分支,现已独立开发,社区活跃,功能更新频繁。SillyTavern通过前端UI和插件系统连接各种大模型后端,如OpenAI、KoboldAI等,用户可以在本地创建“虚拟酒馆”与各种角色对话。其功能亮点包括角色卡、角色记忆、世界设定、多人聊天室、自定义UI和行为脚本、插件扩展支持等。SillyTavern适合AI创作用户、AI工程师、LLM爱好者和AIGC创作者。它有两个维护分支:relea

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 8029

Apple 平台 .ips 崩溃日志的 .NET 符号化实战指南:从 Mach-O UUID 到 atos 定位运行时崩溃源码

本文基于 dotnet-diag 插件中的 `apple-crash-symbolication` 技能,系统讲解如何把 iOS、tvOS、Mac Catalyst、macOS 上 .NET MAUI / Mono 应用的原生崩溃日志(`.ips` JSON 格式,iOS 15+ / macOS 12+)符号化为函数名、源文件与行号:从解析两段式 JSON、按 Mach-O UUID 匹配 dSY

gitblog_06877的博客 222

“软开关”硬技术!ZVS和ZCS到底谁更牛?看完这个例子你就懂了!

❌ ZVS 和 ZCS 是万能的?→ 不,它们都有实现条件,谐振参数选不好照样硬拐弯!❌ 只要有谐振就一定ZVS?→ 不,一定要设计合适的死区时间和负载条件才行!ZVS 是让电压先“冷静”,ZCS 是让电流先“退场”。一个是开门不撞墙,一个是关门不甩门。懂了它们,功率设计就是在跳华尔兹而不是打架!💃🔌。

weixin_43199439的博客 1233

Unity性能优化:Mono与IL2CPP编译后端深度对比与实战迁移指南

在游戏开发与跨平台应用构建中,编译技术是连接高级语言与机器执行的关键桥梁。其核心原理在于将开发者编写的代码转换为目标平台可高效执行的指令,直接影响应用的启动速度、运行效率与资源占用。从早期的即时编译到现代的预先编译方案,编译技术的演进始终围绕性能优化与平台适配展开。在Unity开发领域,Mono与IL2CPP是两套主流的脚本编译后端,它们分别代表了不同的技术路线与价值取向。Mono基于即时编译,支持动态特性,便于快速迭代;而IL2CPP采用预先编译,通过将中间语言转换为C++并借助原生编译器优化,在运行性能

weixin_30820077的博客 408

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

上一篇: 用VS编译出不依赖VC运行库的可独立运行的程序
下一篇: .NET程序脱离框架进阶 之 Embedding Mono
CodingSir
博客等级 码龄21年 2149粉丝 812原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值