指定生成事件(Visual Basic)

Visual Basic 中的生成事件可用于在编译过程中运行脚本、宏或其他操作。 编译前发生预生成事件;生成后事件在编译后发生。

如何指定预生成和生成后事件

若要查看或更改 Visual Basic .NET Core 或 .NET 5 及更高版本的项目的生成事件,请右键单击项目节点,然后选择 属性(或 按 Alt+Enter),然后转到 编译>事件。 输入所需的命令行。 工作目录是输出目录。

对于 .NET Framework 项目,请执行以下步骤:

  1. 解决方案资源管理器中选择项目后,在 项目 菜单上,单击 属性

  2. 单击“编译”选项卡。

  3. 单击 生成事件 按钮,打开生成事件 对话框。

  4. 输入预生成或生成后操作的命令行参数,然后单击“确定”

生成事件是在 生成事件 对话框中指定的,可从 项目设计器编译 页获取。

如何指定预生成和生成后事件

指定生成事件

  1. 解决方案资源管理器中选择项目后,在 项目 菜单上,单击 属性

  2. 单击“编译”选项卡。

  3. 单击 生成事件 按钮,打开 生成事件# 对话框。

  4. 输入预生成或生成后操作的命令行参数,然后单击“确定”

说明

在运行 .bat 文件的所有生成后命令之前添加 call 语句。 例如,call C:\MyFile.batcall C:\MyFile.bat call C:\MyFile2.bat

说明

如果预生成或生成后事件未成功完成,则可以通过使用零(0)以外的代码退出事件操作来终止生成,这表示成功操作。

示例:如何使用生成后事件更改清单信息

以下过程演示如何使用从生成后事件(项目目录中的 .exe.manifest 文件)调用的 .exe 命令在应用程序清单中设置最低操作系统版本。 最低操作系统版本由四部分组成,例如 4.10.0.0。 为此,此命令将更改清单的 <dependentOS> 部分:

<dependentOS>
   <osVersionInfo>
      <os majorVersion="4" minorVersion="10" buildNumber="0" servicePackMajor="0" />
   </osVersionInfo>
</dependentOS>

创建 .exe 命令以更改应用程序清单

  1. 为命令创建控制台应用程序。 在“文件”菜单中,单击 “新建”,然后单击 项目

  2. 在“新建项目”对话框中的“Visual Basic 节点中,选择 Windows,然后选择 控制台应用程序 模板。 将项目命名为 ChangeOSVersionVB

  3. Module1.vb中,将以下代码行添加到文件顶部的其他 Imports 语句中:

    Imports System.Xml
    
  4. Sub Main中添加以下代码:

    Sub Main()
       Dim applicationManifestPath As String
       applicationManifestPath = My.Application.CommandLineArgs(0)
       Console.WriteLine("Application Manifest Path: " & applicationManifestPath.ToString)
    
       'Get version name
       Dim osVersion As Version
       If My.Application.CommandLineArgs.Count >= 2 Then
          osVersion = New Version(My.Application.CommandLineArgs(1).ToString)
       Else
          Throw New ArgumentException("OS Version not specified.")
       End If
       Console.WriteLine("Desired OS Version: " & osVersion.ToString())
    
       Dim document As XmlDocument
       Dim namespaceManager As XmlNamespaceManager
       namespaceManager = New XmlNamespaceManager(New NameTable())
       With namespaceManager
          .AddNamespace("asmv1", "urn:schemas-microsoft-com:asm.v1")
          .AddNamespace("asmv2", "urn:schemas-microsoft-com:asm.v2")
       End With
    
       document = New XmlDocument()
       document.Load(applicationManifestPath)
    
       Dim baseXPath As String
       baseXPath = "/asmv1:assembly/asmv2:dependency/asmv2:dependentOS/asmv2:osVersionInfo/asmv2:os"
    
       'Change minimum required OS Version.
       Dim node As XmlNode
       node = document.SelectSingleNode(baseXPath, namespaceManager)
       node.Attributes("majorVersion").Value = osVersion.Major.ToString()
       node.Attributes("minorVersion").Value = osVersion.Minor.ToString()
       node.Attributes("buildNumber").Value = osVersion.Build.ToString()
       node.Attributes("servicePackMajor").Value = osVersion.Revision.ToString()
    
       document.Save(applicationManifestPath)
    End Sub
    

    该命令采用两个参数。 第一个参数是应用程序清单的路径(即生成过程在其中创建清单的文件夹,通常 <ProjectName>.publish)。 第二个参数是新的操作系统版本。

  5. 生成 菜单上,单击 生成解决方案

  6. .exe 文件复制到 C:\TEMP\ChangeOSVersionVB.exe等目录。

    接下来,在生成后事件中调用此命令以更改应用程序清单。

调用生成后事件以更改应用程序清单

  1. 为要发布的项目创建 Windows 应用程序。 在“文件”菜单中,单击 “新建”,然后单击 项目

  2. “新建项目”对话框中的 “Visual Basic”节点,选择 “Windows 桌面”,然后选择 “Windows 窗体应用”模板。 将项目命名为 VBWinApp

  3. 解决方案资源管理器中选择项目后,在 项目 菜单上,单击 属性

  4. 项目设计器中,转到 发布 页,并将 发布 位置设置为 C:\TEMP

  5. 单击“立即发布”以发布项目。

    清单文件将生成并放入 C:\TEMP\VBWinApp_1_0_0_0\VBWinApp.exe.manifest中。 若要查看清单,请右键单击该文件,然后单击 打开,然后单击 从列表中选择程序,然后单击 记事本

    在文件中搜索 <osVersionInfo> 元素。 例如,版本可能是:

    <os majorVersion="4" minorVersion="10" buildNumber="0" servicePackMajor="0" />
    
  6. 项目设计器中,转到 编译 选项卡,然后单击 生成事件 按钮打开 生成事件 对话框。

  7. 在“生成后事件命令行”框中,输入以下命令:

    C:\TEMP\ChangeOSVersionVB.exe "$(TargetPath).manifest" 5.1.2600.0

    生成项目时,此命令会将应用程序清单中的最低操作系统版本更改为 5.1.2600.0。

    $(TargetPath) 宏表示所创建的可执行文件的完整路径。 因此,$(TargetPath)清单 将指定在 bin 目录中创建的应用程序清单。 发布过程会将此清单文件复制到您先前设置的发布位置。

  8. 再次发布项目。 转到“发布”页面,然后单击“立即发布”

    再次查看清单。 若要查看清单,请转到发布目录,右键单击该文件,然后单击 使用 打开,然后 从列表中选择程序,然后单击 记事本

    版本现在应显示为:

    <os majorVersion="5" minorVersion="1" buildNumber="2600" servicePackMajor="0" />