工具:Visual Studio Code 或者 Visual Studio
环境:.NET CORE 2.0
VS Code很强大 当然支持netcore的开发,但是我还是选择更熟悉更强大的VS。
vs2017或最新2019都自带netcore,如果没有你要的版本,可以自己手动下载,地址:https://dotnet.microsoft.com/download
创建项目:
1) 启动 Visual Studio 2017。 从菜单栏中选择“文件” > “新建” > “项目” 。 在“新项目” *对话框中,依次选择“Visual C#” 和“.NET Core” 节点。 然后,选择“控制台应用程序(.NET Core)” 项目模板。 在“名称” 文本框中,键入“HelloWorld”。 选择“确定” 按钮。
2) Visual Studio 使用模板创建项目。 C# .NET Core 控制台应用程序模板会自动定义类 Program 和一个需要将 String 数组用作自变量的方法 Main。 Main 是应用程序入口点,同时也是在应用程序启动时由运行时自动调用的方法。 args 数组中包含在应用程序启动时提供的所有命令行自变量。
对比framework 除了依赖项(引用)有点差异其他都差不多.
3) 若要在应用程序关闭控制台窗口前将其暂停,请在调用 Console.WriteLine(String) 方法后立即添加下列代码:
Console.Write("Press any key to continue..."); Console.ReadKey(true);
此代码会提示用户按任意键,然后在用户按键前暂停程序。
改进“Hello World”应用程序
改进应用程序,提示用户输入名字,并将其与日期和时间一同显示。 若要修改和测试程序,请执行以下操作:
Console.WriteLine("\nWhat is your name? "); var name = Console.ReadLine(); var date = DateTime.Now; Console.WriteLine($"\nHello, {name}, on {date:d} at {date:t}!"); Console.Write("\nPress any key to exit..."); Console.ReadKey(true);
替换 Main 方法的内容。
此代码在控制台中显示“What is your name?”, 然后等待用户输入字符串并按 Enter 键。 它将此字符串存储到名为 name 的变量中。 它还会检索 DateTime.Now 属性的值(其中包含当前的本地时间),并将此值赋给 date 变量。 最后,使用内插字符串在控制台窗口中显示这些值。
创建NET STANDARD类库 :
然后,代码窗口在 Visual Studio 开发环境中打开。
4.将代码窗口中的代码替换为以下代码,并保存文件:
1 using System; 2 3 namespace StringLibrary 4 { 5 public static class StringExt 6 { 7 public static bool StartsWithUpper(this String str) 8 { 9 if (String.IsNullOrWhiteSpace(str)) 10 return false; 11 12 Char ch = str[0]; 13 return Char.IsUpper(ch); 14 } 15 } 16 }
4.右键类库,生成,没有错误的话应该生成成功。
以 NuGet 包的形式分发类库:
采用 NuGet 包的形式发布类库,让类库可供更多调用方使用
创建单元测试项目
备注:除了 MSTest 测试项目之外,还可以使用 Visual Studio 为 .NET Core 创建 xUnit 测试项目。
此时,Visual Studio 会创建项目,并在代码窗口中打开 UnitTest1.cs 文件。
单元测试模板创建的源代码负责执行以下操作:
它会导入 Microsoft.VisualStudio.TestTools.UnitTesting 命名空间,其中包含用于单元测试的类型。
向 UnitTest1 类应用 TestClassAttribute 特性。 测试类中标记有 [TestMethod] 属性的所有测试方法都会在单元测试运行时自动执行。
它会应用 TestMethodAttribute 属性,将 TestMethod1 定义为在单元测试运行时自动执行的测试方法。
添加并运行单元测试方法
运行单元测试时,Visual Studio 执行单元测试类(对其应用了 TestClassAttribute 特性的类)中标记有 TestMethodAttribute 特性的所有方法。 当第一次遇到测试不通过或测试方法中的所有测试均已成功通过时,测试方法终止。
最常见的测试调用 Assert 类的成员。 许多断言方法至少包含两个参数,其中一个是预期的测试结果,另一个是实际的测试结果。 下表显示了最常调用的一些方法。
断言方法 |
函数 |
Assert.AreEqual |
验证两个值或对象是否相等。 如果值或对象不相等,则断言失败。 |
Assert.AreSame |
验证两个对象变量引用的是否是同一个对象。 如果这些变量引用不同的对象,则断言失败。 |
Assert.IsFalse |
验证条件是否为 false。 如果条件为 true,则断言失败。 |
Assert.IsNotNull |
验证对象是否不为 null。 如果对象为 null,则断言失败。 |
还可向测试方法应用 ExpectedExceptionAttribute 特性。 它指明了测试方法预计会引发的异常类型。 如果未抛出指定异常,则测试不通过。
测试 StringLibrary.StartsWithUpper 方法时,需要提供许多以大写字符开头的字符串。 在这种情况下,此方法应返回 true,以便可以调用 IsTrue 方法。 同样,需要提供许多以非大写字符开头的字符串。 在这种情况下,此方法应返回 false,以便可以调用 IsFalse 方法。
由于库方法处理的是字符串,因此还需要确保它能够成功处理空字符串 (String.Empty)(不含字符且 Length 为 0 的有效字符串)和 null 字符串(尚未初始化的字符串)。 如果对 String 实例调用 StartsWithUpper 作为扩展方法,无法向其传递 null 字符串。 不过,还可以直接将其作为静态方法进行调用,并向其传递一个 String 自变量。
将定义三个方法,每个方法都会对字符串数组中的各个元素反复调用它的 Assert 方法。 由于测试方法在第一次遇到测试不通过时会立即失败,因此将调用方法重载,以便传递字符串来指明方法调用中使用的字符串值。
创建测试方法:
1 using System; 2 using Microsoft.VisualStudio.TestTools.UnitTesting; 3 using StringLibrary; 4 namespace StringLibraryTest 5 { 6 [TestClass] 7 public class UnitTest1 8 { 9 [TestMethod] 10 public void TestStartsWithUpper() 11 { 12 // Tests that we expect to return true. 13 string[] words = { "Alphabet", "Zebra", "ABC", "Αθ?να", "Москва" }; 14 foreach (var word in words) 15 { 16 bool result = word.StartsWithUpper(); 17 Assert.IsTrue(result, 18 String.Format("Expected for ‘{0}‘: true; Actual: {1}", 19 word, result)); 20 } 21 } 22 23 [TestMethod] 24 public void TestDoesNotStartWithUpper() 25 { 26 // Tests that we expect to return false. 27 string[] words = { "alphabet", "zebra", "abc", "αυτοκινητοβιομηχαν?α", "государство", 28 "1234", ".", ";", " " }; 29 foreach (var word in words) 30 { 31 bool result = word.StartsWithUpper(); 32 Assert.IsFalse(result, 33 String.Format("Expected for ‘{0}‘: false; Actual: {1}", 34 word, result)); 35 } 36 } 37 38 [TestMethod] 39 public void DirectCallWithNullOrEmpty() 40 { 41 // Tests that we expect to return false. 42 string[] words = { string.Empty, null }; 43 foreach (var word in words) 44 { 45 bool result = StringExt.StartsWithUpper(word); 46 Assert.IsFalse(result, 47 String.Format("Expected for ‘{0}‘: false; Actual: {1}", 48 word == null ? "<null>" : word, result)); 49 } 50 } 51 } 52 }
如果无法将源代码保存为 UTF8 编码文件,Visual Studio 可能会将其另存为 ASCII 文件。 在这种情况下,运行时将无法准确解码 ASCII 范围以外的 UTF8 字符,且测试结果也会不准确。
处理未通过的测试
由于运行的测试均通过,因此需进行少量改动,以使其中一个测试方法失败:
string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχαν?α", "государство", "1234", ".", ";", " " };
发 布:
测试类库成功之后,我们在控制台应用中可以使用我们写的类库了。右键-引用 添加StringLibrary项目;
在输出控制台转换我们输出的字符,代码:
1 static void Main(string[] args) 2 { 3 Console.WriteLine("\nWhat is your name? "); 4 var name = Console.ReadLine(); 5 var date = DateTime.Now; 6 Console.WriteLine($"\nHello,{name} 是否大写开始:{name.StartsWithUpper()}, on {date:d} at {date:t}!"); 7 Console.Write("\nPress any key to exit..."); 8 Console.ReadKey(true); 9 }
将工具栏上的生成配置设置从“Debug 更改为“Release” 。
右键单击“MyConsoleApp” 项目(而不是 NetCoreSolution 解决方案),然后选择菜单中的“发布” 。 还可以选择 “生成” Visual Studio 主菜单中的 “发布 MyConsoleApp” 。
1. MyConsoleApp.deps.json
应用程序的运行时依赖项文件。 它定义了运行应用程序所需的 .NET Core 组件和库(包括包含该应用程序的动态链接库)。 有关详细信息,请参阅运行时配置文件。
2. MyConsoleApp.dll
包含应用程序的文件。 它是一个动态链接库,可通过在控制台窗口中输入 dotnet MyConsoleApp.dll 命令来执行。
3. MyConsoleApp.pdb (对于部署是可选的)
包含调试符号的文件。 尽管应在需要调试应用程序的已发布版本时保存此文件,但无需将此文件与应用程序一起部署。
4. MyConsoleApp.runtimeconfig.json
应用程序的运行时配置文件。 它标识用于运行应用程序的 .NET Core 版本。 有关详细信息,请参阅运行时配置文件。
发布过程中会生成依赖于框架的部署,在此类部署中,若系统上安装了 .NET Core,已发布的应用程序可在 .NET Core 支持的任何平台上运行。 用户可以通过在控制台窗口中发出 dotnet MyConsoleApp.dll 命令来运行应用程序。
原文:https://www.cnblogs.com/rbsky/p/11431805.html