我正在尝试Cake (C# Make)。到目前为止,所有示例和文档都有脚本文件在委托中声明其所有代码,如下所示:
Task("Clean")
.Does(() =>
{
// Delete a file.
DeleteFile("./file.txt");
// Clean a directory.
CleanDirectory("./temp");
});
Run Code Online (Sandbox Code Playgroud)
但是,我对使用 Cake 感兴趣的原因之一是可以以与编写代码的方式类似的方式编写构建脚本,因为脚本使用基于 C# 的 DSL。这种可能性包括将我使用的代码分离到方法(或函数/子例程,任何合适的术语)中的能力,这样我就可以分离关注点并重用代码。例如,我可能希望为多个 SKU 运行相同的一组步骤。
虽然我意识到我可以使用Script Aliases创建我自己的单独 DLL ,但我想避免每次在处理构建脚本时想要更改这些共享代码位时都必须重新编译单独的项目。有没有办法在普通build.cake文件中定义仍然可以运行 Cake 别名(例如,DeleteFile)并且可以从我的 Cake 任务中调用它们的方法?
.NET应用程序分布在称为程序集的文件中,该文件包含元数据和公共中间语言(CIL)代码。.NET遵循的标准 ECMA-335 II.3指出了两个相似的术语之间的区别:
如果装配符合标准,则该装配是有效的。
验证是指在任何文件上应用一组测试来检查文件的格式,元数据和CIL是否自洽。这些测试旨在确保文件符合本规范的规范要求。
如果程序集有效并且可以通过标准描述的静态分析算法证明该程序集是类型安全的,则该程序集是可验证的。
验证是指对CIL及其相关元数据的检查,以确保CIL代码序列不允许对程序逻辑地址空间外部的存储器进行任何访问。结合验证测试,验证可确保程序无法访问未授予其访问权限的内存或其他资源。
所有可验证的程序集都是有效的,但并非所有有效的程序集都是可验证的。此外,某些有效的程序集实际上可能是类型安全的,但是验证算法无法如此证明它们,因此它们不可验证。要使用标准中的图表:
.NET SDK提供了一个用于静态确定程序集是否可验证的工具:PEVerify。由于可验证的程序集也必须有效,因此,如果程序集无效,此工具还会报告错误。
然而,似乎没有成为一个相当的工具或程序来确定,如果一个组件只是有效。例如,如果我已经知道程序集是不可验证的,并且对此表示满意,那么我如何仍然确保运行时不会由于程序无效而出错?
我的测试用例:
.assembly extern mscorlib
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 )
.ver 4:0:0:0
}
.assembly MyAsm { }
.module MyAsm.exe
.corflags 0x00020003 // ILONLY 32BITPREFERRED
.class public Program
{
.method public static int32 EntryPoint(string[] args) cil managed
{
.maxstack 2
.entrypoint
call string [MyAsm]Program::normal()
call void [mscorlib]System.Console::WriteLine(string)
call string [MyAsm]Program::unverifiable_init()
call void …Run Code Online (Sandbox Code Playgroud) 据我了解,以下代码将创建一个看起来像“xxxx-xxxxx .. etc”的字符串
UserUId = Guid.NewGuid().ToString();
Run Code Online (Sandbox Code Playgroud)
我想做的是捕获前五个 x。我知道我可以这样做来获得前 4 个,但是如何跳过“-”并获得前 5 个,而无需先将 Guid 放入变量中,然后将该变量与子字符串一起使用两次。
UserUId = Guid.NewGuid().ToString().Substring(0, 4);
Run Code Online (Sandbox Code Playgroud)