#pragma once #include "pluginbase.h" class Plugin : public nsPluginInstanceBase { private: NPP m_pNPInstance; NPBool m_bInitialized; public: Plugin(NPP pNPInstance); ~Plugin(); NPBool init(NPWindow* pNPWindow) { m_bInitialized = TRUE; return TRUE;} void shut() { m_bInitialized = FALSE; } NPBool isInitialized() { return m_bInitialized; } };
编辑Plugin.cpp:#include "Plugin.h" ////// functions ///////// NPError NS_PluginInitialize() { return NPERR_NO_ERROR; } void NS_PluginShutdown() { } nsPluginInstanceBase * NS_NewPluginInstance(nsPluginCreateData * aCreateDataStruct) { if(!aCreateDataStruct) return NULL; Plugin * plugin = new Plugin(aCreateDataStruct->instance); return plugin; } void NS_DestroyPluginInstance(nsPluginInstanceBase * aPlugin) { if(aPlugin) delete (Plugin *)aPlugin; } ////// Plugin ///////// Plugin::Plugin(NPP pNPInstance):nsPluginInstanceBase(), m_pNPInstance(pNPInstance), m_bInitialized(FALSE) { } Plugin::~Plugin(void) { }
4、修改项目属性
字符集选择为多字节字符(不是必须的),下面添加包含文件:5、编译调试完成了上述设置就可以进行编译调试了。这是整个项目的结构:生成该项目之后,可以在项目的Debug目录下找到dll文件,这里是npmedia.dll。可以写注册表注册这个dll,也可以将这个dll复制到用来测试插件的Firefox的profile目录下的plugins(没有则自行创建)文件夹中。写注册表的方式:运行regedit,在HKEY_LOCAL_MACHINE\SOFTWARE\MozillaPlugins下建立一个子项,可随意命名:这里以@zcf.com/media为例,新建字符串项Path,其值为生成的dll的路径:注意,这种方式在XP系统下测试通过,在WIN7系统下没有成功(注意:win7 64位应运行 %windir%\SysWOW64\Regedit.exe,打开的就是64注册表,可以在HKEY_LOCAL_MACHINE\SOFTWARE\MozillaPlugins下看到很多64位版本的插件,多谢网友 Jearol 告知)。还有一种方式就是设置项目属性,将输出目录指定为用来调试的Firefox相应profile目录下的plugins目录。这样就不用每次生成之后来回复制dll。如下图:然后在Firefox地址栏中输入about:plugins就可以看到我们的插件了。测试页面可以如下:测试文件mediatest.html:[html] view plaincopy <!doctype html> <html> <title>TEST WEB PAGE for media plugin</title> <body> <object type="application/media-plugin" width=200 height=150 ></object> <br /> </body> </html> 关于调试插件:首先用Firefox打开测试页面,然后在VS2010中需要的地方设置断点,接着选择调试/附加到进程在弹出的对话框中选择plugin-container.exe,可能不止一个,注意根据其路径选择正确的那个。最后刷新测试页面就可以在你设置的断点的地方断下,进行调试。下一篇文章会有一个简单的实例展示这个调试过程。========3DsMax导出插件编写(一)——vs2010和3dsmax2011(64位)的配置方法
http://liweizhaolili.blog.163.com/blog/static/162307442013117731953/ 作为3D开发人员,特别是3D引擎开发人员,经常会接触到各种三维模型的数据。虽然说3dsmax已经可以导出很多格式的模型,不过总是不一定合适自己用。所以总有一种想自己写一个导出插件,让3dmax导出自己想要的数据格式。这里为大家介绍一下怎样为3dmax写导出插件的第一步:怎样配置vs和maxSdk。这里你需要的东西有两个:1、一个完整版的3dsMax。2、一个Visual Studio。为什么是要完整版的3dsMax呢?这是因为完整版本的3dsMax的安装文件自带有maxSdk。这是很重要的。不同版本的3dsMax,带的sdk会不一样。你拿了其他版本的sdk做了的插件,不一定适合你当前的3dsmax使用的。很多人写这个配置教程,会告诉你上网去找maxSdk。其实不需要这么麻烦的。下面会告诉大家怎样安装。我这里拿的是我当前使用的3dsMax2011的64位版来做示范。其他的版本做法是一样的。那么Visual Studio有什么要求呢?有些人写的教程会告诉你,每个版本的max的sdk会对应不同版本的vs,最好对应。这样说也不算错。不过其实这个对应关系没那么严格的,我下面会告诉大家怎样跨版本配置。比如max2011的sdk对应的是vs2008,我下面将会用vs2010来配置。好,把上面2样东西准备好之后,3dsmax正常安装,vs也正常安装,准备工作就完成了,接下来阿赵和大家就一起来装这个maxSdk:运行完整版本的3dsMax安装文件,会看到以下界面,我们选择“安装工具和实用程序”:使用vs2010为3dsmax2011(64位)写导出插件——配置方法 - 阿赵 - 有爪的小羔羊阿赵 在这里选择需要安装的工具,我们需要的是3ds max 2011的sdk:使用vs2010为3dsmax2011(64位)写导出插件——配置方法 - 阿赵 - 有爪的小羔羊阿赵 安装完之后,会在安装目录找到一个howto文件夹,里面有个3dsmaxPluginWizard文件夹,在里面有个readme.txt文档,文档里面说明了怎么去配置这个sdk的。其实在安装完之后,我们可以把这个maxsdk的文件夹随便的移动到我们想要的地方的。不过在配置之前,最好先移动好,开始配置之后,就别动这个文件夹的路径了。使用vs2010为3dsmax2011(64位)写导出插件——配置方法 - 阿赵 - 有爪的小羔羊阿赵 在配置之前,这个文件夹的属性是只读的,我们先把整个文件夹的只读取消,然后开始配置:使用记事本打开同文件夹下的3dsmaxPluginWizard.vsz,然后找到下图用红线下划的地方。默认的Wizard=VsWizardEngine.9.0,代表的是对应vs2008版本。我现在需要使用2010版本,所以把它改成了10.0然后下面的ABSOLUTE_PATH改成当前的3dsmaxPluginWizard文件夹的路径:使用vs2010为3dsmax2011(64位)写导出插件——配置方法 - 阿赵 - 有爪的小羔羊阿赵 改完之后,我们把3dsmaxPluginWizard文件夹下的这三个文件复制:使用vs2010为3dsmax2011(64位)写导出插件——配置方法 - 阿赵 - 有爪的小羔羊阿赵 然后找到vs2010的安装文件夹,找到VC/vcprojects文件夹,把刚才复制的三个文件放到这个文件夹下:使用vs2010为3dsmax2011(64位)写导出插件——配置方法 - 阿赵 - 有爪的小羔羊阿赵 然后我们就可以打开vs2010,创建新项目。这时候会在c++项目里面看到了3dsmax插件的类别,选择它,然后在下面的项目名称和路径里面输入自己想要的名字和路径。使用vs2010为3dsmax2011(64位)写导出插件——配置方法 - 阿赵 - 有爪的小羔羊阿赵 如果你之前的配置正确,将会弹出设置向导,如果没有弹出,则要检查之前的步骤了。我们选择File Export:使用vs2010为3dsmax2011(64位)写导出插件——配置方法 - 阿赵 - 有爪的小羔羊阿赵 这里是插件的详情,直接下一步就行:使用vs2010为3dsmax2011(64位)写导出插件——配置方法 - 阿赵 - 有爪的小羔羊阿赵 这里是项目详情,第一项输入maxsdk的路径,第二项输入插件想输出的路径,比如3dsmax安装目录的plugins文件夹,第三项输入需要调试的3dsmax的安装目录。三项都是可以在项目建立之后修改的。使用vs2010为3dsmax2011(64位)写导出插件——配置方法 - 阿赵 - 有爪的小羔羊阿赵按finish后,由于这个版本的sdk对应的是vs2008,现在我用的是2010,所以有一个转换版本的过程使用vs2010为3dsmax2011(64位)写导出插件——配置方法 - 阿赵 - 有爪的小羔羊阿赵 这时候,项目应该已经创建成功。如果没有创建成功,则检查之前的步骤。通常是因为3dsmaxPluginWizard.vsz里面的vs版本设置错误。如果创建成功后,我们在解决方案资源管理器里面找到你的项目的cpp,打开。使用vs2010为3dsmax2011(64位)写导出插件——配置方法 - 阿赵 - 有爪的小羔羊阿赵 在cpp里面,修改Ext方法里面的返回,这里是你导出的模型的格式后缀名,这里我是改成了”azhao“,再改ShortDesc方法里面的返回,这里是模型的描述,我改成了”阿赵的模型格式“。使用vs2010为3dsmax2011(64位)写导出插件——配置方法 - 阿赵 - 有爪的小羔羊阿赵 现在按调试,会弹出错误:使用vs2010为3dsmax2011(64位)写导出插件——配置方法 - 阿赵 - 有爪的小羔羊阿赵 这是因为调试的目标没有设置正确,可以找到项目属性修改:使用vs2010为3dsmax2011(64位)写导出插件——配置方法 - 阿赵 - 有爪的小羔羊阿赵 在配置属性里面的调试,修改命令项为你的3dsmax.exe路径:使用vs2010为3dsmax2011(64位)写导出插件——配置方法 - 阿赵 - 有爪的小羔羊阿赵按道理,现在我们再开始调试,你的3dsmax就会启动了。如果你是为32位的3dsmax做配置,那么整个配置过程已经完成了。但我这里3dsmax启动后报错了,这是因为我的3dsmax是64位的,刚才调试生成的32位插件不能用。使用vs2010为3dsmax2011(64位)写导出插件——配置方法 - 阿赵 - 有爪的小羔羊阿赵 接下来我们将要把项目改成64位的。先打开项目属性,在配置管理器里面,把Win32改成x64:使用vs2010为3dsmax2011(64位)写导出插件——配置方法 - 阿赵 - 有爪的小羔羊阿赵 改完之后,之前我们的所有配置都没了,需要逐个去配置:先配置调试程序路径:使用vs2010为3dsmax2011(64位)写导出插件——配置方法 - 阿赵 - 有爪的小羔羊阿赵 然后配置输出路径使用vs2010为3dsmax2011(64位)写导出插件——配置方法 - 阿赵 - 有爪的小羔羊阿赵 配置生成程序数据库文件的路径使用vs2010为3dsmax2011(64位)写导出插件——配置方法 - 阿赵 - 有爪的小羔羊阿赵 好了,64位修改完成,我们再次进行调试,3dsmax应该就能正常打开了。我们随便在场景里面建立一个茶壶,然后导出。现在我们可以在选择导出格式的地方,找到我们刚才指定的格式了,就是”阿赵的模型格式“,后缀名是”azhao“。使用vs2010为3dsmax2011(64位)写导出插件——配置方法 - 阿赵 - 有爪的小羔羊阿赵 确定保存,会打开一个对话框,不过里面都是一些默认的东西,没有任何内容的,因为我们只是完成了配置的步骤,没有开始写导出的实际内容。使用vs2010为3dsmax2011(64位)写导出插件——配置方法 - 阿赵 - 有爪的小羔羊阿赵 在vs里面找到DoExport方法,在里面打一个断点。再次去选择导出我们的格式,vs应该就能进入断点了。DoExport方法就是导出方法的入口了。使用vs2010为3dsmax2011(64位)写导出插件——配置方法 - 阿赵 - 有爪的小羔羊阿赵 如果你途中发现出现问题,很有可能是以下几种问题:1、下载的MaxSdk有问题,建议使用完整版3dsMax自带的sdk。2、忘记取消maxSdk文件夹的只读属性,这样在新建项目或者编译的时候都会出错。3、3dsmaxPluginWizard.vsz里面设置的vs版本不对。9.0对应的是vs2008,10.0对应的是vs2010,11.0对应的是vs2012.4、调试的时候出错,有可能是没有设置对调试对象,要设置为3dsMax的exe。5、调试的时候没有报错,却没有出现导出的选择。有可能是导出保存的路径不对,要保存在3dsmax的安装路径里面的插件文件夹,比如plugins或者stdplugs文件夹。6、调试的时候3dsmax启动了,但在启动的途中报错。这有可能是使用的sdk和3dsMax版本不对应,或者是32位插件和64位软件不对应。这个过程虽然简单,不过却会遇到很多默默奇妙的小问题,网上虽然相关的教程不少,但起码我自己对着很多个教程都没有配置成功,所以才把自己的配置过程记录下来,希望能给以后需要配置的人一个参考。========自己动手编写一个VS插件(一)
http://blog.csdn.net/clever101/article/details/8733799 最近计划开发一个VS插件来帮助自己加快开发速度,研究了一下VS的插件开发。下面配合插图说明一下如何开发一个VS插件。 第一步:创建插件工程,具体如下图: 第二步不用干啥,如下图: 第三步:选择开发语言,这里我选的是C++/ATL,因为这是我最拿手的,当然你也可以选择C#,这里不建议你选择C++/CLR,因为这个几乎冷僻得没人用,一般网上也找不到相关的例程,如下图: 第四步选择调用程序,第一个是必选的,第二个可选可不选,选上也无妨,如下图:第五步输入插件名称和说明,如下图:第六步设置用户界面的调用方式,这里简单设置为在宿主应用程序启动时加载,如下图:第七步是填写关于信息,如下图:第八步是单击完成,如下图: 由于所生成的插件是一个com组件,需要注册才能使用,因此需要设置一个生成后事件:regsvr32$(OutDir)/$(ProjectName).dll,具体如下图:========自己动手编写一个VS插件(二)——理解OnConnection函数
http://www.thebigdata.cn/JiShuBoKe/4429.html 继续开发一个VS插件。首先认识一下通过插件向导生成的类和函数,大致弄清一下它们的含义。创建一个基于ATL的插件工程,都生成了一个CConnect类。现在我们看看CConnect类的一些重要接口:CConnect::OnConnection:这个接口可以说是插件的入口函数。只是这个入口函数会被调用几次,至于何时调用取决于这个函数的ConnectMode参数。 一个插件有下面几种加载模式:在VS启动时,并且该插件并标记为随同VS启动时启动(所谓随同VS启动时启动请见图一),这时ConnectMode参数的值为ext_ConnectMode.ext_cm_Startup。图一在用户需要时时被调用,就是说该插件并没有被标记为VS启动时启动但用户手动在外接程序管理器上给启动一栏打上勾上时,这时ConnectMode参数的值为ext_ConnectMode.ext_cm_AfterStartup。从命令行启动(使用devenv.exe去生成一个解决方案),这时ConnectMode参数的值为ext_ConnectMode.ext_cm_CommandLine。请注意这种情况在一些旧版本的Visual Studio会有一些bug并且看来只有在Visual Studio 2008才会正确运行(比VS 2008高的版本应该也可以)。当插件使用常驻的工具栏、命令栏和按钮(常驻意味着即使插件没有加载用户界面也会出现)同时Visual Studio要求插件去初始化常驻用户界面,这时ConnectMode参数的值为ext_ConnectMode.ext_cm_UISetup。这种连接模式必须不同于ext_ConnectMode.ext_cm_Startup和ext_ConnectMode.ext_cm_AfterStartup的情况下。假如你建的插件不是一个一般插件,而是一个和特定的解决方案相关的插件,当这个解决方案被加载时,这时ConnectMode参数的值为ext_ConnectMode.ext_cm_AfterStartup。 所以,存在两种模式:ext_ConnectMode.ext_cm_Startup和ext_ConnectMode.ext_cm_AfterStartup。这意味着它们都以相同的方式处理因为在一般情况下插件在VS启动时自动加载还是过了一些时候手动加载它们并没有什么不同。所以你可以使用下面的代码:STDMETHODIMP CConnect::OnConnection(IDispatch *pApplication, ext_ConnectMode ConnectMode, IDispatch *pAddInInst, SAFEARRAY ** /*自定义*/ ){HRESULT hr = S_OK;pApplication->QueryInterface(__uuidof(DTE2), (LPVOID*)&m_pDTE);pAddInInst->QueryInterface(__uuidof(AddIn), (LPVOID*)&m_pAddInInstance);switch(ConnectMode){case ext_cm_Startup:case ext_cm_AfterStartup:{// 初始化你的插件break;}default:break;}return hr;} 然而当插件在ext_ConnectMode.ext_cm_Startup模式加载(也就是在Visual Studio启动时加载),VisualStudio并没有完全初始化。所以这是很多插件可以正确初始化,但一些却会失败。比如当你的插件加载时需要显示一个工具窗口,当插件在VS启动时加载工具窗口却并不会显示,但在外接程序管理器手动加载这个插件时可以显示这个工具窗口。 所以在VisualStudioz完全初始化之后再调用OnConnection函数会比较好。IDTExtensibility2接口提供了一个在VisualStudioz完全初始化后会被调用的叫OnStartupComplete的方法。所以正确的代码如下:STDMETHODIMP CConnect::OnStartupComplete (SAFEARRAY ** /*自定义*/ ){// 初始化你的插件return S_OK;}// CConnectSTDMETHODIMP CConnect::OnConnection(IDispatch *pApplication, ext_ConnectMode ConnectMode, IDispatch *pAddInInst, SAFEARRAY ** /*自定义*/ ){HRESULT hr = S_OK;pApplication->QueryInterface(__uuidof(DTE2), (LPVOID*)&m_pDTE);pAddInInst->QueryInterface(__uuidof(AddIn), (LPVOID*)&m_pAddInInstance);switch(ConnectMode){case ext_cm_Startup:// 什么也不做,因为Visual Studio并没有完全初始化break;case ext_cm_AfterStartup:{ OnStartupComplete(NULL);break;}default:break;}return hr;}========vscode编写插件详细过程
http://blog.csdn.net/libin_1/article/details/51452943之前编写了一个vscode插件用vscode写博客和发布,然后有园友要求写一篇来介绍如何开发一个vscode扩展插件,或者说介绍开发这个插件的过程。然而文章还没有写,园子里面已经有人发布一个文章,是园友上位者的怜悯的VSCODE 插件初探介绍了自己开发的一个插件与如何简单的开发一个插件。虽然已经有这么一个文章,但是我觉得还是可以更仔细的来介绍如何来开发一个vscode插件,也算之前说好要写这么一个文章的一个承诺吧,于是就有了还这么篇文章。一、开发环境介绍与安装为了演示一个安装环境,我安装了一个干净的win10系统来操作截图。1.首先我们需要安装一个最基本的Visual Studio Code,我们可以先到官网下载一最新版本的来进行安装,点击上面的连接,进去下载总是懂的吧。下载完后点击安装,然后一直下一步安装就可以。2.安装完vscode后呢,我们就需要来看如何开发我们的自己的插件了,参考官方文档Your First Extension(Example - Hello World)。根据文档我们得知我们需要安装一个 node.js,同样的点击前面的连接,到nodejs的中文网站下载一个安装程序,下载完点击安装下一步就可以。3.在安装完上面两个工具后,我们还需要一个生产插件代码的东西,也就是 Yeoman 和 VS Code Extension generator.Yeoman的介绍不在本文章中,自己点击上面的连接去了解。我们可以打开cmd来执行下面的命令来安装这两个工具。npm使用介绍npm install -g yo generator-code在完成上面的安装后,可以通过输入命令yo code来生成我们要的基本代码。 在os系统上可以通过用上下键来选择要创建哪种类型的项目,在win可以通过输入1、2、3这样的数字然后按回车来选择。二、生成基本代码的讲解与简单的修改在几个项目类型中,我们选择了第一个TypeScript来作为我们编写扩展的语言,其他几个项目类型这里不做介绍。TypeScript语法自行理解项目结构介绍我们创建的一个项目结构如下:选择创建项目后有四个输入和一个选择输入你扩展的名称输入一个标志(项目创建的文件名称用这个)输入对这个扩展的描述输入以后要发布用到的一名称(和以后再发布时候有一个名字是对应上的)是问你要不要创建一个git仓库用于版本管理以上几个输入都会在package.json 这个文件里面有对应的属性来表示。输入完之后就创建了如上图的一个目录结构。这里不要脸的复制了一下别人的目录说明,由于我这个项目没有让生成Git仓库,所以没有.gitignore 这个文件。还有node_modules等其他多出来的目录结构是创建项目后运行 npm install 这个命令生成出来的。.├── .gitignore //配置不需要加入版本管理的文件├── .vscode // VS Code的整合│ ├── launch.json│ ├── settings.json│ └── tasks.json├── .vscodeignore //配置不需要加入最终发布到拓展中的文件├── README.md├── src // 源文件│ └── extension.ts // 如果我们使用js来开发拓展,则该文件的后缀为.js├── test // test文件夹│ ├── extension.test.ts // 如果我们使用js来开发拓展,则该文件的后缀为.js│ └── index.ts // 如果我们使用js来开发拓展,则该文件的后缀为.js├── node_modules│ ├── vscode // vscode对typescript的语言支持。│ └── typescript // TypeScript的编译器├── out // 编译之后的输出文件夹(只有TypeScript需要,JS无需)│ ├── src│ | ├── extension.js│ | └── extension.js.map│ └── test│ ├── extension.test.js│ ├── extension.test.js.map│ ├── index.js│ └── index.js.map├── package.json // 该拓展的资源配置文件├── tsconfig.json // ├── typings // 类型定义文件夹│ ├── node.d.ts // 和Node.js关联的类型定义│ └── vscode-typings.d.ts // 和VS Code关联的类型定义└── vsc-extension-quickstart.md 运行与简单修改介绍完目录结构后,我们可以来运行一下看看效果如果。我们打开一个vscode并把我们的sample目录自己拖拉到vscode的界面上,然后选择调试窗口,并点击开始调试或者直接按快捷键 F5项目运行起来后,会调用一个新的vscode窗口在标题栏的地方显示一个[扩展开发主机]的标题,然后这个窗口是支持我们刚才运行的插件项目的命令。我们可以看到扩展插件已经正常的运行了,接下来我们可以来简单修改一下代码以实现不同的简单功能。在修改之前需要简单的认识两个文件package.json { "name": "sample", //插件扩展名称(对应创建项目时候的输入) "displayName": "sample", "description": "blog sample", //插件扩展的描述(对应创建项目时候的输入) "version": "0.0.1", "publisher": "caipeiyu", //发布时候的一个名称(对应创建项目时候的输入) "engines": { "vscode": "^0.10.10" }, "categories": [ "Other" ], "activationEvents": [ //这是我们要理解的地方,是触发插件执行一些代码的配置 "onCommand:extension.sayHello" //这种是通过输入命令来触发执行的 ], "main": "./out/src/extension", //这个是配置TypeScript编译成js的输出目录 "contributes": { "commands": [{ //title 和 command是一个对应关系的 "command": "extension.sayHello", //这个是对应上面那个命令触发的,在代码里面也要用到 "title": "Hello World" //这个是我们在vscode里面输入的命令 }] }, "scripts": { //是在发布打包,或者其他运行时候,要执行的一些脚本命令 "vscode:prepublish": "node ./node_modules/vscode/bin/compile", "compile": "node ./node_modules/vscode/bin/compile -watch -p ./", "postinstall": "node ./node_modules/vscode/bin/install" }, "devDependencies": { //这是开发的依赖包,如果有其他的依赖包,并要打包的话,需要把dev去掉 "typescript": "^1.8.5", "vscode": "^0.11.0" } } extension.ts'use strict';// The module 'vscode' contains the VS Code extensibility API// Import the module and reference it with the alias vscode in your code belowimport * as vscode from 'vscode';// this method is called when your extension is activated// your extension is activated the very first time the command is executedexport function activate(context: vscode.ExtensionContext) { // Use the console to output diagnostic information (console.log) and errors (console.error) // This line of code will only be executed once when your extension is activated console.log('Congratulations, your extension "sample" is now active!'); // The command has been defined in the package.json file // Now provide the implementation of the command with registerCommand // The commandId parameter must match the command field in package.json let disposable = vscode.commands.registerCommand('extension.sayHello', () => { //只看这个地方'extension.sayHello'和 package.json 里面的 "onCommand:extension.sayHello" 是一个对应关系 // The code you place here will be executed every time your command is executed // Display a message box to the user vscode.window.showInformationMessage('Hello World!'); }); context.subscriptions.push(disposable); } // this method is called when your extension is deactivated export function deactivate() { } 这两个文件是很重要的,基本整个插件编写都是围绕着这两个文件来修改的,例如我们现在要增加多一个命令叫做 Hello Sample 那么我们先在 package.json 里面添加两个配置..."activationEvents": [ "onCommand:extension.sayHello", "onCommand:extension.saySample"],"contributes": { "commands": [{ "command": "extension.sayHello", "title": "Hello World" },{ "command": "extension.saySample", "title": "Hello Sample" }]}, ... 添加完这两个配置后,我们就需要在 extension.ts 里来注册这个命令事件let disposable = vscode.commands.registerCommand('extension.sayHello', () => { vscode.window.showInformationMessage('Hello World!');});context.subscriptions.push(disposable);let saySample = vscode.commands.registerCommand('extension.saySample', () => { vscode.window.showInformationMessage('This is a new sample command!');});context.subscriptions.push(saySample);修改完代码后,再次运行效果如下图三、 打包与发布我们编写完一个插件,总不能要用的时候来运行代码然后来使用吧,而且要分享给别人也不方便啊。有个很low的办法,就是拷贝项目到插件目录,但是这不靠谱吧。所以我们需要一个打包工具叫 vsce 同样的可以用npm来安装,打开cmd执行命令npm install -g vsce安装完成后可以用命令窗口 cd 到你的项目目录下去,然后执行命令vsce publish来发布到marketplace.visualstudio.com上面去。发布成功后可以在vscode里面用 ext install 来按这个插件。这种做法我个人觉得特别的麻烦,还需要去配置一个token,然后这个token还的找个地方记住,还会过期,而且在发布过程中还得祈祷网络好。所以这里不介绍,有兴趣的自己看这里。那么这里来介绍一个打包成 .vsix 的插件,而且这个插件也可以通过这个页面上传分享。cd到项目目录下,然后执行命令 vsce package 来打包一个vsce packageExecuting prepublish script 'node ./node_modules/vscode/bin/compile'...Created: /sample/sample-0.0.1.vsix我们可以看到执行了这个命令后,再执行一个 script 'node ./node_modules/vscode/bin/compile' 这个命令是在 package.json里面有配置"scripts": { "vscode:prepublish": "node ./node_modules/vscode/bin/compile", "compile": "node ./node_modules/vscode/bin/compile -watch -p ./", "postinstall": "node ./node_modules/vscode/bin/install"},执行完之后再创建了一个sample-0.0.1.vsix,这个就是我们打包好的插件安装包了,只要把这个直接拖到vscode的窗口上,就会提示你安装成功重启vscode,我们重启完之后就使用相关的命令。而且在插件的目录下也多了对应sample的目录。========