2019-4-29-Roslyn-将这个文件放在你的项目文件夹,无论哪个控制台项目都会输出林德熙是逗比...
title | author | date | CreateTime | categories |
---|---|---|---|---|
Roslyn 将这个文件放在你的项目文件夹,无论哪个控制台项目都会输出林德熙是逗比
|
lindexi
|
2019-4-29 12:1:44 +0800
|
2018-11-01 15:40:29 +0800
|
Roslyn MSBuild 编译器
|
虽然已经通过很多篇博客告诉大家如何通过 Directory.Build.props 文件修改编译的方法,但是本文还是提供一个新的思路
只需要在项目文件夹,或者磁盘的文件夹,如 E:\
放下本文提供的 Directory.Build.props 文件,整个文件夹内的控制台项目就会输出 林德熙是逗比 想要知道是怎么做的,请看下面
在开始阅读本文之前,需要让大家知道什么是 Directory.Build.props 文件,这个文件是给在 VisualStudio 控制编译,可以用来控制 Directory.Build.props 文件所在的文件夹内的所有项目。
如我在 E:\lindexi
文件夹内放一个 Directory.Build.props
文件,在 E:\lindexi
文件夹内,如果有放工程,就可以通过这个文件修改。如我创建了工程 foo 这个工程的路径是 E:\lindexi\1\Foo\
那么这个工程就可以被这个文件修改
所以将 Directory.Build.props
文件 放在磁盘文件夹,如E:\\
就可以让整个放在 E:\\
的工程可以被这个文件修改
详细请看 Roslyn 使用 Directory.Build.props 文件定义编译
现在我告诉小伙伴,将这个文件放在你的文件夹内,然后他的控制台项目都会输出 林德熙是逗比是如何做到的?
实际上很简单,我只需要在 Directory.Build.props 定义编译过程,移除原来的所有文件,然后将 输出林德熙是逗比的文件加入到编译,这样就可以
于是来写一个简单的代码,输出 林德熙是逗比 代码很简单
using System; namespace CeseacooteeGowgu
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("林德熙是逗比");
}
}
}
那么现在的问题是,我刚才说的是将这个文件放在你的项目文件夹,但是要输出林德熙是逗比的代码需要放在一个文件,当然不能放两个文件,那么可以怎么做?简单的方法是使用Roslyn 使用 WriteLinesToFile 解决参数过长无法传入提供的方法,写入文件
先假设写入文件很简单,需要在 Directory.Build.props
文件添加文件所在的路径,然后移除其他的文件
<Project>
<Target Name="T1" BeforeTargets="BeforeBuild"> <PropertyGroup>
<SomeThing>$(IntermediateOutputPath)Foo.cs</SomeThing>
</PropertyGroup> <ItemGroup>
<Compile Remove="@(Compile)"></Compile>
<Compile Include="$(SomeThing)"></Compile>
</ItemGroup>
</Target> </Project>
这里的 SomeThing 就是写入代码的文件,关于 $(IntermediateOutputPath)
请看 项目文件中的已知属性(知道了这些,就不会随便在 csproj 中写死常量啦) - walterlv
在这个 Target 里面就定义了代码文件的路径,然后通过移除现在所有的文件,添加写入的文件的方法,让编译的时候运行的是输出 林德熙是逗比 这里需要注意的是 BeforeTargets
需要写为 编译之前,这样小伙伴看到自己的代码还是原来的代码,但是编译的时候是忽略小伙伴的代码编译刚才写的文件
那么文件写入有哪些难点?第一个就是换行,第二个就是 C# 代码使用分号作为行的最后。但是在 msbuild 使用 分号分开不同的项。在 xml 可以通过 CDATA 让内容不会被转义
<![CDATA[ 不进行转义代码 ]]>
然后可以使用 %3b
代替分号
现在看起来的代码是这样写
<Text>
<![CDATA[
using System%3b namespace CeseacooteeGowgu
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("林德熙是逗比")%3b
}
}
}
]]>
</Text>
只需要将代码写入文件就可以,在写入之前先删除原有的文件
<Target Name="T1" BeforeTargets="BeforeBuild"> <PropertyGroup>
<SomeThing>$(IntermediateOutputPath)Foo.cs</SomeThing>
<Text>
<![CDATA[
using System%3b namespace CeseacooteeGowgu
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("林德熙是逗比")%3b
}
}
}
]]>
</Text>
</PropertyGroup>
<Delete Files="$(SomeThing)" Condition="Exists($(SomeThing))"></Delete>
<WriteLinesToFile File="$(SomeThing)" Lines="$(Text)"></WriteLinesToFile>
<ItemGroup>
<Compile Remove="@(Compile)"></Compile>
<Compile Include="$(SomeThing)"></Compile>
</ItemGroup>
</Target>
全部的代码请看下面,只需要将这个文件放在小伙伴的项目文件夹,就可以让他的控制台项目输出 林德熙是逗比 当然大家可以修改输出,找小伙伴秀一下
<Project>
<Target Name="T1" BeforeTargets="BeforeBuild"> <PropertyGroup>
<SomeThing>$(IntermediateOutputPath)Foo.cs</SomeThing>
<Text>
<![CDATA[
using System%3b namespace CeseacooteeGowgu
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("林德熙是逗比")%3b
}
}
}
]]>
</Text>
</PropertyGroup>
<Delete Files="$(SomeThing)" Condition="Exists($(SomeThing))"></Delete>
<WriteLinesToFile File="$(SomeThing)" Lines="$(Text)"></WriteLinesToFile>
<ItemGroup>
<Compile Remove="@(Compile)"></Compile>
<Compile Include="$(SomeThing)"></Compile>
</ItemGroup>
</Target>
</Project>
2019-4-29-Roslyn-将这个文件放在你的项目文件夹,无论哪个控制台项目都会输出林德熙是逗比...的更多相关文章
- Cocos2dx-3.1.1 冒险01----> 文件夹结构、新项目project创建并执行
windows开发环境:window7.vs2012.python2.7.6 Cocos2d-x 3.1.1的完整文件夹例如以下:比起曾经的2.x的版本号来说分类更规范了 watermark/2/te ...
- Django 修改该项目文件夹、项目名及项目文件夹中同名文件夹,报错 ModuleNotFoundError: No module named 'untitled'
如果你直接重构项目文件夹名及重构项目名和重构项目文件夹内同名文件夹 执行项目报错 ModuleNotFoundError: No module named 'untitled' 请执行以下操作
- dll 日志文件 放在同一个目录。
string strPath = "log.txt"; 如果日志问价跟dll文件放在一起,直接这么些就可以了.
- django中,如何把所有models模型文件放在同一个app目录下?
django的每个app目录下,都有自己的models.py文件. 原则上,每个app涉及的数据库,都会定义在这个文件里. 但是,有的数据库,涉及到多个app应用,不是很方便放在一个单独的app里. ...
- 将properties文件放在Jar包并读取
有时候需要在一个library内部打包一个properties文件,包含一些配置信息,而不能部署在外部. 在maven工程里面,将properties文件放在src/main/resources目录下 ...
- Alpha冲刺(6/10)——2019.4.29
所属课程 软件工程1916|W(福州大学) 作业要求 Alpha冲刺(6/10)--2019.4.29 团队名称 待就业六人组 1.团队信息 团队名称:待就业六人组 团队描述:同舟共济扬帆起,乘风破浪 ...
- 解决找不到roslyn\csc.exe文件问题
csc.exe代表C# 编译器,所以在需要项目nuget包引用”Microsoft.CodeDom.Providers.DotNetCompilerPlatform“以及”Microsoft.Net. ...
- YMOI 2019.6.29
题解 YMOI 2019.6.29 放弃FAIOJ,用cena考了一次试.被全方位吊打.. T1 开灯 题面: 在一条无限长的路上,有一排无限长的路灯,编号为1,2,3,4,--. 每一盏灯只有两种可 ...
- Spring MVC -- UEditor 编辑器整合 上传图片至外部文件夹(非项目文件夹)
上传图片到外部储存,回显图片 下载全部UEditor资源源码 config.json配置 config.json中添加如下属性 (一定要添加此属性): "physicsPath": ...
- 输入一个字符串,内有数字和非数字字符。例如:a123x456 17960 302tab5876。将其中连续的数字作为一个整数,依次存放到一维数组a中,例如123放在a[0],456放在a[1]……统计共有多少个整数,并输出这些数。
题目内容:输入一个字符串,内有数字和非数字字符.例如:a123x456 17960 302tab5876.将其中连续的数字作为一个整数,依次存放到一维数组a中,例如123放在a[0],456放在a[1 ...
随机推荐
- WPF多数类概念性注册加自动扫描
在java中springboot的配置应用了自动扫描 @ComponentScan(value = {"com.example", "com.fox"}) 而对 ...
- WPF设置传参、点击按钮改变长度
前台代码 <!-- 通过传递ElementName --> <Button x:Name="btn1" Width="200" Height= ...
- KingbaseES 原生XML系列三--XML数据查询函数
KingbaseES 原生XML系列三--XML数据查询函数(EXTRACT,EXTRACTVALUE,EXISTSNODE,XPATH,XPATH_EXISTS,XMLEXISTS) XML的简单使 ...
- Android实现简单登录界面
LoginActivity 1 package com.example.myapplication; 2 3 import android.os.Bundle; 4 import android.vi ...
- Git 11 设置项目提交人
前面介绍了可以给 Git 设置全局提交人,这样当前电脑所有项目提交人都会变成设置的值. 但实际开发中有时候需要给不同项目设置不同提交人. 比如工作的项目是一个提交人,自己维护的开源项目又是另一个提交人 ...
- std::thread 三:条件变量(condition_variable())
condition_variable . wait . notify_one . notify_all *:notify_one:通知(唤醒)一个线程 *:notify_all:通知( ...
- keycloak~对架构提供的provider总结
提供者目录 Provider Authenticator BaseDirectGrantAuthenticator AbstractFormAuthenticator AbstractUsername ...
- 实验1 c语言开发环境使用和数据类型 运算符 表达式
#include<stdio.h> #include<stdlib.h> int main() { printf(" O\n"); printf(" ...
- 前端vue+elementUI如何实现记住密码功能
我们这回使用纯前端保存密码 既然是记住密码,前端也就是使用cookie保存,访问时用cookie读取 先来了解下cookie的基本使用吧 Cookie 所有的cookie信息都在document.co ...
- Excel 分组后计算
分组后的计算都类似,仍然采用 groups 函数,分组并同时计算出各洲的 GDP 总量,然后再求一遍各洲的 GDP 总量占全球 GDP 的百分比值. SPL 代码如下: A B 1 =clipbo ...