Visual Studio 2012中宏的替代方法是什么?

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

我正在寻找其他解决宏丢失问题的方法。


2
我认为代码片段将成为替代方案,或者至少是一个建议。代码片段的问题在于当我创建DataMembers或MessageContractMembers时,我的宏会自动计算和填充每个属性的显示顺序。因此,我希望有一些替代宏的方法,可以提供同样的灵活性。 - kfrosty
1
请参阅代码生成和T4文本模板 - John Saunders
@FrostKris,也许你应该接受Kyralessa的答案。 - goamn
@Frost Kris,我想知道你是否找到了解决方案,并且是否愿意分享你的代码?我对看到和使用它非常感兴趣。 - Eric Ouellet
我还没有找到宏的替代方案。我只是继续使用Visual Studio 2010,在那里运行我的宏,然后将代码复制并粘贴到VS 2013文件中。我也创建了代码片段,但发现自己使用得不多。 - kfrosty
显示剩余2条评论
10个回答

65
最简单的宏替代方案是创建“插件”。虽然我知道,我知道,一开始我也不感兴趣,但实际上它非常容易。它包含三个简单的部分:
  1. 创建宏项目,并通过向导 UI 进行操作。
  2. 编写代码。
  3. 将宏的 .addin 和 .dll 文件复制到您的 Visual Studio Addins 目录中。
让我们以我编写的一个简单宏为例,在关闭解决方案后显示“启动页”并将其转换为插件。

创建宏项目

  • 运行 VS 2012 并创建新项目。
  • 转到 Templates > Other Project Types > Extensibility 并选择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的一个新实例将启动,并加载您的插件。现在测试该插件,确保它能够正常工作。(打开一个解决方案,然后关闭它;当您这样做时,"Start Page" 应该返回。)

部署

一旦插件能够正常工作,要想在 Visual Studio 2012 中经常使用它,您只需要部署两个文件:

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

将这两个文件放入您的 VS 2012 插件目录中,可能位于此处:

C:\Users\[您的用户名]\Documents\Visual Studio 2012\Addins

然后退出并重新启动 Visual Studio,您应该能够看到您的插件在工作。当您转到“工具” > “插件管理器”时,您也应该能够看到它被列出。

虽然这比打开宏编辑器并将您的宏代码粘贴到其中还要麻烦一些,但它有一个优点,即您可以使用任何语言,而不是被限制在 Visual Studio 早期版本中相对不稳定的类似 VB 的编辑器中。


7
对于我自己想要一遍又一遍地运行的自定义命令(特别是使用键绑定),我勾选了“是,创建'Tools'菜单项...”,并在Exec()方法中的if(commandName == ...handled = true;之间添加了我的代码。 - Ray
请注意,将此代码添加到类级别的指令非常重要。如果您使用局部变量,它将被垃圾回收,您的处理程序将无法触发。 - Monsignor
1
这实际上非常容易且极其灵活,谢谢。 - Lorenzo Polidori
在VS2013和VS2015RC中,我找不到“模板”>“其他项目类型”下的“可扩展性”选项。它只有“安装和部署”和“Visual Studio解决方案”。是否需要进行安装后的某些操作才能获得该选项? - haku

12

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


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

12

我会坚持使用Notepad++对文本进行切割,并在那里使用宏,然后再粘贴回来。可惜这个功能在Visual Studio 2012中已经没有了...


5

有一个插件VSScript可用于Visual Studio,替代了缺失的宏功能。虽然它不使用Visual Basic,而是使用Lua脚本语言,你可能想要尝试一下。

这个插件还有一个录制器、带有智能提示的宏代码编辑窗口和一个简单的调试器。该插件还支持Visual Studio的早期版本,因此如果你喜欢Lua语言而不是Visual Basic,你可以使用它代替原始的Visual Studio宏。


1
太棒了,很高兴看到社区在微软未能满足需求的地方接手了下来。 - Jimbo

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

这将为您提供除了属性名称大写之外的所有内容,对于这种情况,宏可能更好。

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

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

正则表达式中的替换

在Visual Studio中使用正则表达式


看起来他们正在考虑在未来的Visual Studio版本中重新引入宏 http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2650757-bring-back-macros?tracking_code=797ba9d47520260a9b534e47ba15e8ec - Lee Richardson

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

1

以下是我为保持宏功能所做的操作...

  1. 下载并安装Visual Studio 2012 SDK 在这里(它包含“Visual Studio Package”模板)
  2. 新建项目 -> 已安装的模板 -> Visual C#.Extensibility.Visual Studio Package

    向导页面1/7

    语言 = C#
    生成新密钥很好,或者如果您有其他密钥,可以使用另一个
    

    向导页面3/7

    勾选“菜单命令”
    

    向导页面7/7

    取消勾选集成和单元测试项目选项
    

    点击完成

  3. 在.cs文件中:

    using EnvDTE;
    using EnvDTE80;
    
    ...
    private void MenuItemCallback(object sender, EventArgs e)
    {
        MenuCommand cmd = sender as MenuCommand;
    
        // 这应该开始像熟悉的宏代码一样…
        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. 转到菜单 工具 -> 选项... -> 环境.键盘并将按键映射到您的工具

    映射主题:Visual C# 2005
    命令:Tool.yourFunctionName(在.vsct文件中定义的函数)
    
如果您需要多个命令,您需要在PkgCmdID.cs中添加菜单id,在Guids.cs中添加guid,在.vsct中添加布局,并在每个命令的*package.cs中添加函数(以及Initialize函数中的button(MenuCommand))。所有这些都可以在同一个项目中完成。
我使用这个项目用我的旧宏代码创建了几个新的“工具”,然后将我的按键映射到它们上面。这需要更多的工作(和头疼),但没有宏所遇到的延迟时间。
可能有一种方法可以在不占用工具菜单的情况下完成这个任务。我昨晚开始研究这个问题,最终让它工作了,所以我现在已经完成了(至少在微软决定放弃这个之前是这样的)。

1

1
Visual Studio 2012缺少宏功能,让我感到沮丧,因为我有几个常用的宏,可以通过单个按键插入标准文本片段。因此,我编写了一个非常简单的脚本扩展包VSScripts,允许从命令行程序中操作当前选择。
这并不意味着它是旧宏系统的全面替代品,也没有提供键盘宏,但它确实使得重新创建许多类型的文本操作宏成为可能。

0

个人而言,我喜欢这个 - Visual Commander 扩展可以让你在 Visual Studio 中自动化重复的任务。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接