VS.Net插件制作初级教程

在 VS Code中添加C#开发插件,安装code指令,使用终端命令创建.Net Core项目。 阅读详情
VS.Net插件制作初级教程
作者:东方蜘蛛 2002年5月
 
 
 
 
 概述:
  本文假定您对C#、VB.Net、CLR等有一定的了解,并具备一些基本的编码知识
不管微软目前的VS.NET IDE工具有多强大,但是对开发人员而言,总有一些自己希望有的功能却没有具备,出于这点考虑,VS.Net IDE提供了一个易用的工具,允许开发人员拓展自己所需的功能,这也就是我们今天所提的插件,插件的制作非常简单,而且可以使用任何.Net支持的语言如VB、C#、C、C++等等,本文描述了插件的工作方式,将通过建立一个文本编辑插件实例来展示。它有一个简单的功能:在当前文本里插入当前日期。 如果您目前已经开始使用微软VS.Net的RTM版本,您肯定知道微软在这个工具里包装了很多新的功能和工具,对于一个代码编辑工具而言,那实在是没什么地方可以挑剔了,可惜开发人员眼中几乎没有十全十美的这方面的工具,原因无他,很多人都希望这个开发工具包含了自己想象的功能,可是微软也做不到这一点,幸好它留了让开发人员自由发挥的空间,我想这点已经足够了。好了,现在让我们开始吧。

 开始
    插件和宏都有扩展IDE的能力,对于插件而言,由于是被编译的,一旦发布就无法被修改,因而保护了自己的知识产权。插件能做到与IDE的无逢嵌合,比如可以定义自己的工具栏,修改菜单命令的状态,甚至可以帮助下的ABOUT对话框中加上自己个性化的东西。有关创建一个插件的详细步骤可以在微软的站点里找到,也可以查看SDK里的帮助,里面也有详细的介绍,由于是向导式的,这里,我只重复一些关键性的步骤。
    1、  打开MicroSoft Visual Studio .Net工具,新建一扩展性项目,取名为TextUtil,如下图所示。这里假定你使用的是中文版本。

    2、 点击确定以后会开始出现欢迎向导页面,点下一步选择使用的语言,这里我们选择C#,再下一步选择支持的应用程序,选好以后继续点击下一步设定名称和说明,接着出现如下页面设定外接程序(插件)的选项。 

设置好以后继续下一步,设置“帮助”中的“关于”信息,最后单击完成,我们的向导操作就大功告成了。
3、  接下来向导会自动创建一个Connect.cs文件,让我们来看一下里面的东东
(1)Connect::Connect 这个构造函数用于您的简单的初始化。
(2)Connect::OnConnection 这个方法是在IDE装载您创立的ADD-IN的时候执行的,您应该在这里初始化您的插件,告诉IDE你创建的命令,指定键盘绑定等等。
(3)Connect::QueryStatus IDE调用这个命令以知道当前哪个命令合适,根据不同的情况做不同的响应。
(4)Connect:Exec IDE用这个命令来执行您刚刚所创建的命令。

这里我们创建一个简单的命令:InsertDate,这个命令的用途是在当前光标的位置插入当前的日期,.Net包含了一个同样功能的宏示例,这样,您可以看到他们的异曲同工之妙。这个命令很简单,您只要稍微修改一下头上所示的Exec函数里的东西就可以了。
我们把

handled = true;

替换成

handled = InsertDate();

然后实现如下InsertDate的代码:
    // InsertDate
// Insert the current date in my favorite format.
//
bool InsertDate()
{
  if (null != applicationObject.ActiveDocument)
  ((TextSelection)applicationObject.ActiveDocument.Selection).Text
    = DateTime.Now.ToString("dd-MMM-yyyy");
  return true;
}

虽然很简单,但这的确就是一个插件了
现在我们就可以运行它了,按一下F5,我们看到启动了一个新的IDE实例。点击工具——》外接程序管理器,弹出如下窗口。

选择文本编辑插件左边的复选框,点确定以后装载插件。

现在我们可以让它为我们做点事情了,随意打开一个工程,打开一个代码文件,按Ctrl+Alt+A调出命令窗口,IDE提供了自动完成的功能,打一个Te以后就会出现如下界面:

按一下回车,看到了什么?在当前位置插入了当前日期了吧,呵呵。(未完待续)

 VS.Net插件制作进阶教程
    本文将通过一个实例来展现复杂的插件的制作方式,本实例是模拟用户的DOS环境,出发点是当我们在制作控制台输出程序的时候,有时候没看清楚结果屏幕就关闭了,当然我们有一些其他的解决办法,比如让程序继续等待等等,但这里,我们只做演示用,您可以自己扩展它,:)
    如果您看过VS.Net插件制作的初级教程,那对你理解本文将产生帮助,如果没有,您也可以通过自己的实践来达到初级教程的目的。
    我们先新建一个名为Command的ADD-IN工程。如果您对这个步骤不熟悉,请看一下初级教程。
    现在我们建立一个用户控件,如左下图排版样式。注意,下图是运行以后的样式,为了省空间,所以直接拿过来了。

  
 

  本程序的运行机理是使用Process来模拟用户的DOS命令,当用户选中项目中的EXE文件以后(由于默认我们无法看到BIN目录下的东西,所以请点一下SHOW ALL FILES选择),此插件侦测到用户选中的是EXE文件以后,会自动从隐藏状态变成显示状态,如左上图,程序自动填充了当前文件的路径信息和命令名称,我们所需要做的只是选择可执行文件而已(程序已经做了筛选),我们也可以通过点击选取路径按钮或者双击路径文本框来选择运行项目以外的程序,点了执行命令以后,RICHTEXT控件里将展示程序的运行结果,这样一晃而过的东西就变成“永恒”啦,呵呵。
来看代码吧,来看关键的执行命令的代码。 
private void Start()
         {
              Process p = new Process();
              StreamWriter sw;
              StreamReader sr;
              StreamReader err;            
              ProcessStartInfo psI = new ProcessStartInfo("cmd");
              psI.UseShellExecute = false;
              psI.RedirectStandardInput = true;
              psI.RedirectStandardOutput = true;
              psI.RedirectStandardError = true;
              psI.CreateNoWindow = true;
              p.StartInfo = psI;      

              p.Start();
              sw = p.StandardInput;
              sr = p.StandardOutput;
              err = p.StandardError;    

              sw.AutoFlush = true;
              if (this.txtCommandname.Text != "")
              {
                   //切换到当前目录
                   sw.WriteLine("cd "+this.txtPathInfo.Text);
                   sw.WriteLine(this.localdrive);
                   sw.WriteLine(this.txtCommandname.Text);
              }
              else
                   //execute default command
                   sw.WriteLine("dir c://"); 
              sw.Close();
              this.txtResult.AppendText(sr.ReadToEnd());
              this.txtResult.AppendText(err.ReadToEnd()); 
         } 
         public void SetCommandInfo(string strPath)
         {
              int endposition = strPath.LastIndexOf("//");
              int startposition = strPath.IndexOf("//",0,strPath.Length); 
              string path = strPath.Substring(0,endposition);
              string filename = strPath.Substring(endposition+1);
              this.txtPathInfo.Text = path;
              this.txtCommandname.Text = filename;             
              this.localdrive = strPath.Substring(0,startposition);
         } 
    点击执行以后就是执行Start这个函数,关于PROCESS的更详细的信息请看一下MSDN里的帮助,这里我们看到程序利用了CMD作为入口,就象在开始菜单——运行里面打CMD一样,接着程序利用DOS命令切换到当前目录,然后执行程序,最后再是读出程序的执行结果,总而言之,这部分代码比较简单。 
另外一个函数是做改变当前程序设置用的。 
接下来看我们这次的主体Connect.CS里的东西 
public void Exec(string commandName, EnvDTE.vsCommandExecOption executeOption, ref object varIn, ref object varOut, ref bool handled)
         {
              handled = false;
              if(executeOption == EnvDTE.vsCommandExecOption.vsCommandExecOptionDoDefault)
              {
                   if(commandName == "Command.Connect.Command")
                   {
                       if (this.doscommand == null)
                       {
                            this.ShowWindow();
                       }
                       else
                       {
                            this.window.Activate();
                       }
                       handled = true;
                       return;
                   }
              }
         }
    这个是主体程序,可以看到主要是根据当前控件是否已经实例化来决定是否执行ShowWindow函数,如果已经是的话,将直接调用装载控件的窗体。这里的doscommand就是刚刚我们创建的控件的一个引用。
private void ShowWindow()
         {
              object objTemp = null;
              try
              {
                   string guid = "{C7520611-4791-41a9-9AE8-178F78844C2E}";
                   window = applicationObject.Windows.CreateToolWindow(addInInstance,"EastSpider.Command.DOSCommand","EastSpider.Command.DOSCommand",guid,ref objTemp); 
                   if (window.IsFloating)
                   {
                       window.Height = 700;
                       window.Width = 800;
                   } 
                   AddToMainWindow(window);
                   window.Visible = true; 
                   selectionEvents = (EnvDTE.SelectionEvents)applicationObject.Events.SelectionEvents;
                   selectionEvents.OnChange += new EnvDTE._dispSelectionEvents_OnChangeEventHandler(this.SelectionOnChange); 
                   this.doscommand = (EastSpider.Command.DOSCommand)objTemp;
              } 
              catch
              {
              }
         } 
private void AddToMainWindow(Window win)
         {
              Window mainWindow = applicationObject.MainWindow;
              Windows windows = applicationObject.Windows;
              LinkedWindows lw = mainWindow.LinkedWindows;
              if ( lw != null )
              {
                   if ( win.AutoHides != true)
                       lw.Add(win);
              }
         } 
这两段程序建立了装载控件的窗体,并自动“靠边隐藏”,:) 
private bool IsExeFileSelected()
         {
              EnvDTE.SelectedItems selectedItems = applicationObject.SelectedItems;
              EnvDTE.SelectedItem selectedItem = selectedItems.Item(1); 
              if ( selectedItem == null )
                   return false;
              EnvDTE.ProjectItem projectItem = selectedItem.ProjectItem;
              if ( projectItem == null )
                   return false;
              string fullName = projectItem.get_FileNames(1);
              string ext = System.IO.Path.GetExtension(fullName);
              if (string.Compare(ext, ".exe", true) != 0)
                   return false;
              else
                   return true;
         } 
         private void SelectionOnChange()
         {
              if ( ( applicationObject.SelectedItems.Count == 1  ) && IsExeFileSelected())
              {
                   window.Visible = true;
                   doscommand.SetCommandInfo(applicationObject.SelectedItems.Item(1).ProjectItem.get_FileNames(1));
              }
         } 
    这两段代码是判断当前是否选择了唯一的可执行文件,如果是,把参数传递给控件类里用于改变当前默认设置,这样,就做到了用户只需选择文件,程序就可自动做出反应。 
注意:出于程序的需要(Connect.cs里创建窗体的时候),我给控件类指定了ProgId 和 Guid,如下: 
[ProgId("EastSpider.Command.DOSCommand"),Guid("C7520611-4791-41a9-9AE8-178F78844C2E")]
public class DOSCommand : System.Windows.Forms.UserControl
……. 
    将命名空间与类型名组合在一起可以为类自动生成 ProgId。然而,这可能产生无效的 ProgId,具体的信息请参考一下MSDN吧。 
  由于代码比较多,这里不能一一全部奉上了,以上的代码已经完全能实现我所说的功能了,剩下的一些零碎的东西我相信大家自己补充一下肯定不成问题,关于公共环境对象模型(EnvDTE 类型库)等相关的信息,请大家还是参考一下MSDN里面的东西,由于大部分代码都是自动生成的,我们所要的只是引用而已,我也不介绍了。我会在适当的时间发布整个工程,请关注 http://www.dev-club.com/club/bbs/main.asp?boardid=115,关于工程的实例,请到这里下载 ftp://devclub:devclub@202.106.155.102/,关于插件的更多资源,请参考这里 http://msdn.microsoft.com/vstudio/downloads/automation.asp,希望这两个实例能对你有些帮助,我是东方蜘蛛。
 
【免费视频】使用VS Code开发ASP.NET Core WebAPI应用程序 1、使用VS Code开发ASP.NET Core WebAPI应用程序 1、使用Visual Studio Code开发Asp.Net Core基础入门实战 毕竟从.net过度过来的我们已经习惯了使用Microsoft的Visual Studio进行开发。那么有没有一款媲美Visual Studio的开发工具可以让我们能够在Linux系统上进行高效的.NET Core开发呢?答案是肯定的... 阅读详情

相关推荐

掌握.NET Reflector:VS2015到VS2019的深入应用指南

NET Reflector是一个多功能的工具,它的主要功能是将编译后的.NET程序集还原成源代码。这种反编译的能力为开发者提供了一种独特的视角,以理解代码是如何实现特定功能的。此外,.NET Reflector还支持查看和搜索元数据、进行依赖关系分析以及反向工程的导航和搜索。在这一章节,我们将简要介绍.NET Reflector的基本情况,并探讨它带来的优势。接下来,我们会走进如何安装和运行.NET Reflector,并进行简单的操作实践,以便于新手用户快速上手。

weixin_34520664的博客 835

用Visual C# .NET开发简单的复合控件

用Visual C# .NET开发简单的复合控件 内容提要:本文介绍如何用Visual C# .NET 2002开发简单的复合控件(Composite Control),主要讲解控件开发过程中的属性(Property)和事件(Event)处理,以方便开发人员在.NET平台下根据自己的需要开发适合的控件。 当我们在.NET平台下做Windows Forms开发时,常常需要为了某一特殊

Goofyyang的专栏 3131

MATLAB/Simulink BLDC电机控制模型搭建:六步换相与速度环实战

无刷直流电机(BLDC)控制是电机驱动领域的核心技术,其六步换相原理通过霍尔信号控制逆变器开关,使定子磁场与转子磁场保持垂直以产生最大转矩。在MATLAB/Simulink中搭建BLDC控制系统,需从电机本体建模入手,结合PWM占空比调节和速度环PI控制器,实现速度闭环与波形观测。该技术广泛应用于电动工具、无人机电调和伺服驱动器等场景。本文详细解析BLDC六步换相逻辑、反电动势建模及Simulink分层设计方法,帮助读者掌握从零搭建完整控制模型的工程实践。

weixin_28273593的博客 207

VisualStudio如何进行插件开发?

使用Visual Studio插件可以极大地提升开发效率、提供更好的集成环境、丰富扩展生态系统、方便调试和故障排除,并提供可视化设计和建模等功能。这些好处有助于开发人员更快速、高效地完成项目,并提供更好的用户体验。本文记录VisualStudio开发插件的过程。

【cacrle】的博客 5661

从零构建NVENC编码器:一个游戏开发者的实战手册

本文详细介绍了如何从零构建NVENC编码器,特别针对游戏开发者提供实战指南。内容涵盖NVENC基础概念、DirectX纹理捕获、异步编码优化及高级特性配置,帮助开发者高效集成硬件编码技术到游戏引擎中,实现高性能游戏录制和直播功能。重点解析了NVIDIA专用编码芯片的优势与API使用技巧。

weixin_29292431的博客 365

Android手机本地语音转文字实战:用FunASR+ONNX Runtime打造离线ASR应用(附模型下载)

本文详细介绍了如何在Android应用中集成FunASR和ONNX Runtime,构建高性能的离线语音识别系统。通过模型选择、工程化集成和性能调优等实战技巧,开发者可以实现本地语音转文字功能,有效保护用户隐私并提升响应速度。

weixin_29046611的博客 266

利用vs控件webBrowser自己做最简单浏览器

开发工具VS:首先利用vs建一个窗体应用程序! 直接拉一个 文本框 用来输入网址,一个按钮,用来点击跳转,一个webBrowser控件 用来显示网页内容。 给按钮一个点击事件: 代码如下就OK了: //获取地址栏里面的内容 string inputUrl = UrlText.Text; //设置给webbrowser控件my_Br...

dianhanbing5760的博客 1615

人形机器人快速原型开发:运动学建模实践

人形机器人是最接近人类形态的智能载体,在服务、医疗、灾难救援等场景中潜力巨大。但开发人形机器人面临一个核心挑战:如何快速验证"让机器人动起来"的基础能力?本文聚焦运动学建模这一关键环节,覆盖从理论建模到代码实现的全流程,帮助开发者在1-2天内完成一个简单人形机器人的运动学原型。本文采用"概念→原理→实战"的递进结构:先通过生活化案例理解运动学核心概念,再用数学工具拆解建模过程,最后通过Python代码+仿真工具完成完整实践。运动学建模:研究机器人关节运动与末端执行器位置/姿态的数学关系(不涉及力和质量)

AI天才研究院 1077

visual studio插件开发-Menu

工欲善其事,必先利其器,作为程序员我们很大部分时间在和ide打交道,好的插件可以大大提高我们的编程效率,我开发过几个vs插件来解决一键生成dbmodels,快速部署到服务器,总结下来最关键的还是对于Menu这块的扩展,因为这是插件功能的最常见的入口之一,下面给大家介绍vs插件各种menu的扩展环境准备这里我使用vs2022版本,要开发vs插件的话,需要vs安装插件开发模块打开vs 然后点击 工具 ...

dotNET跨平台 1776

华为od 面试八股文_C++_01_含答案

华为od 面试八股文_C++_01_含答案

MISAYAONE的博客 5588

LabVIEW实现HTTP通信

本节简要介绍HTTP通信的基础知识,并以工业物联网平台TLINK中云端设备的数据发布设计为例,阐述互联网环境下HTTP客户端应用程序设计的基本方法。重点讲解工业物联网平台TLINK中HTTP设备的创建、通信数据帧的构造与测试。

不脱发的程序猿 1545

使用VS2019/VS2022制作桌面程序的安装包

使用VS 2019制作桌面程序的安装包 0. 目录: 文章目录使用VS 2019制作桌面程序的安装包0. 目录:1. 新建解决方案及项目2. 安装制作安装包的插件3. 新建安装包项目4. 项目新建完成,弹出安装项目引导窗口5. 安装程序项目介绍6. 重要属性说明7. 配置安装项目的属性信息8. 给主程序生成用户桌面的快捷方式和程序菜单的快捷方式9. 生成安装包10. 安装验证11. 软件升级更新...

技术心得总结 1万+

知识库构建革命:基于Agent的智能检索系统设计

本文聚焦“基于Agent的智能检索系统”这一前沿技术,系统讲解其设计逻辑、核心技术与落地方法。我们将覆盖从基础概念(如Agent如何“理解”知识)到实战代码(如何用Python搭建原型系统)的全链路内容,帮助技术开发者、企业知识管理负责人理解这一技术为何能颠覆传统知识库。本文将按“问题引入→核心概念→技术原理→实战落地→未来趋势”的逻辑展开:先用“老图书馆的困境”故事引出传统知识库的问题;再用“智能图书管理员”类比解释Agent如何革新检索;接着拆解NLP、对话管理、知识推理等核心技术;

AI智能探索者的博客 726

VS Code上使用keil插件

VS Code的keil插件使用方法VS Code简介软件下载修改语言为中文安装拓展(插件)修改编码配置(出现乱码情况再配置)打开一个STM32工程 VS Code简介 Visual Studio Code是是由微软研发的一个轻量级但功能强大的源代码编辑器,可在您的桌面上运行,并且可用于Windows,macOS和Linux。它具有对JavaScript,TypeScript和Node.js的内置支持,并具有丰富的其他语言(例如C ++,C#,Java,Python,PHP,Go)和运行时(例如.NET和U

weixin_45905650的博客 3万+

智能手表PCB布局:PPG与IMU传感器噪声隔离与应力解耦设计

在可穿戴设备硬件开发中,PCB布局已超越传统布线范畴,成为决定信号完整性、电磁兼容性与机械可靠性的核心环节。心率传感器(PPG)依赖微伏级光电容积脉搏波信号,极易受数字开关噪声与电源纹波干扰;姿态传感器(IMU)则对PCB弯曲形变引发的机械应力高度敏感。其布局需融合电磁场建模、热-力-电多物理协同及高密度互连约束。关键技术价值体现在噪声路径切断、地弹抑制、应力方向解耦与电源域隔离等工程实践。典型应用场景涵盖智能手表、医疗级贴片设备及微型运动传感终端。本文聚焦PPG与IMU两大模组在STM32L4平台上的实操

weixin_32869687的博客 172

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

我个人中意的VS2017/VS2019插件,推荐给大家(#^.^#)

1、VS插件,微软官网 https://marketplace.visualstudio.com/ https://visualstudio.microsoft.com/zh-hans/vs/features/extend/--扩展 Visual Studio IDE,入门教程 https://marketplace.visualstudio.com/publishers/Microso...

$firecat利白的代码足迹$ 10万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

采用Reflector的VS.net插件断点调试无源码DLL

.Net的编程利器Reflector可以反编译基于.net开发的应用程序和DLL,其功能强大不用多说。今天想试验一把利用VS.net的插件断点调试外部无源码的DLL(只要是程序集都可以,所以exe也行)功能。   一.加载VS.net的Reflector插件 从官网下载的Reflector程序(最新版本为6.1.0)包中自带了VS.net的插件,名称为“RedGate.Reflector.A

lovetaosha的专栏 8035

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【转贴】VS.NET 2003集成环境插件开发指南

VS.NET 2003集成环境插件开发指南 转载请注明出处:http://www.cnblogs.com/dragon 一、             简介――Visual Studio.NET插件能做什么? Visual Studio.NET插件能做很多事情,例如: 1、   编写如CodeRush一样的开发环境代码辅助工具 2、   编写如CodeSmith这样的代码模板

烟雨阁 672

LoadRunner的VS NET 2005插件

LoadRunner的VS NET 2005插件

gdhjgfr的博客 162

LoadRunner的VS.NET 2005插件

在LoadRunner9.5的安装包中的Additional Components目录下,可以在IDE Add-ins目录中找到VS.NET2003以及VS.NET2005的插件。 安装 VS.NET 2005 的插件后,可以在VS.NET 2005中创建和开发LoadRunner的VS.NET Vuser脚本。 创建LoadRunner C#.NET Vuser项目后,可以看

软件质量优化 7041

实用小技巧:.VS2022+.NET9超级插件Disasmo

点击上方蓝字 江湖评谈设为关注前言经常有人问:怎么查看.NET汇编代码?一般的来说查看ASM,可以通过VS菜单栏-》调试-》汇编,来查看。此处查看的是ASM是未优化,粗糙的代码。专业点的会通过设置环境变量,Release编译查看。C:\test>set DOTNET_JitDisasm=Main C:\test>dotnet run -c Release ; Assembly list...

dotNET跨平台 689

NUnit 在VS.NET 2003上的插件.

NUnit 在VS.NET 2003上的插件. VSNUnit2k3是Sourceforge上的一个开源软件,通过这个插件,能使我们VS.NET的IDE中直接使用单元测试工具,,不用去来回的切换了哦~:P使用说明:先装上原版,再把压缩包中的VSNUnit2k3.dll覆盖到原版的位置..重启VS.NET IDE就OK了...Good luck..说明:     1.原始版本打开这个

shanyou的专栏 1746

DataWindow .NET 2.5 工作在 VS 2008的问题

1、在VS2008中无法使用DataWindow .NET 2.5在VS2005的插件面板DataWindow .NET 2.5 安装过程三个dll注册失败(DWPrj.dll、DWPainter.dll、 QryPainter.dll)安装完成后在VS2008中无法打开相应面板。2、在VS2008中单独使用DataWindow Designer  2.5无法得到sybase支持D

不愿放弃的专栏 3264
上一篇: 对于不返回任何键列信息的 SelectCommand 不支持 UpdateCommand 的动态 SQL 生成问题的解决办法
下一篇: 右键-打开方式-选择程序,拒绝访问,的解决办法
NewMap
博客等级 码龄19年 122粉丝 204原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值