Visual Studio 2012中宏的替代方法

时间:2012-08-19 15:01:33

标签: visual-studio-2012 visual-studio-macros

我在XAML开发中广泛使用宏来查看ViewModel属性。我在WCF中更多地使用它们来生成Message和DataContract属性。

令我失望的是,我构建的宏在Visual Studio 2012中无法使用。

我正在谈论的一个例子,对于VM,我会输入类似的内容。

int id;
string name;

选择两行,运行宏并以

结束
private int _id;
private string _name;

public int Id
{
   get {return _id;}
   set
   {
      if(_id != value)
      {
        _id = value;
        RaisePropertyChanged("Id");
      }
}

public string Name
{
   if(_name != value)
   {
      _name = value;
      RaisePropertyChanged("Name");
   }
}

我正在寻找有关丢失宏的其他解决方案的想法。

10 个答案:

答案 0 :(得分:64)

最简单的宏替代方法是创建加载项。我知道,我知道,我也不为此感到兴奋,但实际上却非常容易。它有三个简单的部分:

  1. 创建宏项目,逐步完成向导UI。
  2. 编写代码。
  3. 将宏的.addin和.dll文件复制到Visual Studio Addins目录。
  4. 我们将a simple macro I wrote to show the Start Page after closing a solution转为加载项。

    创建宏项目

    • 运行VS 2012并创建一个新项目。
    • 转到模板>其他项目类型>可扩展性并选择 Visual Studio加载项
    • 为其命名,例如ShowStartPage。
    • 单击“确定”。这将打开加载项向导。
    • 单步执行向导,选择:
      • 编程语言:我们将使用C#
      • 应用程序主机:应选择VS 2012
      • 加载项的名称和说明
      • 在加载项选项页面上,仅选中第二个选项("我希望我的加载项在主机应用程序启动时加载")
      • 暂时跳过About Box的内容,然后点击Finish。

    现在你有了一个加载项目。这是你用它做的事情:

    编写代码

    打开Connect.cs文件。 (它可能已经开放了。一些" DTE"东西应该看起来很熟悉。)

    在班级添加此代码:

    SolutionEvents solutionEvents;
    

    OnConnection行后面的_addInInstance = (AddIn)addInInst;方法中添加此代码:

    solutionEvents = _applicationObject.Events.SolutionEvents;
    
    solutionEvents.AfterClosing += () =>
    {
        _applicationObject.ExecuteCommand("View.StartPage");
    };
    

    点击"运行"用于测试代码的按钮。启动Visual Studio 2012的新实例,并加载您的加载项。现在测试加载项并确保它正常工作。 (打开一个解决方案,然后关闭它;当你这样做时,应该返回起始页。)

    部署

    一旦加载项工作,要在Visual Studio 2012中定期使用它,您只需要部署两个文件:

    • ShowStartPage.AddIn(来自您的主项目目录)
    • ShowStartPage.dll(来自您项目的构建目录;例如bin \ Debug或bin \ Release)

    将这两个文件放在VS 2012加载项目录中,可能位于此处:

    C:\Users\[your user name]\Documents\Visual Studio 2012\Addins

    然后退出并重新启动Visual Studio,您应该看到您的加载项正常工作。您还应该在转到工具>时看到它列出加载项管理器。

    虽然这比打开宏编辑器并将宏代码放在那里更麻烦,但它确实有一个优点,就是你可以使用你想要的任何语言,而不是被卡在一些有点脆弱的VB-像过去版本的Visual Studio中的编辑器一样。

答案 1 :(得分:12)

我会坚持将文本剪切成Notepad++并在那里使用宏,然后粘贴回来。很遗憾,Visual Studio 2012中没有这个功能......

答案 2 :(得分:12)

Visual Commander扩展(由我开发)是Visual Studio 2012/2013/2015中宏的替代方法。您甚至可以在新的VB命令中重用现有的Visual Studio宏代码。

答案 3 :(得分:5)

Visual Studio中有一个加载项VSScript,它替换了缺少的宏功能。虽然它不使用Visual Basic,但使用Lua脚本语言,但您可能想要尝试它。

有一个带IntelliSense的录像机,宏代码编辑器窗口和一个简单的调试器。该加载项还支持早期版本的Visual Studio,因此如果您更喜欢Lua语言而不是Visual Basic,则可以使用它而不是原始的Visual Studio宏。

答案 4 :(得分:3)

我很悲伤地看到宏不攻自破了。您可以使用正则表达式搜索来替换替换,并在Visual Studio 2012中替换。在您的情况下:

查找:

(.*) (.*);

替换为:

private $1 _$2;\npublic $1 $2\n{\n  get {return _$2;}\n  set\n  {\n    if(_$2 = value;\n    RaisePropertyChanged("$2");\n  }\n}\n

除了Macros更适合的属性名称的大写之外,这将获得一切。

但正则表达式方法的一个优点是输入不是那么简单(例如数据库表DDL语句)。

以下是来自MSDN的几个有用链接:

Substitutions in Regular Expressions

Using Regular Expressions in Visual Studio

答案 5 :(得分:2)

我使用Notepad ++和正则表达式:

查找:

public (.\*) (.)(.*) \\{ get; set; \\}

替换:

private \1 \l(\2)\3; \r\n public \1 \2\3 \\{ get \\{ return \l(\2)\3; \\} \r\n set \\{ \l(\2)\3 = value; OnPropertyChanged\(para => this\.\2\3\); \\}\\}

答案 6 :(得分:1)

查看http://devexpress.com/coderush

模板功能几乎可以满足您的需求。

有一个免费的快递"版本也是。

答案 7 :(得分:1)

Visual Studio 2012缺少宏让我失望,因为我有一些我一直用字面插入标准的一点点文本和一个按键。所以我编写了一个非常简单的脚本扩展性包VSScripts,它允许从命令行程序中操作当前选择。

这并不是声称是旧宏系统的全面替代,并且它不提供键盘宏,但它确实可以重新创建多种类型的文本操作宏。

答案 8 :(得分:1)

这是我为保持宏功能所做的工作......

  1. 下载并安装Visual Studio 2012 SDK here(它包含“Visual Studio包”模板)
  2. 新项目 - > Installed.Templates.Visual C#.Extensibility.Visual Studio Package

    向导第1页,共7页

    language = C#
    gen new key is fine, or use another if you have one
    

    向导第3页,共7页

    check "menu command"
    

    向导第7页,共7页

    uncheck both integration and unit test project options
    

    点击完成

  3. 在.cs文件中:

    using EnvDTE;
    using EnvDTE80;
    
    ...
    private void MenuItemCallback(object sender, EventArgs e)
    {
        MenuCommand cmd = sender as MenuCommand;
    
        // This should start to look like familiar macro code...
        EnvDTE80.DTE2 dte2 = Package.GetGlobalService(typeof(EnvDTE.DTE)) as DTE2;
        TextSelection selection = (TextSelection)dte2.ActiveDocument.Selection;
    
        dte2.UndoContext.Open("macro command replacement");
        selection.Text = "inserted from macro replacement";
        selection.NewLine(1);
        dte2.UndoContext.Close();
        ...
    
  4. 运行项目。新的Visual Studio实例将从加载的包开始。
  5. 将您的命令作为“工具”菜单顶部的第一个条目。单击它以查看它是否有效。
  6. 要真实安装,请转到bin \ debug(/ release)目录并双击.vsix文件
  7. 应在下次运行时安装
  8. 转到菜单工具 - > 选项...... - > environment.keyboard并将击键映射到您的工具

    Mapping theme : Visual C# 2005
    Command       : Tool.yourFunctionName (functions defined in the .vsct file)
    
  9. 如果您需要多个命令,则需要在PkgCmdID.cs中添加菜单ID,在Guids.cs中添加Guids,在.vsct中添加布局,在* package.cs中添加一个函数(和按钮(MenuCommand) ))在每个初始化函数中。它可以在同一个项目中完成。

    我使用这个项目用旧的宏代码创建几个新的'工具',然后将我的键映射到它们。预先做了很多工作(和头痛),但没有宏的滞后时间。

    可能有一种方法可以在不占用工具菜单的情况下执行此操作。我昨晚开始关注这个问题并最终开始工作,所以我现在已经完成了它(至少在微软决定放弃它之前)。

答案 9 :(得分:0)

我个人喜欢这个 - Visual Commander扩展允许您在Visual Studio中自动执行重复性任务。