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 = $
  • 相关阅读:
    网站SEO优化问答精选
    用eclipse怎样将本地的项目打成jar包上传到maven仓库
    查询linux机器的公网ip
    Srping mvc mabatis 报错 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):
    使用SecureCRT的SFTP在WINDOWS与LINUX之间传输文件(转载)
    苹果手机如何减少后台流量
    《图解CSS3——第4章 CSS3背景-2》
    《图解CSS3——第4章 CSS3背景-1》
    《图解CSS3——第3章 CSS3边框-4》
    《图解CSS3——第3章 CSS3边框-3》
  • 原文地址:https://www.cnblogs.com/lindexi/p/12086436.html
Copyright © 2011-2022 走看看