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 = $
  • 相关阅读:
    (原创)monitor H3C switch with cacti
    (原创)monitor Dell Powerconnec 6224 with cacti
    (转载)运行主机管理在openvswitch之上
    图片鼠标滑动实现替换
    分布式缓存(一)失效策略和缓存问题击穿,雪崩,穿透
    Spring 事务源码学习
    FactoryBean和BeanFactory
    Spring AOP 源码学习
    “两地三中心”和“双活”
    安装 geopandas 步骤
  • 原文地址:https://www.cnblogs.com/lindexi/p/12086436.html
Copyright © 2011-2022 走看看