zoukankan      html  css  js  c++  java
  • 2019-11-6-Roslyn-how-to-use-WriteLinesToFile-to-write-the-semicolons-to-file

    title author date CreateTime categories
    Roslyn how to use WriteLinesToFile to write the semicolons to file
    lindexi
    2019-11-06 19:13:42 +0800
    2018-11-1 16:9:1 +0800
    Roslyn MSBuild 编译器

    As you know, the WriteLinesToFile will separate the item by semicolons. How can we use WriteLinesToFile to write the semicolons to file?

    For example, we need to write the code below to file.

    Console.WriteLine("I am lindexi");

    As you can see, we can find some problems in the code.

    The first thing is the code include quotation mark that we can not write the code directly.

    We can use property item with "CDATA" that CDATA is defined as blocks of text that are not parsed by the parser.

        <PropertyGroup>
          <SomeThing>
           <![CDATA[
                    Console.WriteLine("I am lindexi");
           ]]>
          </SomeThing>
        </PropertyGroup>
        <WriteLinesToFile File="lindexi.cs" Lines="$(SomeThing)"></WriteLinesToFile>

    You can find that your content in the file misses the semicolons character.

    We can use %3b to replace the semicolons.

        <PropertyGroup>
          <SomeThing>
           <![CDATA[
                    Console.WriteLine("I am lindexi")%3b
           ]]>
          </SomeThing>
        </PropertyGroup>
        <WriteLinesToFile File="lindexi.cs" Lines="$(SomeThing)"></WriteLinesToFile>

    After you run the target, you can find a file named lindexi.cs added in your project.

     <Project Sdk="Microsoft.NET.Sdk">
    
      <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>netcoreapp2.1</TargetFramework>
      </PropertyGroup>
    
      <Target Name="T2" BeforeTargets="BeforeBuild">
        <PropertyGroup>
          <SomeThing>
           <![CDATA[
                    Console.WriteLine("I am lindexi")%3b
           ]]>
          </SomeThing>
        </PropertyGroup>
        <WriteLinesToFile File="lindexi.cs" Lines="$(SomeThing)"></WriteLinesToFile>
      </Target>
    
     </Project>

    Please open the file and then you can find the content in the file include the semicolons character.

    We can set the property in the WriteLinesToFile task to Overwrite the file.

    You can copy the code below to your project file and then run your project. You will see the console output something interesting.

      <Target Name="T1" BeforeTargets="BeforeBuild">
        <PropertyGroup>
          <SomeThing>
            <![CDATA[
    using System%3b
    
    namespace CeseacooteeGowgu
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("I am lindexi")%3b
            }
        }
    }
           ]]>
          </SomeThing>
        </PropertyGroup>
        <WriteLinesToFile File="lindexi.cs" Lines="$(SomeThing)" Overwrite="true"></WriteLinesToFile>
        <ItemGroup>
          <Compile Remove="@(Compile)"></Compile>
          <Compile Include="lindexi.cs"></Compile>
        </ItemGroup>
      </Target>

    I remove all your code and replace the code to the content in SomeThing property. And then I add the code that named lindexi.cs to compile.

    Using MSBuild Escape

    We can find this way should change the code. We can not copy the code in other to write to file and we should replace all the semicolons to %3b that is hard to change all the code.

    We can use MSBuild Escape to escape the semicolons and you can see the code.

      <Target Name="T1" BeforeTargets="BeforeBuild">
        <PropertyGroup>
          <SomeThing>
            <![CDATA[
    using System;
    
    namespace CeseacooteeGowgu
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("I am lindexi");
            }
        }
    }
           ]]>
          </SomeThing>
        </PropertyGroup>
        <WriteLinesToFile File="lindexi.cs" Lines="$([MSBuild]::Escape($(SomeThing)))" Overwrite="true"></WriteLinesToFile>
        <ItemGroup>
          <Compile Remove="@(Compile)"></Compile>
          <Compile Include="lindexi.cs"></Compile>
        </ItemGroup>
      </Target>

    The [MSBuild]::Escape can use property function to escape strings.

    How to: Escape Special Characters in MSBuild - Visual Studio

    In the CDATA section that follows,

    • %40 = @
    • %25 = %
    • %3B = ;
    • %24 = $
  • 相关阅读:
    Linux中将两块新硬盘合并成一个,挂载到/data目录下
    linux将硬盘格式化为xfs文件系统
    nginx配置文件
    centos 添加新硬盘,lvm对根目录扩容
    centos7重新调整分区大小
    Linux 一种调用蜂鸣器的方法
    mybatis中 keyProperty="id" 的作用
    MySQL实战45讲
    常用正则表达式最强整理(速查手册)
    linux下nacos的1.1.3版本集群部署
  • 原文地址:https://www.cnblogs.com/lindexi/p/12086435.html
Copyright © 2011-2022 走看看