为解决方案中的所有项目设置构建后操作

4
有没有一种方法可以设置和/或更改整个解决方案中所有项目的后生成事件/操作?我有一些解决方案,其中包含多达50个项目,除了2个项目外,它们都需要相同的后生成操作。当我有一个新的解决方案或者我必须为现有解决方案的所有项目更改后生成操作时,我必须遍历所有项目设置,转到编译选项卡页并编辑后生成操作。
如果有其他解决方案可以为整个解决方案设置后生成操作,也将不胜感激。也许是MSBuild,但我没有任何经验...
使用Visual Studio 2012和VB.Net项目。
3个回答

1
你可以创建一个简单的应用程序,可以接收多个.csproj文件和一个简单的多行文本框,您可以在其中粘贴您的后构建操作。
因此,在1个项目中编辑后构建。在记事本中打开项目文件,查找<PostBuildEvent>...</PostBuildEvent>,并将其粘贴到您的多行文本框中,并循环遍历所有项目文件,并向它们添加此xml元素。

enter image description here


我们也考虑过这个问题,但我们正在寻找一些与Visual Studio本身相关的东西,这样我们就不需要另外一个额外的应用程序来完成这样的事情。 - wdumon

1
我使用Visual Studio宏来完成这个操作。
在宏编辑器中(Alt + F11),有一个名为EvironmentEvents的文件。 我使用BuildEvents_OnBuildProjConfigDone事件。 我经常使用这个事件将程序集复制到我的工作目录。
例如:
Private targetPath As String = "C:\..."  

Private Sub BuildEvents_OnBuildProjConfigDone(ByVal ProjectName As String, ByVal ProjectConfig As String, ByVal Platform As String, ByVal SolutionConfig As String, ByVal Success As Boolean) Handles BuildEvents.OnBuildProjConfigDone
    On Error GoTo ext
    If Not Success Then Exit Sub

    'Absolute path to assembly
    Dim tar = targetPath
    Dim project As Project = DTE.Solution.Projects.Item(ProjectName)
    Dim projectFolder As String = Path.GetDirectoryName(project.FileName)
    Dim config As EnvDTE.Configuration = project.ConfigurationManager.ActiveConfiguration
    Dim outputPath As String = CStr(config.Properties.Item("OutputPath").Value)
    Dim assemblyName As String = CStr(project.Properties.Item("AssemblyName").Value)
    Dim assemblyFileName As String = CStr(project.Properties.Item("OutputFileName").Value)
    Dim src As String = Path.Combine(Path.Combine(projectFolder, outputPath), assemblyFileName)

    'Copy files to working folder
    On Error GoTo err
    Dim dst As String

    dst = Path.Combine(tar, assemblyFileName)
    DTE.ToolWindows.OutputWindow.ActivePane.OutputString(outTag + assemblyName + " -> " + dst + vbCrLf)
    File.Copy(src, dst, True)

    src = src.Substring(0, src.Length - 3) + "pdb"
    dst = dst.Substring(0, dst.Length - 3) + "pdb"
    DTE.ToolWindows.OutputWindow.ActivePane.OutputString(outTag + assemblyName + " -> " + dst + vbCrLf)
    File.Copy(src, dst, True)

    Exit Sub

err:
    DTE.ToolWindows.OutputWindow.ActivePane.OutputString(outTag + Err.Description + vbCrLf)
ext:
End Sub

显然,宏编辑器已从Visual Studio 2012中删除。有人建议使用插件来获得相同的行为,我会考虑这个建议。 - wdumon
这意味着我将来必须编写自己的VS插件来完成上述操作? - joe
我想是的。目前我还没有深入研究这个问题,但如果你搜索“VS2012中的宏编辑器”,你会得到如何使用插件的示例... - wdumon

0

你知道在解决方案资源管理器中可以使用 Ctrl + 单击或 Shift + 单击选择多个项目,然后一次性更改所有项目吗?


你可以选择它们,但是你无法访问“编译”选项卡页上的“后生成事件”,这是属性窗口中的一个选项。当选择多个项目并打开属性窗格时,你只能看到“项目文件”和“项目文件夹”。 - wdumon
抱歉,我的回答只适用于C++项目。 - Owen Wengerd

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