【问题标题】:Alternative to macros in Visual Studio 2012Visual Studio 2012 中宏的替代方法
【发布时间】:2012-08-15 04:23:01
【问题描述】:

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

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

我正在谈论的一个例子,对于一个虚拟机,我会输入这样的内容。

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");
   }
}

我正在寻找其他解决方案来处理丢失宏的想法。

【问题讨论】:

  • 我假设代码 sn-ps 将成为替代方案或至少是一个建议。代码 sn-ps 的问题是当我创建 DataMembers 或 MessageContractMembers 时,我的宏会自动计算并填充每个属性的显示顺序。所以我希望有一些替代宏的方法可以提供尽可能多的灵活性。
  • @FrostKris 也许你应该接受 Kyralessa 的回答
  • 哇,这是提高生产力和代码的好方法。到现在还没有任何头绪。 @FrostKris,您是否有机会在 VS2012 中找到另一种方法来实现这一目标?
  • @Frost Kris,我想知道您是否找到了解决方案,是否愿意分享您的代码?我真的很想看看/使用它。

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


【解决方案1】:

宏的最简单替代方法是创建插件。我知道,我知道,我也不对此感到兴奋,但实际上它非常容易。它包含三个简单的部分:

  1. 创建宏项目,逐步完成向导 UI。
  2. 编写您的代码。
  3. 将宏的 .addin 和 .dll 文件复制到 Visual Studio Addins 目录。

让我们把a simple macro I wrote to show the Start Page after closing a solution 变成一个插件。

创建宏项目

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

现在您有一个加载项项目。以下是您对它的处理方式:

编写代码

打开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 中的编辑器。

【讨论】:

  • 对于我自己想要一遍又一遍地运行的自定义命令(尤其是使用键绑定),我检查了Yes, create a 'Tools' menu item... 并将我的代码添加到Exec() 方法中的if(commandName == ...handled = true;.
  • 请注意,在类级别添加此代码指令至关重要。如果您使用局部变量,它将被垃圾收集并且您的处理程序不会被触发。
  • 它实际上非常简单且非常灵活,谢谢。
  • 在 VS2013 和 VS2015RC 中,我在 Templates>Other Project Types 下找不到 Extensibility 选项。它只有安装和部署以及 Visual Studio 解决方案。安装后我需要做些什么来获得该选项吗?
【解决方案2】:

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

【讨论】:

  • 确实非常有用,因为在 VS 2015 中缺少宏功能仍然是一个问题。非常感谢 Sergey!
  • 这看起来是一个很棒的工具,但我似乎无法让它在 2015 年录制宏(我没有在其他 vs 版本中尝试过)我选择录制宏,然后停止,然后编辑或保存,但代码中没有任何内容。有什么想法吗?
  • @atreeonhill 它应该在 VS 2015 中记录文本编辑命令。请通过 SergeyVlasov@vlasovstudio.com 与我联系以进行故障排除。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    有一个用于 Visual Studio 的插件 VSScript,它替换了缺失的宏功能。虽然它没有使用 Visual Basic,但是 Lua 脚本语言,你不妨试试看。

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

    【讨论】:

    • 太棒了,很高兴看到社区在 MS 失败的地方接手。
    【解决方案5】:

    看到 Macros 也走了,我很难过。您可以使用 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
    

    这将为您提供一切,除了宏更适合的属性名称的大写。

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

    这里有几个来自 MSDN 的有用链接:

    Substitutions in Regular Expressions

    Using Regular Expressions in Visual Studio

    【讨论】:

    【解决方案6】:

    我使用 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\); \\}\\}
    

    【讨论】:

      【解决方案7】:

      查看http://devexpress.com/coderush

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

      还有一个免费的“Express”版本。

      【讨论】:

        【解决方案8】:

        Visual Studio 2012 缺少宏让我很失望,因为我有一些宏,我一直在使用这些宏,只需按一下键就可以插入标准的小段文本。所以我写了一个非常简单的脚本扩展包VSScripts,它允许从命令行程序操作当前的选择。

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

        【讨论】:

          【解决方案9】:

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

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

            向导第 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. 转到菜单 Tools -> Options... -> environment.keyboard 并将击键映射到您的工具

            Mapping theme : Visual C# 2005
            Command       : Tool.yourFunctionName (functions defined in the .vsct file)
            

          如果您需要多个命令,则需要在 PkgCmdID.cs 中添加菜单 id,在 Guids.cs 中添加 Guids,在 .vsct 中添加布局以及在 *package.cs 中添加函数(和按钮(MenuCommand ) 在 Initialize 函数中) 为每一个。这一切都可以在同一个项目中完成。

          我使用这个项目用我的旧宏代码创建了几个新的“工具”,然后将我的键映射到它们。前面还有很多工作(和令人头疼的事情),但没有宏所具有的滞后时间。

          可能有一种方法可以在不占用工具菜单的情况下做到这一点。我昨晚开始看这个,终于让它工作了,所以我现在已经完成了(至少在微软决定放弃它之前)。

          【讨论】:

            【解决方案10】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-11-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多