2019-4-21-Roslyn-通过-NuGet-库修改应用程序入口函数
| title | author | date | CreateTime | categories |
|---|---|---|---|---|
|
Roslyn 通过 NuGet 库修改应用程序入口函数
|
lindexi
|
2019-4-21 17:37:1 +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-4-21-Roslyn-通过-NuGet-库修改应用程序入口函数的更多相关文章
- 2019-11-29-Roslyn-通过-NuGet-库修改应用程序入口函数
title author date CreateTime categories Roslyn 通过 NuGet 库修改应用程序入口函数 lindexi 2019-11-29 08:37:49 +080 ...
- 小白学 Python 爬虫(21):解析库 Beautiful Soup(上)
小白学 Python 爬虫(21):解析库 Beautiful Soup(上) 人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前 ...
- vs中使用过的扩展和好的nuget库
扩展 ReAttach ReAttach gives you an easy way to ReAttaching your prior debug targets. ReAttach stores ...
- 2019年11个javascript机器学习库
Credits: aijs.rocks 虽然python或r编程语言有一个相对容易的学习曲线,但是Web开发人员更喜欢在他们舒适的javascript区域内做事情.目前来看,node.js已经开始向每 ...
- 2019.3.18考试&2019.3.19考试&2019.3.21考试
2019.3.18 C O D E T1 树上直接贪心,环上for一遍贪心 哇说的简单,码了将近一下午终于码出来了 感觉自己码力/写题策略太糟糕了,先是搞了一个细节太多的写法最后不得不弃疗了,然后第二 ...
- 凹凸曼的修改zencart 程序(经典!)
==================================================================================================== ...
- 背景建模技术(三):背景减法库(BGS Library)的基本框架与入口函数main()的功能
背景减法库(BGS Library = background subtraction library)包含了37种背景建模算法,也是目前国际上关于背景建模技术研究最全也最权威的资料.本文将更加详细的介 ...
- gcc 头文件是用户应用程序和函数库之间的桥梁和纽带 功能的真正逻辑实现是以硬件层为基础
gcc GCC, the GNU Compiler Collection - GNU Project - Free Software Foundation (FSF) http://gcc.gnu.o ...
- 用PYTHON首选的GUI库WXPYTHON做程序界面
大家好,我是A8U神经网络,今天又要跟大家分享一下wxWidgets开发神经网络程序界面的一些经验,希望对开发有兴趣的朋友有所帮助.跨平台的GUI工具库以GTK +,Qt和wxWidgets闻名. G ...
随机推荐
- 【rust】Rust变量绑定(3)
Rust 是一个静态类型语言,这意味着我们需要先确定我们需要的类型. 什么是变量绑定? 将一些值绑定到一个名字上,这样可以在之后使用他们. 如何声明一个绑定? 使用 let 关键字: fn main( ...
- Form 表单用 Ajax 提交数据并用 jQuery Validate 验证
表单填写需要验证可用插件 jQuery Validate 提交数据使用 Ajax 可操控性得到提到 注意:请自行引入 jQuery 和 jQuery Validate HTML 代码 <form ...
- 【转】Java MySQL数据类型对照
Java MySQL数据类型对照 类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) 描述 VARCHAR L+N VARCHAR java.lang.S ...
- UVALive 6855 Banks (暴力)
Banks 题目链接: http://acm.hust.edu.cn/vjudge/contest/130303#problem/A Description http://7xjob4.com1.z0 ...
- Initialization of bean failed; nested exception is java.lang.
网上搜寻各种解说,applicationContext-hibernate.xml 配置错误,jar冲突等等 现场错误图: 解决方法: asm-attrs.jar cglib-nodep-2.1_3. ...
- 【转】GLSL资料收集
https://blog.csdn.net/u013467442/article/details/44457869 其中入门资料相当好:https://blog.csdn.net/racehorse/ ...
- TypeError: list indices must be integers or slices, not str
错误如下: TypeError: list indices must be integers or slices, not str 错误代码块: aa是一组list套dict数据 函数insert接收 ...
- Delphi XE2 之 FireMonkey 入门(2)
FireMonkey 的控件都是自己绘制的(而不是基于系统组件), 我想它们应该是基于一些基本图形; 就从基本图形开始吧. FMX.Objects 单元给出的类: TShape //基本图形的基类 T ...
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_07 缓冲流_7_练习_对文本的内容进行排序
出师表,按照12345678进行排序 使用Map集合进行排序 把内容都写到一行里面去了
- 阶段1 语言基础+高级_1-3-Java语言高级_1-常用API_1_第5节 String类_3_字符串的常量池
字符换是可以共享使用的,那么怎么去共享使用呢 三种方式去创建字符串.然后三种分别进行比较 3的地址和1.2的地址不一样 在堆里面有一块空间叫做字符串常量池,从jdk1.7开始.字符串常量池在堆中 字符 ...