2019-11-29-Roslyn-通过-NuGet-库修改应用程序入口函数
title | author | date | CreateTime | categories |
---|---|---|---|---|
Roslyn 通过 NuGet 库修改应用程序入口函数
|
lindexi
|
2019-11-29 08:37:49 +0800
|
2019-04-21 16:46:29 +0800
|
Roslyn MSBuild 编译器
|
我和小伙伴说只要你安装我的 NuGet 库无论你怎么做,都会调用我的 Main 函数,默认的主函数不会调用
在程序编译的时候可以通过指定 StartupObject 指定某个命名空间里面的某个类的主函数作为入口
在做 NuGet 包可以通过 Build 文件夹里面添加一些有趣的代码,简单的调试请创建一个简单的 Nuget 包,创建方法请看 VisualStudio 使用新项目格式快速打出 Nuget 包
在做一个 Nuget 包的时候可以直接纯手工写一个 nuget 包,或者修改现有的 Nuget 包文件
如我使用新项目格式打出一个 lindexi 的包,我通过安装本地nuget包
安装完成可以在用户名的 .nuget 文件夹找到
c:\Users\lindexi\.nuget\packages\lindexi\1.0.0\
在这个文件夹里面创建 Build 文件夹,在 Build 文件夹创建 nuget 库的 id .targets
文件,如我这里的是 lindexi 就创建 lindexi.targets 文件,此时看到的文件夹如下
│ .nupkg.metadata
│ lindexi.1.0.0.nupkg
│ lindexi.1.0.0.nupkg.sha512
│ lindexi.nuspec
│
├─build
│ lindexi.targets
│
├─package
│ └─services
│ └─metadata
│ └─core-properties
└─_rels
在 lindexi.targets 文件里面可以尝试添加代码,在测试的项目每次都需要运行 git clean -xdf 清理之后才可以使用 dotnet run 运行,这样就可以减少打包
在 targets 文件里面写的内容,只需要下一次在测试项目使用 dotnet run 就会使用
先通过WriteLinesToFile写一个新的文件,这个文件里面包括主函数
然后在 StartupObject
指定入口函数为刚才创建的文件
在 targets 文件定义临时文件的存放的路径
<PropertyGroup>
<_GeneratedEntryPointFile>$(IntermediateOutputPath)$(MSBuildProjectName).Program.g$(DefaultLanguageSourceExtension)</_GeneratedEntryPointFile>
</PropertyGroup>
这里的 $(IntermediateOutputPath)
是常量,更多请看项目文件中的已知属性(知道了这些,就不会随便在 csproj 中写死常量啦) - walterlv
上面代码是定义路径是 obj 文件夹的 xx.Program.g.cs 的文件
然后写入新的代码
<PropertyGroup>
<_GeneratedProgramFileContent > <![CDATA[
// <auto-generated>This file was created automatically</auto-generated>
using System;
using System.Runtime.CompilerServices; namespace Lindexi
{
[CompilerGenerated]
class Program
{
static void Main(string[] args)
{
Console.WriteLine("林德熙是逗比");
}
}
} ]]> </_GeneratedProgramFileContent> </PropertyGroup>
将代码写入到文件可以使用WriteLinesToFile写入到上面定义的文件
注意文件里面有逗号,在Roslyn how to use WriteLinesToFile to write the semicolons to file告诉大家如何解决逗号的坑
<WriteLinesToFile File="$(_GeneratedEntryPointFile)"
Overwrite="true"
Lines="$([MSBuild]::Escape($(_GeneratedProgramFileContent)))"
Encoding="Unicode"/>
文件写入之后还需要添加文件到编译
<ItemGroup>
<Compile Include="$(_GeneratedEntryPointFile)" />
</ItemGroup>
因为文件需要编译,所以这个时机需要 CoreCompile 之前,需要设置启动项目为这个文件,全部代码有点长
<Project> <PropertyGroup>
<_GeneratedEntryPointFile>$(IntermediateOutputPath)$(MSBuildProjectName).Program.g$(DefaultLanguageSourceExtension)</_GeneratedEntryPointFile>
</PropertyGroup> <Target Name="_GenerateRealEntryPointType"
BeforeTargets="CoreCompile"
DependsOnTargets="PrepareForBuild;CoreGenerateDragonFruitProgramFile"
Condition="'$(DisableAutoGeneratedMain)' != 'true'">
<PropertyGroup>
<StartupObject>Lindexi.Program</StartupObject>
</PropertyGroup>
</Target> <Target Name="CoreGenerateDragonFruitProgramFile"
Condition="'$(Language)' == 'C#'"
Outputs="$(_GeneratedEntryPointFile)"> <PropertyGroup>
<_GeneratedProgramFileContent > <![CDATA[
// <auto-generated>This file was created automatically</auto-generated>
using System;
using System.Runtime.CompilerServices; namespace Lindexi
{
[CompilerGenerated]
class Program
{
static void Main(string[] args)
{
Console.WriteLine("林德熙是逗比");
}
}
} ]]> </_GeneratedProgramFileContent> </PropertyGroup> <WriteLinesToFile File="$(_GeneratedEntryPointFile)"
Overwrite="true"
Lines="$([MSBuild]::Escape($(_GeneratedProgramFileContent)))"
Encoding="Unicode"/> <ItemGroup>
<Compile Include="$(_GeneratedEntryPointFile)" />
</ItemGroup>
</Target>
</Project>
通过这个方法就可以修改应用程序的入口,将入口程序修改为特殊的,那么这样有什么用?在System.CommandLine就使用这个方法让用户可以写出多个参数的主函数
关于System.CommandLine请看dotnet 使用 System.CommandLine 写命令行程序
更多编译相关请看手把手教你写 Roslyn 修改编译
2019-11-29-Roslyn-通过-NuGet-库修改应用程序入口函数的更多相关文章
- 2019-4-21-Roslyn-通过-NuGet-库修改应用程序入口函数
title author date CreateTime categories Roslyn 通过 NuGet 库修改应用程序入口函数 lindexi 2019-4-21 17:37:1 +0800 ...
- 2019.11.29 Mysql的数据操作
为名为name的表增加数据(插入所有字段) insert into name values(1,‘张三’,‘男’,20); 为名为name的表增加数据(插入部分字段) insert into name ...
- 2019.11.29 SAP SMTP郵件服務器配置 發送端 QQ郵箱
今天群裏的小夥伴問了如何配置郵件的問題,隨自己在sap裏面配置了一個 1. RZ10配置參數 a) 参数配置前,先导入激活版本 执行完毕后返回 b) 输入参数文件DEFAU ...
- pycharm+anaconda在Mac上的配置方法 2019.11.29
内心os: 听人说,写blog是加分项,那他就不是浪费时间的事儿了呗 毕竟自己菜还是留下来东西来自己欣赏吧 Mac小电脑上进行python数据开发环境的配置 首先下载Anaconda,一个超好用的数据 ...
- Supervision meeting notes 2019/11/29
topic 分支: 1. subgraph/subsequence mining Wang Jin, routine behavior/ motif. Philippe Fournier Viger ...
- EOJ Monthly 2019.11 E. 数学题(莫比乌斯反演+杜教筛+拉格朗日插值)
传送门 题意: 统计\(k\)元组个数\((a_1,a_2,\cdots,a_n),1\leq a_i\leq n\)使得\(gcd(a_1,a_2,\cdots,a_k,n)=1\). 定义\(f( ...
- Alpha冲刺(6/10)——2019.4.29
所属课程 软件工程1916|W(福州大学) 作业要求 Alpha冲刺(6/10)--2019.4.29 团队名称 待就业六人组 1.团队信息 团队名称:待就业六人组 团队描述:同舟共济扬帆起,乘风破浪 ...
- 2019.11.9 csp-s 考前模拟
2019.11.9 csp-s 考前模拟 是自闭少女lz /lb(泪奔 T1 我可能(呸,一定是唯一一个把这个题写炸了的人 题外话: 我可能是一个面向数据编程选手 作为一个唯一一个写炸T1的人,成功通 ...
- vs中使用过的扩展和好的nuget库
扩展 ReAttach ReAttach gives you an easy way to ReAttaching your prior debug targets. ReAttach stores ...
随机推荐
- linux读xml文件问题
由于从配置文件中读取到的路径名的最后多了个0x0A,害我折腾了半天. 提示也很奇葩: I/O warning : failed to load external entity 关键是从这个提示看不出是 ...
- 一张图搞懂Ajax原理
本文整理在,我的github上.欢迎Star. 原理 说起ajax,就不得不说他背后的核心对象XMLHttpRequest,而说到XMLHttpRequest我觉得,从它的readyState状态说起 ...
- CentOS下安装完php外网无法访问的问题
1. cd /etc/selinux/ vim config SELINUX=disabled 2.通过界面关闭防火墙
- JavaScript高级编程学习笔记(第三章之一)
继续记笔记,JavaScript越来越有意思了. 继续... 第三章:JavaScript基础 ECMAScript语法在很大程度上借鉴了C和其它类似于C的语言,比如Java和Perl. 大小写敏感: ...
- Android开发 移动端适配
1 UI自适应(UGUI) UI自适应又分为锚点自适应和缩放.锚点主要控制UI控件在父控件之中的位置,同时也能影响缩放. 锚点自适应缩放: 我们使用UGUI创建一个界面,设计使用1920x1080分辨 ...
- Leetcode之动态规划(DP)专题-53. 最大子序和(Maximum Subarray)
Leetcode之动态规划(DP)专题-53. 最大子序和(Maximum Subarray) 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. ...
- 【机器学习实践】Jupyter Notebook安装 侧边导航栏功能 操作及其他常用扩展功能介绍
安装过程: 1. 首先我们引入jupyter_contrib_nbextension这个第三方库. 2. 在Anaconda Promot中输入命令: pip install jupyter_con ...
- 纯css实现单选框样式
html代码 <h2>你最喜欢的水果</h2> <div class="input-radio"> <!-- 选中状态添加 checked ...
- IIS写权限漏洞和XFF刷票原理
IIS写权限漏洞 PUT写入漏洞 此漏洞主要是因为服务器开启了webdav的组件导致的 1.扫描漏洞,yes,可以PUT: 2.用老兵的工具上传一句话文件test.txt,然后move改名为shell ...
- mysql 相关文章
<58到家MySQL军规升级版> <数据库索引,到底是什么做的?> <MyISAM与InnoDB的索引差异究竟是啥?> <InnoDB,为何并发如此之高?&g ...