VS2010插件编写学习总结

VS2010 Addins 外接程序(插件)开发

http://www.cnblogs.com/Leo_wl/archive/2013/03/21/2973886.html
简单做了一个添加文件头注视的插件,算作是学习。
首先看一下界面
外接程序是在 Visual Studio 集成开发环境 (IDE) 中运行的已编译的 DLL。 编译可以保护知识产权和
提高性能。 虽然可以手动创建外接程序,但使用“外接程序向导”更为简便。 此向导创建一个功能全
面但却很基本的外接程序,创建完该程序后可立即运行它。 “外接程序向导”生成基本的空程序后,可
向其添加代码并对其进行自定义。
“外接程序向导”让您可以为外接程序提供显示名称和说明。 这两项内容都将出现在“外接程序管理器
”中。 还可以选择让向导生成代码,用于向“工具”菜单中添加可打开外接程序的命令。您也可以选择
为外接程序显示一个自定义“关于”对话框。 向导完成时,将生成只有一个类的新项目(名为 Connect
),该项目实现外接程序。

第一步 创建解决方案
  这里使用的是VS2010 、C#、WinForm
  文件→新建→项目→其他项目类型→扩展性→Visual Studio 外接程序,修改名称、位置、解决方
案名称等信息,点击确定

第二步 根据外接程序想道创建项目
  当然,你如果已经是高手了,可以不用使用向导创建 项目。

  如图

  下一步,选择使用C#创建外接程序
  下一步,选择使用应用程序主机,有两个选项,Microsoft Visual Studio 2010 和Microsoft 
Visual Studio 2010 Macros(宏),两个都勾选
  下一步,填写外界程序名称和说明
  下一步,在选择外接程序选项中,在“是否为外接程序创建命令栏用户界面?”中勾选“是的,创
建工具菜单项“,向导会为你在工具菜单中创建一个菜单
  下一步,关于信息,根据需要勾选是否生成关于对话框
  下一步,完成

  这样系统向导就为你创建了一个项目,并且生成了一个Connect类,实现IDTExtensibility2和
IDTCommandTarget接口

第三步 创建一个窗口
  在项目上,右键,添加一个WinForm窗口,我在这里命名为MainForm
第四步 在MainForm类中添加application对象  
///
        /// application对象
        ///

        private DTE2 _applicationObject;

        ///
        /// 
        ///

        public DTE2 applicationObject 
        {
            get { return _applicationObject; }
            set { this._applicationObject = value; }
        }

第五步 显示这个创建的窗口
  在Connect类中找到public void Exec(string commandName, vsCommandExecOption 
executeOption, ref object varIn, ref object varOut, ref bool handled)这个方法  
/// 实现 IDTCommandTarget 接口的 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;
                }
            }
        }

第六步 运行调试
  运行后会打开一个新的VS2010,在工具菜单中会多出一个我们自己外接程序的菜单
  点击这个按钮,我们创建的窗口就会弹出来了!
  至于其他操作,就可以在这个MainForm的基础上进行了。
  对VS2010 IDE的一些操作主要围绕DTE2的applicationObject实例对象来进行。
 DTE2的命名空间是EnvDTE80。
  关于EnvDTE的说明http://technet.microsoft.com/zh-cn/envdte(it-it).aspx
  EnvDTE 是包含 Visual Studio 内核自动化的对象和成员的用程序集包装的 COM 库。 
在 EnvDTE80、EnvDTE90、 EnvDTE90a 和 EnvDTE100 命名空间中包含更改和新功能。添加对 
EnvDTE.dll 的程序集引用时,您还必须将程序集的 “嵌入互操作类型”属性设置为 false。
最后,如果要在其他计算机上使用,只需要将.AddIn和生成的.dll文件放到 文档目录下的\Visual 
Studio 2010\Addins\目录中即可,如图:

  第一次接触插件开发,还是从我的一个师哥那接触的。
  插件下载地址:http://files.cnblogs.com/zsmhhfy/HeadAddins.rar
  另外参考:http://technet.microsoft.com/zh-cn/magazine/80493a3w.aspx
========

VS插件开发 - 个性化VS IDE编辑器

http://www.cnblogs.com/LonelyShadow/p/3964879.html

之前发了一篇《个性化VS - 登录身份验证》的文章,看到大家都在关注VS全屏背景插件的制作,所以就
抽了个时间发了这篇文章。
我也是刚开始关注VS插件制作的,这个全屏的东西也是参考网上前辈们的相关知识慢慢写出来的,水平
不好,还请见谅。
之前的默认的VS界面:
主题也只有默认的两三个,而且不能自定义添加:
这距离我们的目标,自定义主题、背景、透明等等,感觉貌似相差甚远:
其实,整体步骤非常简单,大家想一下:我们不能直接去设置更改VS的东西,但是VS不是有一个插件的
功能么?
那我们能不能自己写一个插件,来设置VS的相关功能,最后实现这个效果呢?答案是:那是必须的。呵
呵。

大概步骤如下:

1.创建VS插件项目,在启动时读取指定图片资源,填充VS的IDE编辑器
2.使用现有插件设置相应模块的透明色

具体步骤如下:

【一、准备工作】

  VS提供了一个“Visual Studio Package”项目的模板,我们可以根据这个模板,创建一个VS的插件

项目,以此开发相应的插件。

  但是这个项目模板有的Visual Studio安装包中并没有默认附带,需要另行下载。

  我使用的是VS2012,自带默认就有,VS2013自测没有,VS2010貌似也有 以前用的记不清了,如果没

有这个模板需要另行下载,其他版本大家自己看看。

  “新建项目 - 模板 - 其他项目类型 - Visual Studio Package”:

  如果你发现你的VS新建项目中,在模板列表中找不到“Visual Studio Package”,大家可以去搜索

或直接微软官网软件下载找“Visual Studio SDK ****”,****表示你的VS版本,不同版本的VS,SDK不

同。

  下载后,是在线安装程序,大概也就十几M,在线安装的SDK大小也就一百多M,非常快。(安装注意

最好关闭VS哦。)

  安装成功后,你打开VS,新建项目,就可以看到这个项目模板了。

【二、新建项目】

  打开VS - “新建项目 - 其他项目类型 - Visual Studio Package”,项目名称随意,比如我

的“Guying.Package.IDEBackground”:

  然后确定:

  下一步,开发语言选择你的,在这里我当然选择“Visual C#”啦,哈哈,下面的默认就O了:

下一步,输入公司名称、插件名称、版本号、指定Icon图标、插件说明信息:

下一步,什么都别选:

下一步,不要测试项目:

最后点击Finish完成,项目就创建完成了:

【三、编写插件代码】

  找到项目中插件的.cs文件“****Package.cs”:

  这个文件就好比“控制台项目”中的“Program.cs”,对,插件运行时,会启动这个代码文件。

  我们只需要在这个文件中,插入修改Visual Studio IDE的代码即可。

  起初的“***Package.cs”文件中,去掉注释后,只有如下代码:

 起始的“****Package.cs”文件的代码
 
  我们可以发现,包含两个函数:一个无参构造和“Initialize()”方法,这个就不用我介绍了吧,

大家都懂的。 

  在这里,我需要说的是,可能大家细心的已经发现了,你在这个项目中新建窗体,显示的是WPF的应

用程序。

  是的,不仅仅是Vista系统,Visual Studio也是用WPF来开发UI的。

  那我们是不是也可以在这个WPF插件项目中来控制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()”初始化的方法中,为当前启

动程序(也就是咱们运行的Visual Studio的实例)的主窗口添加Loaded事件:

 为当前启动程序(Visual Studio)的主窗口添加Loaded事件“MainWindow_Loaded”
 
  ③然后,当然,编写上面添加的这个“MainWindow_Loaded”的方法,读取指定的图片资源,填充到

Visual Studio IDE编辑器中:

 读取指定的图片资源,填充到Visual Studio IDE编辑器中
 
  在这一步,你可以自我发挥,比如用上IO流,读取一个配置文件,获取配置数据,动态显示等等。


是吧。。。。哈哈。


  ④为了方便调试,请在“****Package.cs”文件的类声明上加上如下属性定义:


 添加属性定义
 
  ⑤紧接着,新建一个类文件“EditorBackground.cs”,参考代码如下,亲们复制的时候,注意我的

命名空间和你的是不是一样的哦:

 EditorBackground.cs
  

  ⑥最后,大家找到项目中的“source.extension.vsixmanifest”文件并打开,找到上面的“Assets

”,点击右边的“New”:


  Type选择“Microsoft.VisualStudio.MefComponent”


  Source选择一个现有的项目


  Project就选择当前这个插件项目即可


  (例如下图:)

  ⑦然后OK、大家生成项目,进入项目的“bin\debug”文件夹,找到生成的插件,关掉VS,双击安装

即可:

  最后打开VS,瞅瞅,如果VS启动异常报错,闪退等,如果指定的图片资源存在,则表示你的插件有


问题了,请运行“devenv.exe /safemode”卸载掉刚刚这个插件就行了。


【四、设置模块透明】

  打开VS如果没问题的话,你会发现是这个样子:
  没错,你可能已经看到了,VS的背景已经发生变化了,被我们指定的图片填充背景了。
  但是,VS的模块还没有,这怎么办?
  当然,还是通过插件设置他们的颜色啊。
  但是VS默认主题颜色是不能随便更改的,怎么办?难道还要再写一个主题换肤的插件?!
  当然不用,这个插件已经开发出来了,大家可以打开VS直接在线安装。
  打开VS - “工具 - 扩展和更新 - 联机”,右上角搜索“Theme”,找到类似这个名字的点击下载

安装即可:“Visual Studio 2012 Color Theme Editor”:

  安装后提示重启VS,重启后你会发现“工具”里可以设置主题配色了:

  在这里我们可以选择提供的几套配色主题,当然我们也可以自己点击“Customize Colors”新建自


己的主题:

  左边选择基于哪种现有配色创建新主题,然后下面输入主题名称,点击Create即可:


  然后你会很鸡冻的发现,VS每个部分的颜色都可以修改了,而且可以修改透明度:
  大家自己按照自己喜欢的修改吧。


  找不到的模块没法改的什么的,可以直接留言邮箱,我把我配置好东西的发给大家。

  点击下面的“Import Theme”导入我发过去的主题即可:

  最后效果如下:


========

NPAPI插件开发详细记录:用VS2010开发NPAPI插件步骤

http://blog.csdn.net/shangbolei/article/details/52457628

前面一段时间关注了用firebreath开发插件,但是感觉用起来不是那么得心应手,还是回到NPAPI开发插

件上来。

本文根据NPAPI开发详解,Windows版进行开发,其中以VS2008为例进行开发,在VS2010中基本上是相同

的。
必须的plugin sdk,将其解压到某个目录下,我这里是:D:\Users\zcf\Documents\My Program\2012。

下面是创建插件的步骤:
1、创建项目

名称一定要以np开头,为了将来适应不同操作系统,最好全小写,不要太长,尽量控制在8字符内。本例

定义为npmedia
位置指定到~plugin\sdk\samples
点击确定、下一步。选择dll、空项目:

点击完成,即建立好了一个空项目。如下图:

2、添加必要文件
首先,添加NPAPI SDK中的Common文件,共三个:

然后添加def文件:

编辑npdemo.def为:
[cpp] view plaincopy 
LIBRARY "npmedia"  
  
EXPORTS  
NP_GetEntryPoints @1  
NP_Initialize @2  
NP_Shutdown @3  
接着添加资源文件:

自动生成了resource.h和npdemo.rc。接着修改rc文件:

在图中的BLOCK内添加。注意!BLOCK 一定要为"040904e4"
VALUE "MIMEType", "application/media-plugin"

注意:有很多朋友反映按照本文的方法做出的插件在chrome中无法识别,问题就在于此处,将下一个字

段改为如下形式就可以了:
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1252
END
这里补充一点:BLOCK  "040904e4"与后面VALUE "Translation", 0x409, 1252的含义是对应的,1252的

十六进制表示就是4e4.Translation字段的第一个值表示语言409表示英语,而默认的804表示中文(简体)

。Translation字段的第二个值表示所采用的字符集,1200(0X04B0)表示unicode,1252(0X04E4)表示

多字节字符集,请参考:http://msdn.microsoft.com/zh-

cn/library/windows/desktop/aa381057%28v=vs.85%29.aspx。对于用中文环境开发来讲既可以用409(

英语)也可以用804(中文)
BLOCK 的值对于firefox必须是 "040904e4",有朋友提到在chrome中这个BLOCK 的值可以是"080404e4"
如果要支持chrome则字符集应设置为1252(0X04E4)如要及支持firefox又支持chrome,保险的做法是
BLOCK  "040904e4"对应"Translation", 0x409, 1252。

3、添加Plugin实现类

类名可以随便命名,但是必须继承自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、修改项目属性

字符集选择为多字节字符(不是必须的),下面添加包含文件: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     TEST WEB PAGE for media plugin      
     关于调试插件:首先用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的目录。========




你可能感兴趣的:(.Net,visual,studio,2010,ide,插件)