VS2010插件编写学习总结
生活随笔
收集整理的這篇文章主要介紹了
VS2010插件编写学习总结
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
VS2010 Addins 外接程序(插件)開(kāi)發(fā)
http://www.cnblogs.com/Leo_wl/archive/2013/03/21/2973886.html簡(jiǎn)單做了一個(gè)添加文件頭注視的插件,算作是學(xué)習(xí)。
首先看一下界面
外接程序是在 Visual Studio 集成開(kāi)發(fā)環(huán)境 (IDE) 中運(yùn)行的已編譯的 DLL。 編譯可以保護(hù)知識(shí)產(chǎn)權(quán)和
提高性能。 雖然可以手動(dòng)創(chuàng)建外接程序,但使用“外接程序向?qū)А备鼮楹?jiǎn)便。 此向?qū)?chuàng)建一個(gè)功能全
面但卻很基本的外接程序,創(chuàng)建完該程序后可立即運(yùn)行它。 “外接程序向?qū)А鄙苫镜目粘绦蚝?#xff0c;可
向其添加代碼并對(duì)其進(jìn)行自定義。
“外接程序向?qū)А弊屇梢詾橥饨映绦蛱峁╋@示名稱(chēng)和說(shuō)明。 這兩項(xiàng)內(nèi)容都將出現(xiàn)在“外接程序管理器
”中。 還可以選擇讓向?qū)纱a,用于向“工具”菜單中添加可打開(kāi)外接程序的命令。您也可以選擇
為外接程序顯示一個(gè)自定義“關(guān)于”對(duì)話(huà)框。 向?qū)瓿蓵r(shí),將生成只有一個(gè)類(lèi)的新項(xiàng)目(名為 Connect
),該項(xiàng)目實(shí)現(xiàn)外接程序。
第一步 創(chuàng)建解決方案
這里使用的是VS2010 、C#、WinForm
文件→新建→項(xiàng)目→其他項(xiàng)目類(lèi)型→擴(kuò)展性→Visual Studio 外接程序,修改名稱(chēng)、位置、解決方
案名稱(chēng)等信息,點(diǎn)擊確定
第二步 根據(jù)外接程序想道創(chuàng)建項(xiàng)目
當(dāng)然,你如果已經(jīng)是高手了,可以不用使用向?qū)?chuàng)建 項(xiàng)目。
如圖
下一步,選擇使用C#創(chuàng)建外接程序
下一步,選擇使用應(yīng)用程序主機(jī),有兩個(gè)選項(xiàng),Microsoft Visual Studio 2010 和Microsoft?
Visual Studio 2010 Macros(宏),兩個(gè)都勾選
下一步,填寫(xiě)外界程序名稱(chēng)和說(shuō)明
下一步,在選擇外接程序選項(xiàng)中,在“是否為外接程序創(chuàng)建命令欄用戶(hù)界面?”中勾選“是的,創(chuàng)
建工具菜單項(xiàng)“,向?qū)?huì)為你在工具菜單中創(chuàng)建一個(gè)菜單
下一步,關(guān)于信息,根據(jù)需要勾選是否生成關(guān)于對(duì)話(huà)框
下一步,完成
這樣系統(tǒng)向?qū)Ь蜑槟銊?chuàng)建了一個(gè)項(xiàng)目,并且生成了一個(gè)Connect類(lèi),實(shí)現(xiàn)IDTExtensibility2和
IDTCommandTarget接口
第三步 創(chuàng)建一個(gè)窗口
在項(xiàng)目上,右鍵,添加一個(gè)WinForm窗口,我在這里命名為MainForm
第四步 在MainForm類(lèi)中添加application對(duì)象
/// <summary>
? ? ? ? /// application對(duì)象
? ? ? ? /// </summary>
? ? ? ? private DTE2 _applicationObject;
? ? ? ? /// <summary>
? ? ? ? ///?
? ? ? ? /// </summary>
? ? ? ? public DTE2 applicationObject?
? ? ? ? {
? ? ? ? ? ? get { return _applicationObject; }
? ? ? ? ? ? set { this._applicationObject = value; }
? ? ? ? }
第五步 顯示這個(gè)創(chuàng)建的窗口
在Connect類(lèi)中找到public void Exec(string commandName, vsCommandExecOption?
executeOption, ref object varIn, ref object varOut, ref bool handled)這個(gè)方法
/// <summary>實(shí)現(xiàn) IDTCommandTarget 接口的 Exec 方法。此方法在調(diào)用該命令時(shí)調(diào)用。</summary>
? ? ? ? /// <param term='commandName'>要執(zhí)行的命令的名稱(chēng)。</param>
? ? ? ? /// <param term='executeOption'>描述該命令應(yīng)如何運(yùn)行。</param>
? ? ? ? /// <param term='varIn'>從調(diào)用方傳遞到命令處理程序的參數(shù)。</param>
? ? ? ? /// <param term='varOut'>從命令處理程序傳遞到調(diào)用方的參數(shù)。</param>
? ? ? ? /// <param term='handled'>通知調(diào)用方此命令是否已被處理。</param>
? ? ? ? /// <seealso class='Exec' />
? ? ? ? public void Exec(string commandName, vsCommandExecOption executeOption, ref object?
varIn, ref object varOut, ref bool handled)
? ? ? ? {
? ? ? ? ? ? handled = false;
? ? ? ? ? ? if(executeOption == vsCommandExecOption.vsCommandExecOptionDoDefault)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? if(commandName == "MyHeadeAddin.Connect.MyHeadeAddin")
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? //此處添加自己的邏輯代碼
? ? ? ? ? ? ? ? ? ? MainForm mainF = new MainForm();
? ? ? ? ? ? ? ? ? ? mainF.applicationObject = _applicationObject;
? ? ? ? ? ? ? ? ? ? mainF.Show();
? ? ? ? ? ? ? ? ? ? handled = true;
? ? ? ? ? ? ? ? ? ? return;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
第六步 運(yùn)行調(diào)試
運(yùn)行后會(huì)打開(kāi)一個(gè)新的VS2010,在工具菜單中會(huì)多出一個(gè)我們自己外接程序的菜單
點(diǎn)擊這個(gè)按鈕,我們創(chuàng)建的窗口就會(huì)彈出來(lái)了!
至于其他操作,就可以在這個(gè)MainForm的基礎(chǔ)上進(jìn)行了。
對(duì)VS2010 IDE的一些操作主要圍繞DTE2的applicationObject實(shí)例對(duì)象來(lái)進(jìn)行。
?DTE2的命名空間是EnvDTE80。
關(guān)于EnvDTE的說(shuō)明http://technet.microsoft.com/zh-cn/envdte(it-it).aspx
EnvDTE 是包含 Visual Studio 內(nèi)核自動(dòng)化的對(duì)象和成員的用程序集包裝的 COM 庫(kù)。?
在 EnvDTE80、EnvDTE90、 EnvDTE90a 和 EnvDTE100 命名空間中包含更改和新功能。添加對(duì)?
EnvDTE.dll 的程序集引用時(shí),您還必須將程序集的 “嵌入互操作類(lèi)型”屬性設(shè)置為 false。
最后,如果要在其他計(jì)算機(jī)上使用,只需要將.AddIn和生成的.dll文件放到 文檔目錄下的\Visual?
Studio 2010\Addins\目錄中即可,如圖:
第一次接觸插件開(kāi)發(fā),還是從我的一個(gè)師哥那接觸的。
插件下載地址:http://files.cnblogs.com/zsmhhfy/HeadAddins.rar
另外參考:http://technet.microsoft.com/zh-cn/magazine/80493a3w.aspx
========
VS插件開(kāi)發(fā) - 個(gè)性化VS IDE編輯器
http://www.cnblogs.com/LonelyShadow/p/3964879.html之前發(fā)了一篇《個(gè)性化VS - 登錄身份驗(yàn)證》的文章,看到大家都在關(guān)注VS全屏背景插件的制作,所以就
抽了個(gè)時(shí)間發(fā)了這篇文章。
我也是剛開(kāi)始關(guān)注VS插件制作的,這個(gè)全屏的東西也是參考網(wǎng)上前輩們的相關(guān)知識(shí)慢慢寫(xiě)出來(lái)的,水平
不好,還請(qǐng)見(jiàn)諒。
之前的默認(rèn)的VS界面:
主題也只有默認(rèn)的兩三個(gè),而且不能自定義添加:
這距離我們的目標(biāo),自定義主題、背景、透明等等,感覺(jué)貌似相差甚遠(yuǎn):
其實(shí),整體步驟非常簡(jiǎn)單,大家想一下:我們不能直接去設(shè)置更改VS的東西,但是VS不是有一個(gè)插件的
功能么?
那我們能不能自己寫(xiě)一個(gè)插件,來(lái)設(shè)置VS的相關(guān)功能,最后實(shí)現(xiàn)這個(gè)效果呢?答案是:那是必須的。呵
呵。
大概步驟如下:
1.創(chuàng)建VS插件項(xiàng)目,在啟動(dòng)時(shí)讀取指定圖片資源,填充VS的IDE編輯器
2.使用現(xiàn)有插件設(shè)置相應(yīng)模塊的透明色
具體步驟如下:
【一、準(zhǔn)備工作】
VS提供了一個(gè)“Visual Studio Package”項(xiàng)目的模板,我們可以根據(jù)這個(gè)模板,創(chuàng)建一個(gè)VS的插件
項(xiàng)目,以此開(kāi)發(fā)相應(yīng)的插件。
但是這個(gè)項(xiàng)目模板有的Visual Studio安裝包中并沒(méi)有默認(rèn)附帶,需要另行下載。
我使用的是VS2012,自帶默認(rèn)就有,VS2013自測(cè)沒(méi)有,VS2010貌似也有 以前用的記不清了,如果沒(méi)
有這個(gè)模板需要另行下載,其他版本大家自己看看。
“新建項(xiàng)目 - 模板 - 其他項(xiàng)目類(lèi)型 - Visual Studio Package”:
如果你發(fā)現(xiàn)你的VS新建項(xiàng)目中,在模板列表中找不到“Visual Studio Package”,大家可以去搜索
或直接微軟官網(wǎng)軟件下載找“Visual Studio SDK ****”,****表示你的VS版本,不同版本的VS,SDK不
同。
下載后,是在線(xiàn)安裝程序,大概也就十幾M,在線(xiàn)安裝的SDK大小也就一百多M,非常快。(安裝注意
最好關(guān)閉VS哦。)
安裝成功后,你打開(kāi)VS,新建項(xiàng)目,就可以看到這個(gè)項(xiàng)目模板了。
【二、新建項(xiàng)目】
打開(kāi)VS - “新建項(xiàng)目 - 其他項(xiàng)目類(lèi)型 - Visual Studio Package”,項(xiàng)目名稱(chēng)隨意,比如我
的“Guying.Package.IDEBackground”:
然后確定:
下一步,開(kāi)發(fā)語(yǔ)言選擇你的,在這里我當(dāng)然選擇“Visual C#”啦,哈哈,下面的默認(rèn)就O了:
下一步,輸入公司名稱(chēng)、插件名稱(chēng)、版本號(hào)、指定Icon圖標(biāo)、插件說(shuō)明信息:
下一步,什么都別選:
下一步,不要測(cè)試項(xiàng)目:
最后點(diǎn)擊Finish完成,項(xiàng)目就創(chuàng)建完成了:
【三、編寫(xiě)插件代碼】
找到項(xiàng)目中插件的.cs文件“****Package.cs”:
這個(gè)文件就好比“控制臺(tái)項(xiàng)目”中的“Program.cs”,對(duì),插件運(yùn)行時(shí),會(huì)啟動(dòng)這個(gè)代碼文件。
我們只需要在這個(gè)文件中,插入修改Visual Studio IDE的代碼即可。
起初的“***Package.cs”文件中,去掉注釋后,只有如下代碼:
?起始的“****Package.cs”文件的代碼
?
我們可以發(fā)現(xiàn),包含兩個(gè)函數(shù):一個(gè)無(wú)參構(gòu)造和“Initialize()”方法,這個(gè)就不用我介紹了吧,
大家都懂的。?
在這里,我需要說(shuō)的是,可能大家細(xì)心的已經(jīng)發(fā)現(xiàn)了,你在這個(gè)項(xiàng)目中新建窗體,顯示的是WPF的應(yīng)
用程序。
是的,不僅僅是Vista系統(tǒng),Visual Studio也是用WPF來(lái)開(kāi)發(fā)UI的。
那我們是不是也可以在這個(gè)WPF插件項(xiàng)目中來(lái)控制VS呢?哈哈。。
①添加需要的WPF等DLL組件引用:
Microsoft.VisualStudio.CoreUtility.dll
Microsoft.VisualStudio.Text.UI.dll
Microsoft.VisualStudio.Text.UI.Wpf.dll
PresentationCore.dll
PresentationFramework.dll
System.ComponentModel.Composition.dll
System.Xaml.dll
WindowsBase.dll
②然后,我們回到“****Package.cs”文件中,找到“Initialize()”初始化的方法中,為當(dāng)前啟
動(dòng)程序(也就是咱們運(yùn)行的Visual Studio的實(shí)例)的主窗口添加Loaded事件:
?為當(dāng)前啟動(dòng)程序(Visual Studio)的主窗口添加Loaded事件“MainWindow_Loaded”
?
③然后,當(dāng)然,編寫(xiě)上面添加的這個(gè)“MainWindow_Loaded”的方法,讀取指定的圖片資源,填充到
Visual Studio IDE編輯器中:
?讀取指定的圖片資源,填充到Visual Studio IDE編輯器中
?
在這一步,你可以自我發(fā)揮,比如用上IO流,讀取一個(gè)配置文件,獲取配置數(shù)據(jù),動(dòng)態(tài)顯示等等。
是吧。。。。哈哈。
④為了方便調(diào)試,請(qǐng)?jiān)凇?***Package.cs”文件的類(lèi)聲明上加上如下屬性定義:
?添加屬性定義
?
⑤緊接著,新建一個(gè)類(lèi)文件“EditorBackground.cs”,參考代碼如下,親們復(fù)制的時(shí)候,注意我的
命名空間和你的是不是一樣的哦:
?EditorBackground.cs
⑥最后,大家找到項(xiàng)目中的“source.extension.vsixmanifest”文件并打開(kāi),找到上面的“Assets
”,點(diǎn)擊右邊的“New”:
Type選擇“Microsoft.VisualStudio.MefComponent”
Source選擇一個(gè)現(xiàn)有的項(xiàng)目
Project就選擇當(dāng)前這個(gè)插件項(xiàng)目即可
(例如下圖:)
⑦然后OK、大家生成項(xiàng)目,進(jìn)入項(xiàng)目的“bin\debug”文件夾,找到生成的插件,關(guān)掉VS,雙擊安裝
即可:
最后打開(kāi)VS,瞅瞅,如果VS啟動(dòng)異常報(bào)錯(cuò),閃退等,如果指定的圖片資源存在,則表示你的插件有
問(wèn)題了,請(qǐng)運(yùn)行“devenv.exe /safemode”卸載掉剛剛這個(gè)插件就行了。
【四、設(shè)置模塊透明】
打開(kāi)VS如果沒(méi)問(wèn)題的話(huà),你會(huì)發(fā)現(xiàn)是這個(gè)樣子:
沒(méi)錯(cuò),你可能已經(jīng)看到了,VS的背景已經(jīng)發(fā)生變化了,被我們指定的圖片填充背景了。
但是,VS的模塊還沒(méi)有,這怎么辦?
當(dāng)然,還是通過(guò)插件設(shè)置他們的顏色啊。
但是VS默認(rèn)主題顏色是不能隨便更改的,怎么辦?難道還要再寫(xiě)一個(gè)主題換膚的插件?!
當(dāng)然不用,這個(gè)插件已經(jīng)開(kāi)發(fā)出來(lái)了,大家可以打開(kāi)VS直接在線(xiàn)安裝。
打開(kāi)VS - “工具 - 擴(kuò)展和更新 - 聯(lián)機(jī)”,右上角搜索“Theme”,找到類(lèi)似這個(gè)名字的點(diǎn)擊下載
安裝即可:“Visual Studio 2012 Color Theme Editor”:
安裝后提示重啟VS,重啟后你會(huì)發(fā)現(xiàn)“工具”里可以設(shè)置主題配色了:
在這里我們可以選擇提供的幾套配色主題,當(dāng)然我們也可以自己點(diǎn)擊“Customize Colors”新建自
己的主題:
左邊選擇基于哪種現(xiàn)有配色創(chuàng)建新主題,然后下面輸入主題名稱(chēng),點(diǎn)擊Create即可:
然后你會(huì)很雞凍的發(fā)現(xiàn),VS每個(gè)部分的顏色都可以修改了,而且可以修改透明度:
大家自己按照自己喜歡的修改吧。
找不到的模塊沒(méi)法改的什么的,可以直接留言郵箱,我把我配置好東西的發(fā)給大家。
點(diǎn)擊下面的“Import Theme”導(dǎo)入我發(fā)過(guò)去的主題即可:
最后效果如下:
========
NPAPI插件開(kāi)發(fā)詳細(xì)記錄:用VS2010開(kāi)發(fā)NPAPI插件步驟
http://blog.csdn.net/shangbolei/article/details/52457628前面一段時(shí)間關(guān)注了用firebreath開(kāi)發(fā)插件,但是感覺(jué)用起來(lái)不是那么得心應(yīng)手,還是回到NPAPI開(kāi)發(fā)插
件上來(lái)。
本文根據(jù)NPAPI開(kāi)發(fā)詳解,Windows版進(jìn)行開(kāi)發(fā),其中以VS2008為例進(jìn)行開(kāi)發(fā),在VS2010中基本上是相同
的。
必須的plugin sdk,將其解壓到某個(gè)目錄下,我這里是:D:\Users\zcf\Documents\My Program\2012。
下面是創(chuàng)建插件的步驟:
1、創(chuàng)建項(xiàng)目
名稱(chēng)一定要以np開(kāi)頭,為了將來(lái)適應(yīng)不同操作系統(tǒng),最好全小寫(xiě),不要太長(zhǎng),盡量控制在8字符內(nèi)。本例
定義為npmedia
位置指定到~plugin\sdk\samples
點(diǎn)擊確定、下一步。選擇dll、空項(xiàng)目:
點(diǎn)擊完成,即建立好了一個(gè)空項(xiàng)目。如下圖:
2、添加必要文件
首先,添加NPAPI SDK中的Common文件,共三個(gè):
然后添加def文件:
編輯npdemo.def為:
[cpp] view plaincopy?
LIBRARY "npmedia" ?
??
EXPORTS ?
NP_GetEntryPoints @1 ?
NP_Initialize @2 ?
NP_Shutdown @3 ?
接著添加資源文件:
自動(dòng)生成了resource.h和npdemo.rc。接著修改rc文件:
在圖中的BLOCK內(nèi)添加。注意!BLOCK 一定要為"040904e4"
VALUE "MIMEType", "application/media-plugin"
注意:有很多朋友反映按照本文的方法做出的插件在chrome中無(wú)法識(shí)別,問(wèn)題就在于此處,將下一個(gè)字
段改為如下形式就可以了:
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1252
END
這里補(bǔ)充一點(diǎn):BLOCK ?"040904e4"與后面VALUE "Translation", 0x409, 1252的含義是對(duì)應(yīng)的,1252的
十六進(jìn)制表示就是4e4.Translation字段的第一個(gè)值表示語(yǔ)言409表示英語(yǔ),而默認(rèn)的804表示中文(簡(jiǎn)體)
。Translation字段的第二個(gè)值表示所采用的字符集,1200(0X04B0)表示unicode,1252(0X04E4)表示
多字節(jié)字符集,請(qǐng)參考:http://msdn.microsoft.com/zh-
cn/library/windows/desktop/aa381057%28v=vs.85%29.aspx。對(duì)于用中文環(huán)境開(kāi)發(fā)來(lái)講既可以用409(
英語(yǔ))也可以用804(中文)
BLOCK 的值對(duì)于firefox必須是 "040904e4",有朋友提到在chrome中這個(gè)BLOCK 的值可以是"080404e4"
如果要支持chrome則字符集應(yīng)設(shè)置為1252(0X04E4)如要及支持firefox又支持chrome,保險(xiǎn)的做法是
BLOCK ?"040904e4"對(duì)應(yīng)"Translation", 0x409, 1252。
3、添加Plugin實(shí)現(xiàn)類(lèi)
類(lèi)名可以隨便命名,但是必須繼承自nsPluginInstanceBase。
編輯Plugin.h:
#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、修改項(xiàng)目屬性
字符集選擇為多字節(jié)字符(不是必須的),下面添加包含文件:5、編譯調(diào)試完成了上述設(shè)置就可以進(jìn)行編譯調(diào)試了。這是整個(gè)項(xiàng)目的結(jié)構(gòu):生成該項(xiàng)目之后,可以在項(xiàng)目的Debug目錄下找到dll文件,這里是npmedia.dll。可以寫(xiě)注冊(cè)表注冊(cè)這個(gè)dll,也可以將這個(gè)dll復(fù)制到用來(lái)測(cè)試插件的Firefox的profile目錄下的plugins(沒(méi)有則自行創(chuàng)建)文件夾中。寫(xiě)注冊(cè)表的方式:運(yùn)行regedit,在HKEY_LOCAL_MACHINE\SOFTWARE\MozillaPlugins下建立一個(gè)子項(xiàng),可隨意命名:這里以@zcf.com/media為例,新建字符串項(xiàng)Path,其值為生成的dll的路徑:注意,這種方式在XP系統(tǒng)下測(cè)試通過(guò),在WIN7系統(tǒng)下沒(méi)有成功(注意:win764位應(yīng)運(yùn)行 %windir%\SysWOW64\Regedit.exe,打開(kāi)的就是64注冊(cè)表,可以在HKEY_LOCAL_MACHINE\SOFTWARE\MozillaPlugins下看到很多64位版本的插件,多謝網(wǎng)友 Jearol 告知)。還有一種方式就是設(shè)置項(xiàng)目屬性,將輸出目錄指定為用來(lái)調(diào)試的Firefox相應(yīng)profile目錄下的plugins目錄。這樣就不用每次生成之后來(lái)回復(fù)制dll。如下圖:然后在Firefox地址欄中輸入about:plugins就可以看到我們的插件了。測(cè)試頁(yè)面可以如下:測(cè)試文件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> ?關(guān)于調(diào)試插件:首先用Firefox打開(kāi)測(cè)試頁(yè)面,然后在VS2010中需要的地方設(shè)置斷點(diǎn),接著選擇調(diào)試/附加到進(jìn)程在彈出的對(duì)話(huà)框中選擇plugin-container.exe,可能不止一個(gè),注意根據(jù)其路徑選擇正確的那個(gè)。最后刷新測(cè)試頁(yè)面就可以在你設(shè)置的斷點(diǎn)的地方斷下,進(jìn)行調(diào)試。下一篇文章會(huì)有一個(gè)簡(jiǎn)單的實(shí)例展示這個(gè)調(diào)試過(guò)程。========3DsMax導(dǎo)出插件編寫(xiě)(一)——vs2010和3dsmax2011(64位)的配置方法 ?
http://liweizhaolili.blog.163.com/blog/static/162307442013117731953/?作為3D開(kāi)發(fā)人員,特別是3D引擎開(kāi)發(fā)人員,經(jīng)常會(huì)接觸到各種三維模型的數(shù)據(jù)。雖然說(shuō)3dsmax已經(jīng)可以導(dǎo)出很多格式的模型,不過(guò)總是不一定合適自己用。所以總有一種想自己寫(xiě)一個(gè)導(dǎo)出插件,讓3dmax導(dǎo)出自己想要的數(shù)據(jù)格式。這里為大家介紹一下怎樣為3dmax寫(xiě)導(dǎo)出插件的第一步:怎樣配置vs和maxSdk。這里你需要的東西有兩個(gè):1、一個(gè)完整版的3dsMax。2、一個(gè)VisualStudio。為什么是要完整版的3dsMax呢?這是因?yàn)橥暾姹镜?dsMax的安裝文件自帶有maxSdk。這是很重要的。不同版本的3dsMax,帶的sdk會(huì)不一樣。你拿了其他版本的sdk做了的插件,不一定適合你當(dāng)前的3dsmax使用的。很多人寫(xiě)這個(gè)配置教程,會(huì)告訴你上網(wǎng)去找maxSdk。其實(shí)不需要這么麻煩的。下面會(huì)告訴大家怎樣安裝。我這里拿的是我當(dāng)前使用的3dsMax2011的64位版來(lái)做示范。其他的版本做法是一樣的。那么VisualStudio有什么要求呢?有些人寫(xiě)的教程會(huì)告訴你,每個(gè)版本的max的sdk會(huì)對(duì)應(yīng)不同版本的vs,最好對(duì)應(yīng)。這樣說(shuō)也不算錯(cuò)。不過(guò)其實(shí)這個(gè)對(duì)應(yīng)關(guān)系沒(méi)那么嚴(yán)格的,我下面會(huì)告訴大家怎樣跨版本配置。比如max2011的sdk對(duì)應(yīng)的是vs2008,我下面將會(huì)用vs2010來(lái)配置。好,把上面2樣?xùn)|西準(zhǔn)備好之后,3dsmax正常安裝,vs也正常安裝,準(zhǔn)備工作就完成了,接下來(lái)阿趙和大家就一起來(lái)裝這個(gè)maxSdk:運(yùn)行完整版本的3dsMax安裝文件,會(huì)看到以下界面,我們選擇“安裝工具和實(shí)用程序”:使用vs2010為3dsmax2011(64位)寫(xiě)導(dǎo)出插件——配置方法- 阿趙 - 有爪的小羔羊阿趙?在這里選擇需要安裝的工具,我們需要的是3ds max 2011的sdk:使用vs2010為3dsmax2011(64位)寫(xiě)導(dǎo)出插件——配置方法 - 阿趙 - 有爪的小羔羊阿趙?安裝完之后,會(huì)在安裝目錄找到一個(gè)howto文件夾,里面有個(gè)3dsmaxPluginWizard文件夾,在里面有個(gè)readme.txt文檔,文檔里面說(shuō)明了怎么去配置這個(gè)sdk的。其實(shí)在安裝完之后,我們可以把這個(gè)maxsdk的文件夾隨便的移動(dòng)到我們想要的地方的。不過(guò)在配置之前,最好先移動(dòng)好,開(kāi)始配置之后,就別動(dòng)這個(gè)文件夾的路徑了。使用vs2010為3dsmax2011(64位)寫(xiě)導(dǎo)出插件——配置方法- 阿趙 - 有爪的小羔羊阿趙?在配置之前,這個(gè)文件夾的屬性是只讀的,我們先把整個(gè)文件夾的只讀取消,然后開(kāi)始配置:使用記事本打開(kāi)同文件夾下的3dsmaxPluginWizard.vsz,然后找到下圖用紅線(xiàn)下劃的地方。默認(rèn)的Wizard=VsWizardEngine.9.0,代表的是對(duì)應(yīng)vs2008版本。我現(xiàn)在需要使用2010版本,所以把它改成了10.0然后下面的ABSOLUTE_PATH改成當(dāng)前的3dsmaxPluginWizard文件夾的路徑:使用vs2010為3dsmax2011(64位)寫(xiě)導(dǎo)出插件——配置方法- 阿趙 - 有爪的小羔羊阿趙?改完之后,我們把3dsmaxPluginWizard文件夾下的這三個(gè)文件復(fù)制:使用vs2010為3dsmax2011(64位)寫(xiě)導(dǎo)出插件——配置方法 - 阿趙 - 有爪的小羔羊阿趙?然后找到vs2010的安裝文件夾,找到VC/vcprojects文件夾,把剛才復(fù)制的三個(gè)文件放到這個(gè)文件夾下:使用vs2010為3dsmax2011(64位)寫(xiě)導(dǎo)出插件——配置方法 - 阿趙 - 有爪的小羔羊阿趙?然后我們就可以打開(kāi)vs2010,創(chuàng)建新項(xiàng)目。這時(shí)候會(huì)在c++項(xiàng)目里面看到了3dsmax插件的類(lèi)別,選擇它,然后在下面的項(xiàng)目名稱(chēng)和路徑里面輸入自己想要的名字和路徑。使用vs2010為3dsmax2011(64位)寫(xiě)導(dǎo)出插件——配置方法- 阿趙 - 有爪的小羔羊阿趙?如果你之前的配置正確,將會(huì)彈出設(shè)置向?qū)?#xff0c;如果沒(méi)有彈出,則要檢查之前的步驟了。我們選擇File?Export:使用vs2010為3dsmax2011(64位)寫(xiě)導(dǎo)出插件——配置方法 - 阿趙 - 有爪的小羔羊阿趙?這里是插件的詳情,直接下一步就行:使用vs2010為3dsmax2011(64位)寫(xiě)導(dǎo)出插件——配置方法 - 阿趙 - 有爪的小羔羊阿趙?這里是項(xiàng)目詳情,第一項(xiàng)輸入maxsdk的路徑,第二項(xiàng)輸入插件想輸出的路徑,比如3dsmax安裝目錄的plugins文件夾,第三項(xiàng)輸入需要調(diào)試的3dsmax的安裝目錄。三項(xiàng)都是可以在項(xiàng)目建立之后修改的。使用vs2010為3dsmax2011(64位)寫(xiě)導(dǎo)出插件——配置方法- 阿趙 - 有爪的小羔羊阿趙按finish后,由于這個(gè)版本的sdk對(duì)應(yīng)的是vs2008,現(xiàn)在我用的是2010,所以有一個(gè)轉(zhuǎn)換版本的過(guò)程使用vs2010為3dsmax2011(64位)寫(xiě)導(dǎo)出插件——配置方法 - 阿趙 - 有爪的小羔羊阿趙?這時(shí)候,項(xiàng)目應(yīng)該已經(jīng)創(chuàng)建成功。如果沒(méi)有創(chuàng)建成功,則檢查之前的步驟。通常是因?yàn)?dsmaxPluginWizard.vsz里面的vs版本設(shè)置錯(cuò)誤。如果創(chuàng)建成功后,我們?cè)诮鉀Q方案資源管理器里面找到你的項(xiàng)目的cpp,打開(kāi)。使用vs2010為3dsmax2011(64位)寫(xiě)導(dǎo)出插件——配置方法- 阿趙 - 有爪的小羔羊阿趙??在cpp里面,修改Ext方法里面的返回,這里是你導(dǎo)出的模型的格式后綴名,這里我是改成了”azhao“,再改ShortDesc方法里面的返回,這里是模型的描述,我改成了”阿趙的模型格式“。使用vs2010為3dsmax2011(64位)寫(xiě)導(dǎo)出插件——配置方法 - 阿趙 - 有爪的小羔羊阿趙?現(xiàn)在按調(diào)試,會(huì)彈出錯(cuò)誤:使用vs2010為3dsmax2011(64位)寫(xiě)導(dǎo)出插件——配置方法 - 阿趙 - 有爪的小羔羊阿趙?這是因?yàn)檎{(diào)試的目標(biāo)沒(méi)有設(shè)置正確,可以找到項(xiàng)目屬性修改:使用vs2010為3dsmax2011(64位)寫(xiě)導(dǎo)出插件——配置方法- 阿趙 - 有爪的小羔羊阿趙?在配置屬性里面的調(diào)試,修改命令項(xiàng)為你的3dsmax.exe路徑:使用vs2010為3dsmax2011(64位)寫(xiě)導(dǎo)出插件——配置方法 - 阿趙 - 有爪的小羔羊阿趙按道理,現(xiàn)在我們?cè)匍_(kāi)始調(diào)試,你的3dsmax就會(huì)啟動(dòng)了。如果你是為32位的3dsmax做配置,那么整個(gè)配置過(guò)程已經(jīng)完成了。但我這里3dsmax啟動(dòng)后報(bào)錯(cuò)了,這是因?yàn)槲业?dsmax是64位的,剛才調(diào)試生成的32位插件不能用。使用vs2010為3dsmax2011(64位)寫(xiě)導(dǎo)出插件——配置方法 - 阿趙 - 有爪的小羔羊阿趙?接下來(lái)我們將要把項(xiàng)目改成64位的。先打開(kāi)項(xiàng)目屬性,在配置管理器里面,把Win32改成x64:使用vs2010為3dsmax2011(64位)寫(xiě)導(dǎo)出插件——配置方法- 阿趙 - 有爪的小羔羊阿趙?改完之后,之前我們的所有配置都沒(méi)了,需要逐個(gè)去配置:先配置調(diào)試程序路徑:使用vs2010為3dsmax2011(64位)寫(xiě)導(dǎo)出插件——配置方法 - 阿趙 - 有爪的小羔羊阿趙?然后配置輸出路徑使用vs2010為3dsmax2011(64位)寫(xiě)導(dǎo)出插件——配置方法 - 阿趙 - 有爪的小羔羊阿趙?配置生成程序數(shù)據(jù)庫(kù)文件的路徑使用vs2010為3dsmax2011(64位)寫(xiě)導(dǎo)出插件——配置方法 - 阿趙 - 有爪的小羔羊阿趙?好了,64位修改完成,我們?cè)俅芜M(jìn)行調(diào)試,3dsmax應(yīng)該就能正常打開(kāi)了。我們隨便在場(chǎng)景里面建立一個(gè)茶壺,然后導(dǎo)出。現(xiàn)在我們可以在選擇導(dǎo)出格式的地方,找到我們剛才指定的格式了,就是”阿趙的模型格式“,后綴名是”azhao“。使用vs2010為3dsmax2011(64位)寫(xiě)導(dǎo)出插件——配置方法- 阿趙 - 有爪的小羔羊阿趙?確定保存,會(huì)打開(kāi)一個(gè)對(duì)話(huà)框,不過(guò)里面都是一些默認(rèn)的東西,沒(méi)有任何內(nèi)容的,因?yàn)槲覀冎皇峭瓿闪伺渲玫牟襟E,沒(méi)有開(kāi)始寫(xiě)導(dǎo)出的實(shí)際內(nèi)容。使用vs2010為3dsmax2011(64位)寫(xiě)導(dǎo)出插件——配置方法 - 阿趙 - 有爪的小羔羊阿趙?在vs里面找到DoExport方法,在里面打一個(gè)斷點(diǎn)。再次去選擇導(dǎo)出我們的格式,vs應(yīng)該就能進(jìn)入斷點(diǎn)了。DoExport方法就是導(dǎo)出方法的入口了。使用vs2010為3dsmax2011(64位)寫(xiě)導(dǎo)出插件——配置方法 - 阿趙 - 有爪的小羔羊阿趙?如果你途中發(fā)現(xiàn)出現(xiàn)問(wèn)題,很有可能是以下幾種問(wèn)題:1、下載的MaxSdk有問(wèn)題,建議使用完整版3dsMax自帶的sdk。2、忘記取消maxSdk文件夾的只讀屬性,這樣在新建項(xiàng)目或者編譯的時(shí)候都會(huì)出錯(cuò)。3、3dsmaxPluginWizard.vsz里面設(shè)置的vs版本不對(duì)。9.0對(duì)應(yīng)的是vs2008,10.0對(duì)應(yīng)的是vs2010,11.0對(duì)應(yīng)的是vs2012.4、調(diào)試的時(shí)候出錯(cuò),有可能是沒(méi)有設(shè)置對(duì)調(diào)試對(duì)象,要設(shè)置為3dsMax的exe。5、調(diào)試的時(shí)候沒(méi)有報(bào)錯(cuò),卻沒(méi)有出現(xiàn)導(dǎo)出的選擇。有可能是導(dǎo)出保存的路徑不對(duì),要保存在3dsmax的安裝路徑里面的插件文件夾,比如plugins或者stdplugs文件夾。6、調(diào)試的時(shí)候3dsmax啟動(dòng)了,但在啟動(dòng)的途中報(bào)錯(cuò)。這有可能是使用的sdk和3dsMax版本不對(duì)應(yīng),或者是32位插件和64位軟件不對(duì)應(yīng)。這個(gè)過(guò)程雖然簡(jiǎn)單,不過(guò)卻會(huì)遇到很多默默奇妙的小問(wèn)題,網(wǎng)上雖然相關(guān)的教程不少,但起碼我自己對(duì)著很多個(gè)教程都沒(méi)有配置成功,所以才把自己的配置過(guò)程記錄下來(lái),希望能給以后需要配置的人一個(gè)參考。========自己動(dòng)手編寫(xiě)一個(gè)VS插件(一)
http://blog.csdn.net/clever101/article/details/8733799? ? ? ? ?最近計(jì)劃開(kāi)發(fā)一個(gè)VS插件來(lái)幫助自己加快開(kāi)發(fā)速度,研究了一下VS的插件開(kāi)發(fā)。下面配合插圖說(shuō)明一下如何開(kāi)發(fā)一個(gè)VS插件。?第一步:創(chuàng)建插件工程,具體如下圖:? ? ? ? ? ?第二步不用干啥,如下圖:? ? ? ?第三步:選擇開(kāi)發(fā)語(yǔ)言,這里我選的是C++/ATL,因?yàn)檫@是我最拿手的,當(dāng)然你也可以選擇C#,這里不建議你選擇C++/CLR,因?yàn)檫@個(gè)幾乎冷僻得沒(méi)人用,一般網(wǎng)上也找不到相關(guān)的例程,如下圖:?第四步選擇調(diào)用程序,第一個(gè)是必選的,第二個(gè)可選可不選,選上也無(wú)妨,如下圖:第五步輸入插件名稱(chēng)和說(shuō)明,如下圖:第六步設(shè)置用戶(hù)界面的調(diào)用方式,這里簡(jiǎn)單設(shè)置為在宿主應(yīng)用程序啟動(dòng)時(shí)加載,如下圖:第七步是填寫(xiě)關(guān)于信息,如下圖:第八步是單擊完成,如下圖:? ? ? ? 由于所生成的插件是一個(gè)com組件,需要注冊(cè)才能使用,因此需要設(shè)置一個(gè)生成后事件:regsvr32$(OutDir)/$(ProjectName).dll,具體如下圖:========自己動(dòng)手編寫(xiě)一個(gè)VS插件(二)——理解OnConnection函數(shù)
http://www.thebigdata.cn/JiShuBoKe/4429.html? ? ? ? ?繼續(xù)開(kāi)發(fā)一個(gè)VS插件。首先認(rèn)識(shí)一下通過(guò)插件向?qū)傻念?lèi)和函數(shù),大致弄清一下它們的含義。創(chuàng)建一個(gè)基于ATL的插件工程,都生成了一個(gè)CConnect類(lèi)。現(xiàn)在我們看看CConnect類(lèi)的一些重要接口:CConnect::OnConnection:這個(gè)接口可以說(shuō)是插件的入口函數(shù)。只是這個(gè)入口函數(shù)會(huì)被調(diào)用幾次,至于何時(shí)調(diào)用取決于這個(gè)函數(shù)的ConnectMode參數(shù)。? ? ?一個(gè)插件有下面幾種加載模式:在VS啟動(dòng)時(shí),并且該插件并標(biāo)記為隨同VS啟動(dòng)時(shí)啟動(dòng)(所謂隨同VS啟動(dòng)時(shí)啟動(dòng)請(qǐng)見(jiàn)圖一),這時(shí)ConnectMode參數(shù)的值為ext_ConnectMode.ext_cm_Startup。圖一在用戶(hù)需要時(shí)時(shí)被調(diào)用,就是說(shuō)該插件并沒(méi)有被標(biāo)記為VS啟動(dòng)時(shí)啟動(dòng)但用戶(hù)手動(dòng)在外接程序管理器上給啟動(dòng)一欄打上勾上時(shí),這時(shí)ConnectMode參數(shù)的值為ext_ConnectMode.ext_cm_AfterStartup。從命令行啟動(dòng)(使用devenv.exe去生成一個(gè)解決方案),這時(shí)ConnectMode參數(shù)的值為ext_ConnectMode.ext_cm_CommandLine。請(qǐng)注意這種情況在一些舊版本的VisualStudio會(huì)有一些bug并且看來(lái)只有在Visual Studio 2008才會(huì)正確運(yùn)行(比VS 2008高的版本應(yīng)該也可以)。當(dāng)插件使用常駐的工具欄、命令欄和按鈕(常駐意味著即使插件沒(méi)有加載用戶(hù)界面也會(huì)出現(xiàn))同時(shí)Visual Studio要求插件去初始化常駐用戶(hù)界面,這時(shí)ConnectMode參數(shù)的值為ext_ConnectMode.ext_cm_UISetup。這種連接模式必須不同于ext_ConnectMode.ext_cm_Startup和ext_ConnectMode.ext_cm_AfterStartup的情況下。假如你建的插件不是一個(gè)一般插件,而是一個(gè)和特定的解決方案相關(guān)的插件,當(dāng)這個(gè)解決方案被加載時(shí),這時(shí)ConnectMode參數(shù)的值為ext_ConnectMode.ext_cm_AfterStartup。?所以,存在兩種模式:ext_ConnectMode.ext_cm_Startup和ext_ConnectMode.ext_cm_AfterStartup。這意味著它們都以相同的方式處理因?yàn)樵谝话闱闆r下插件在VS啟動(dòng)時(shí)自動(dòng)加載還是過(guò)了一些時(shí)候手動(dòng)加載它們并沒(méi)有什么不同。所以你可以使用下面的代碼: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:caseext_cm_AfterStartup:{// 初始化你的插件break;}default:break;}returnhr;}? ? ? ? 然而當(dāng)插件在ext_ConnectMode.ext_cm_Startup模式加載(也就是在Visual Studio啟動(dòng)時(shí)加載),VisualStudio并沒(méi)有完全初始化。所以這是很多插件可以正確初始化,但一些卻會(huì)失敗。比如當(dāng)你的插件加載時(shí)需要顯示一個(gè)工具窗口,當(dāng)插件在VS啟動(dòng)時(shí)加載工具窗口卻并不會(huì)顯示,但在外接程序管理器手動(dòng)加載這個(gè)插件時(shí)可以顯示這個(gè)工具窗口。? ? ? ?所以在VisualStudioz完全初始化之后再調(diào)用OnConnection函數(shù)會(huì)比較好。IDTExtensibility2接口提供了一個(gè)在VisualStudioz完全初始化后會(huì)被調(diào)用的叫OnStartupComplete的方法。所以正確的代碼如下:STDMETHODIMPCConnect::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://什么也不做,因?yàn)閂isual Studio并沒(méi)有完全初始化break;case ext_cm_AfterStartup:{? ? ? ? ? ? OnStartupComplete(NULL);break;}default:break;}returnhr;}========vscode編寫(xiě)插件詳細(xì)過(guò)程
http://blog.csdn.net/libin_1/article/details/51452943之前編寫(xiě)了一個(gè)vscode插件用vscode寫(xiě)博客和發(fā)布,然后有園友要求寫(xiě)一篇來(lái)介紹如何開(kāi)發(fā)一個(gè)vscode擴(kuò)展插件,或者說(shuō)介紹開(kāi)發(fā)這個(gè)插件的過(guò)程。然而文章還沒(méi)有寫(xiě),園子里面已經(jīng)有人發(fā)布一個(gè)文章,是園友上位者的憐憫的VSCODE 插件初探介紹了自己開(kāi)發(fā)的一個(gè)插件與如何簡(jiǎn)單的開(kāi)發(fā)一個(gè)插件。雖然已經(jīng)有這么一個(gè)文章,但是我覺(jué)得還是可以更仔細(xì)的來(lái)介紹如何來(lái)開(kāi)發(fā)一個(gè)vscode插件,也算之前說(shuō)好要寫(xiě)這么一個(gè)文章的一個(gè)承諾吧,于是就有了還這么篇文章。一、開(kāi)發(fā)環(huán)境介紹與安裝為了演示一個(gè)安裝環(huán)境,我安裝了一個(gè)干凈的win10系統(tǒng)來(lái)操作截圖。1.首先我們需要安裝一個(gè)最基本的VisualStudio Code,我們可以先到官網(wǎng)下載一最新版本的來(lái)進(jìn)行安裝,點(diǎn)擊上面的連接,進(jìn)去下載總是懂的吧。下載完后點(diǎn)擊安裝,然后一直下一步安裝就可以。2.安裝完vscode后呢,我們就需要來(lái)看如何開(kāi)發(fā)我們的自己的插件了,參考官方文檔Your First?Extension(Example - Hello World)。根據(jù)文檔我們得知我們需要安裝一個(gè) node.js,同樣的點(diǎn)擊前面的連接,到nodejs的中文網(wǎng)站下載一個(gè)安裝程序,下載完點(diǎn)擊安裝下一步就可以。3.在安裝完上面兩個(gè)工具后,我們還需要一個(gè)生產(chǎn)插件代碼的東西,也就是Yeoman 和 VS Code?Extension generator.Yeoman的介紹不在本文章中,自己點(diǎn)擊上面的連接去了解。我們可以打開(kāi)cmd來(lái)執(zhí)行下面的命令來(lái)安裝這兩個(gè)工具。npm使用介紹npm install -g yo generator-code在完成上面的安裝后,可以通過(guò)輸入命令yo code來(lái)生成我們要的基本代碼。?在os系統(tǒng)上可以通過(guò)用上下鍵來(lái)選擇要?jiǎng)?chuàng)建哪種類(lèi)型的項(xiàng)目,在win可以通過(guò)輸入1、2、3這樣的數(shù)字然后按回車(chē)來(lái)選擇。二、生成基本代碼的講解與簡(jiǎn)單的修改在幾個(gè)項(xiàng)目類(lèi)型中,我們選擇了第一個(gè)TypeScript來(lái)作為我們編寫(xiě)擴(kuò)展的語(yǔ)言,其他幾個(gè)項(xiàng)目類(lèi)型這里不做介紹。TypeScript語(yǔ)法自行理解項(xiàng)目結(jié)構(gòu)介紹我們創(chuàng)建的一個(gè)項(xiàng)目結(jié)構(gòu)如下:選擇創(chuàng)建項(xiàng)目后有四個(gè)輸入和一個(gè)選擇輸入你擴(kuò)展的名稱(chēng)輸入一個(gè)標(biāo)志(項(xiàng)目創(chuàng)建的文件名稱(chēng)用這個(gè))輸入對(duì)這個(gè)擴(kuò)展的描述輸入以后要發(fā)布用到的一名稱(chēng)(和以后再發(fā)布時(shí)候有一個(gè)名字是對(duì)應(yīng)上的)是問(wèn)你要不要?jiǎng)?chuàng)建一個(gè)git倉(cāng)庫(kù)用于版本管理以上幾個(gè)輸入都會(huì)在package.json這個(gè)文件里面有對(duì)應(yīng)的屬性來(lái)表示。輸入完之后就創(chuàng)建了如上圖的一個(gè)目錄結(jié)構(gòu)。這里不要臉的復(fù)制了一下別人的目錄說(shuō)明,由于我這個(gè)項(xiàng)目沒(méi)有讓生成Git倉(cāng)庫(kù),所以沒(méi)有.gitignore 這個(gè)文件。還有node_modules等其他多出來(lái)的目錄結(jié)構(gòu)是創(chuàng)建項(xiàng)目后運(yùn)行 npm install 這個(gè)命令生成出來(lái)的。.├── .gitignore ? ? ? ? ? ? ? ? ?//配置不需要加入版本管理的文件├── .vscode ? ? ? ? ? ? ? ? ? ? // VS Code的整合│ ? ├── launch.json│├── settings.json│ ? └── tasks.json├── .vscodeignore ? ? ? ? ? ? ? ?//配置不需要加入最終發(fā)布到拓展中的文件├── README.md├── src ? ? ? ? ? ? ? ? ? ? ? ? // 源文件│ ? └── extension.ts ? ? ? ? ? ?// 如果我們使用js來(lái)開(kāi)發(fā)拓展,則該文件的后綴為.js├── test ? ? ? ? ? ? ? ? ? ? ? ?// test文件夾│ ? ├── extension.test.ts// 如果我們使用js來(lái)開(kāi)發(fā)拓展,則該文件的后綴為.js│ ? └── index.ts ? ? ? ? ? ? ? ?// 如果我們使用js來(lái)開(kāi)發(fā)拓展,則該文件的后綴為.js├── node_modules│ ? ├── vscode ? ? ? ? ? ? ? ? ?// vscode對(duì)typescript的語(yǔ)言支持。│ ? └── typescript ? ? ? ? ? ? ?// TypeScript的編譯器├── out ? ? ? ? ? ? ? ? ? ? ? ? // 編譯之后的輸出文件夾(只有TypeScript需要,JS無(wú)需)│├── src│ ? | ? ├── extension.js│ ? | ? └── extension.js.map│ ? └── test│ ? ? ? ├── extension.test.js│ ? ? ? ├── extension.test.js.map│ ? ? ? ├── index.js│ ? ? ? └── index.js.map├── package.json ? ? ? ? ? ? ? ?// 該拓展的資源配置文件├── tsconfig.json ? ? ? ? ? ? ?//?├── typings ? ? ? ? ? ? ? ? ? ? // 類(lèi)型定義文件夾│ ? ├── node.d.ts ? ? ? ? ? ? ? // 和Node.js關(guān)聯(lián)的類(lèi)型定義│ ? └── vscode-typings.d.ts ? ? // 和VS Code關(guān)聯(lián)的類(lèi)型定義└── vsc-extension-quickstart.md?運(yùn)行與簡(jiǎn)單修改介紹完目錄結(jié)構(gòu)后,我們可以來(lái)運(yùn)行一下看看效果如果。我們打開(kāi)一個(gè)vscode并把我們的sample目錄自己拖拉到vscode的界面上,然后選擇調(diào)試窗口,并點(diǎn)擊開(kāi)始調(diào)試或者直接按快捷鍵F5項(xiàng)目運(yùn)行起來(lái)后,會(huì)調(diào)用一個(gè)新的vscode窗口在標(biāo)題欄的地方顯示一個(gè)[擴(kuò)展開(kāi)發(fā)主機(jī)]的標(biāo)題,然后這個(gè)窗口是支持我們剛才運(yùn)行的插件項(xiàng)目的命令。我們可以看到擴(kuò)展插件已經(jīng)正常的運(yùn)行了,接下來(lái)我們可以來(lái)簡(jiǎn)單修改一下代碼以實(shí)現(xiàn)不同的簡(jiǎn)單功能。在修改之前需要簡(jiǎn)單的認(rèn)識(shí)兩個(gè)文件package.json? ?{? ? "name": "sample", ? ? ? ? ? ? ?//插件擴(kuò)展名稱(chēng)(對(duì)應(yīng)創(chuàng)建項(xiàng)目時(shí)候的輸入)? ? "displayName": "sample",? ? "description": "blogsample", ?//插件擴(kuò)展的描述(對(duì)應(yīng)創(chuàng)建項(xiàng)目時(shí)候的輸入)? ? "version": "0.0.1",? ? "publisher": "caipeiyu", ? ? ? //發(fā)布時(shí)候的一個(gè)名稱(chēng)(對(duì)應(yīng)創(chuàng)建項(xiàng)目時(shí)候的輸入)? ? "engines": {? ? ? ? "vscode": "^0.10.10"? ? },? ? "categories": [? ? ? ? "Other"? ? ],? ? "activationEvents": [ ? ? ? ? ?//這是我們要理解的地方,是觸發(fā)插件執(zhí)行一些代碼的配置?"onCommand:extension.sayHello" //這種是通過(guò)輸入命令來(lái)觸發(fā)執(zhí)行的? ? ],? ? "main": "./out/src/extension", ?//這個(gè)是配置TypeScript編譯成js的輸出目錄? ? "contributes": {? ? ? ? "commands": [{ ? ? ? ? ? ? //title 和 command是一個(gè)對(duì)應(yīng)關(guān)系的? ? ? ? ? ? "command": "extension.sayHello", //這個(gè)是對(duì)應(yīng)上面那個(gè)命令觸發(fā)的,在代碼里面也要用到?"title": "Hello World" ? //這個(gè)是我們?cè)趘scode里面輸入的命令? ? ? ? }]? ? },? ? "scripts": { ? ? ? ? ? ? ? ? ? ? //是在發(fā)布打包,或者其他運(yùn)行時(shí)候,要執(zhí)行的一些腳本命令? ? ? ? "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": { ? ? ? ? ? //這是開(kāi)發(fā)的依賴(lài)包,如果有其他的依賴(lài)包,并要打包的話(huà),需要把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 firsttime 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 extensionis 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 mustmatch the command field in package.json? ? let disposable = vscode.commands.registerCommand('extension.sayHello', () => {? ? ? ? //只看這個(gè)地方'extension.sayHello'和 package.json 里面的?"onCommand:extension.sayHello" 是一個(gè)對(duì)應(yīng)關(guān)系? ? ? ? // The code you place here will beexecuted 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 isdeactivated? ? export function deactivate() {? ? }? ??這兩個(gè)文件是很重要的,基本整個(gè)插件編寫(xiě)都是圍繞著這兩個(gè)文件來(lái)修改的,例如我們現(xiàn)在要增加多一個(gè)命令叫做 Hello Sample 那么我們先在 package.json 里面添加兩個(gè)配置..."activationEvents": [? ? "onCommand:extension.sayHello",? ? "onCommand:extension.saySample"],"contributes":{? ? "commands": [{? ? ? ? "command": "extension.sayHello",? ? ? ? "title": "Hello World"? ? },{? ? ? ? "command": "extension.saySample",? ? ? ? "title": "Hello Sample"? ? }]},?... ? ? ?添加完這兩個(gè)配置后,我們就需要在 extension.ts 里來(lái)注冊(cè)這個(gè)命令事件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);修改完代碼后,再次運(yùn)行效果如下圖三、打包與發(fā)布我們編寫(xiě)完一個(gè)插件,總不能要用的時(shí)候來(lái)運(yùn)行代碼然后來(lái)使用吧,而且要分享給別人也不方便啊。有個(gè)很low的辦法,就是拷貝項(xiàng)目到插件目錄,但是這不靠譜吧。所以我們需要一個(gè)打包工具叫 vsce 同樣的可以用npm來(lái)安裝,打開(kāi)cmd執(zhí)行命令npm install -g vsce安裝完成后可以用命令窗口 cd 到你的項(xiàng)目目錄下去,然后執(zhí)行命令vsce publish來(lái)發(fā)布到marketplace.visualstudio.com上面去。發(fā)布成功后可以在vscode里面用 ext install 來(lái)按這個(gè)插件。這種做法我個(gè)人覺(jué)得特別的麻煩,還需要去配置一個(gè)token,然后這個(gè)token還的找個(gè)地方記住,還會(huì)過(guò)期,而且在發(fā)布過(guò)程中還得祈禱網(wǎng)絡(luò)好。所以這里不介紹,有興趣的自己看這里。那么這里來(lái)介紹一個(gè)打包成.vsix 的插件,而且這個(gè)插件也可以通過(guò)這個(gè)頁(yè)面上傳分享。cd到項(xiàng)目目錄下,然后執(zhí)行命令 vsce package 來(lái)打包一個(gè)vsce packageExecuting prepublish script 'node ./node_modules/vscode/bin/compile'...Created: /sample/sample-0.0.1.vsix我們可以看到執(zhí)行了這個(gè)命令后,再執(zhí)行一個(gè) script 'node ./node_modules/vscode/bin/compile' 這個(gè)命令是在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"},執(zhí)行完之后再創(chuàng)建了一個(gè)sample-0.0.1.vsix,這個(gè)就是我們打包好的插件安裝包了,只要把這個(gè)直接拖到vscode的窗口上,就會(huì)提示你安裝成功重啟vscode,我們重啟完之后就使用相關(guān)的命令。而且在插件的目錄下也多了對(duì)應(yīng)sample的目錄。========總結(jié)
以上是生活随笔為你收集整理的VS2010插件编写学习总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ORACLE锁学习总结
- 下一篇: Win32 汇编子过程总结