c# - 作为构建步骤,如何从解决方案中的项目之一运行程序?

标签 c# visual-studio visual-studio-2015 msbuild

问题如下:我的VS2015方案有几个项目,其中A和B。

A 是一个常规项目,包含一个程序/服务/代码,可以将某些源文件转换为已编译的资源(其想法是源可人工维护并受源控制,但生成的资源是机器优化的但不在源下)控制)。

项目 B 包含一个这样的源文件,而不是逐字放在项目 B 的结果程序集中,我希望 A 中的程序将其“编译”成一个资源文件,并只将其放入程序集 B(以及项目 B 中的其他代码)正常编译)。

+-------------------+                    +-----------------+
|Project A          |                    |Assembly A       |
|                   | +----------------> |                 |
|                   |                    |                 |
+-------------------+                    +-------+---------+
                                                 |
                                                 |
                +--------------------------------+------+
                |                                       |
+-------------------+                    +-----------------+
|Project B      |   |                    |Assembly B    |  |
|          +----+---+                    |        +-----v--+
|          |src.txt|| +----------------> |        |res.txt||
|          |       ||                    |        |       ||
|          +--------|                    |        +--------|
+-------------------+                    +-----------------+

如何在 Visual Studio 2015 中做到这一点?

最佳答案

您可以使用 Visual Studio 自定义工具而不是构建前/构建后步骤来实现这一点。这实际上不像设计器转换那样是编译步骤,但仍应解决我认为您要问的问题。这将创建一个自定义代码生成器,类似于 Visual Studio 如何将 .resx 设计器中的资源字符串转换为可编译的 C# 代码。

您没有指定您的目标是什么版本的 .NET,但这假设您的目标是 .NET 4.5。有一个 good tutorial here用于创建您自己的自定义工具,这是以下内容的基础。请注意,该文章是为 Visual Studio 2012 编写的,因此某些注册表项有所不同。

所有这一切的总结:

  • 实现 Microsoft.VisualStudio.TextTemplating.VSHost.BaseCodeGenerator在项目 A 中。这可以做任何你正在做的从 src.txt 转换的工作。输入文件到 res.txt输出文件。
  • 将第 1 步中的生成器注册为 VS2015 自定义工具
  • 设置您的 src.txt 的属性在项目 B 中使用您的自定义工具。从现在开始,每次保存或修改src.txt , Visual Studio 将生成您的 res.txt为你,你可以嵌入到你的程序集 B 或任何你喜欢的。请记住,如果您稍后需要对项目 A 进行更改,则需要重复步骤 2 并重新启动 VS。

  • 实现代码生成器:
  • 向项目 A 添加对 Microsoft.VisualStudio.TextTemplating.VSHost.14.0 的引用。
  • 打开项目 A 的 AssemblyInfo.cs 文件并更改 [assembly: ComVisible(false)][assembly: ComVisible(true)]
  • 创建一个新的代码生成器类,如下所示
    [ComVisible(true)]
    [Guid("C43E4E36-289C-40C8-9B87-7F79E2B57B0E")] // TODO: replace with your own random GUID
    public class MyResConverter : Microsoft.VisualStudio.TextTemplating.VSHost.BaseCodeGenerator
    {
        public override string GetDefaultExtension()
        {
            // TODO: file extension of the resulting resource file
            return ".res.txt";
        }
    
        protected override byte[] GenerateCode(string inputFileName, string inputFileContent)
        {
            // TODO: your "compile" step that converts `src.txt` to `res.txt`
            return Encoding.UTF8.GetBytes(inputFileContent.ToUpper());
        }
    }
    

  • 注册您的代码生成器:
  • 编译项目 A,并将生成的程序集复制到某个其他文件夹。如果将它们保留在构建输出目录中,则文件稍后将被写锁定,因为在向 VS 注册自定义工具并重新启动 VS 后,Visual Studio 会将它们加载到内存中。
  • 使用 regasm 将您的项目 A 注册为 COM 程序集,以管理员身份从命令提示符运行:C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exe /codebase C:\Path\To\ProjectA.dll
  • 创建一个新的 install.reg 文本文件以配置 VS 以识别来自项目 A 的新自定义工具,并根据需要替换 TODO:
    Windows Registry Editor Version 5.00
    
    ; TODO: Replace with your GUID
    [HKEY_CURRENT_USER\SOFTWARE\Microsoft\VisualStudio\14.0_Config\CLSID\{C43E4E36-289C-40C8-9B87-7F79E2B57B0E}]
    "InprocServer32"="C:\\Windows\\System32\\mscoree.dll"
    "ThreadingModel"="Both"
    "Class"="ProjectA.MyResConverter"
    ; TODO: Replace with your assembly
    "Assembly"="ProjectA, Version=1.0.0.0, Culture=neutral"
    ; TODO: Replace with your dll file
    "CodeBase"="file:///C:\\Path\\To\\ProjectA.dll"
    
    ; TODO: Replace with your tool name
    [HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\14.0_Config\Generators\{FAE04EC1-301F-11D3-BF4B-00C04F79EFBC}\MyResConverter]
    ; TODO: Replace with your GUID
    "CLSID"="{C43E4E36-289C-40C8-9B87-7F79E2B57B0E}"
    "GeneratesDesignTimeSource"=dword:00000001
    ; TODO: Replace with your description
    @="My Custom Tool"
    
  • 请注意,这与 the tutorial 不同上面提到你的目标是 14.0_Config关键,因为这是 VS2015。
  • {FAE... string 是 C# 代码生成器的 GUID,与您为自定义代码生成器创建的任何 GUID 无关。
  • 请注意,此 install.reg 文件必须是 ANSI 编码的文件,否则 regedit.exe 将因某些“无效的注册表文件”错误而拒绝。如果您在 VS 中将 install.reg 文件创建为文本文件,它将被编码为 UTF8,因此只需在 notepad.exe 或您喜欢的任何内容中创建它。
  • 运行 install.reg 更新注册表
  • 重启 Visual Studio

  • 使用您的自定义工具:
  • 右键单击您的 src.txt在项目 B 中,然后属性
  • 将“自定义工具”属性更改为您在 install.reg 中指定的工具名称,例如MyResConverter
  • 保存您的 src.txt文件以生成初始转换后的资源文件(只需打开 src.txt 并单击文件 > 保存以强制运行代码生成器)。您现在应该看到 src.res.txt在您的 src.txt 下方.您可以更改生成文件的属性,将其作为资源嵌入到您的程序集中,或者您想要的任何内容。

  • 从现在开始,无论何时修改src.txt , VS 会为你重新生成资源文件,你可以将其嵌入到你的项目 B 中。

    关于c# - 作为构建步骤,如何从解决方案中的项目之一运行程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40473095/

    相关文章:

    c# - 如何在StringTemplate中创建foreach? 。网

    c# - 无法将类型 'double' 隐式转换为 'int' 。 -错误

    .net - 如何将调试器附加到 WebService?

    wpf - Xaml 设计器 Visual Studio 2015 中的“无效标记”

    visual-studio-2015 - ReSharper 2016 - 禁用重构

    c# - 应用忙但没有响应 : how to check what it's doing?

    C# 试图解密文件以仅处理内存

    c# - 将 C# 项目保存为一个文本文件?

    c++ - 当有人尝试在当前 .cpp 或 .h 文件中使用 STL 时显示错误(在 Visual Studio 中)

    c# - xamarin.forms 与 VS 2015