3)创建,测试,发布 第一个NET CORE程序
工具: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);
此代码会提示用户按任意键,然后在用户按键前暂停程序。
- 在菜单栏中,选择“生成” > “生成解决方案” 。 这会将程序编译成一种中间语言 (IL),然后由实时 (JIT) 编译器转换成二进制代码。
- 选择工具栏上含绿色箭头的“HelloWorld” 按钮,从而运行程序。
改进“Hello World”应用程序
改进应用程序,提示用户输入名字,并将其与日期和时间一同显示。 若要修改和测试程序,请执行以下操作:
- 在代码窗口中,在 static void Main(string[] args) 代码行后面的左括号和第一个右括号之间,输入以下 C# 代码:
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 变量。 最后,使用内插字符串在控制台窗口中显示这些值。
- 依次选择 “生成” > “生成解决方案” ,编译此程序。
- 选择工具栏上的绿色箭头、按 F5 或选择“调试” > “启动调试” 菜单项,在 Visual Studio 的调试模式下运行程序。 出现提示时,输入名称并按 Enter 键。
创建NET STANDARD类库 :
- 在“解决方案资源管理器”中,右键单击“ClassLibraryProjects”解决方案文件,然后从上下文菜单中选择“添加” > “新项目”。
- 在“添加新项目”对话框中,展开“Visual C#”节点,并依次选择“.NET Standard”节点和“类库(.NET Standard)”项目模板。 在“名称”文本框中,输入项目名称“StringLibrary”。 选择“确定”,创建类库项目。
然后,代码窗口在 Visual Studio 开发环境中打开。
- 请检查以确保库定目标到 .NET Standard 的正确版本。 右键单击“解决方案资源管理器”窗口中的库项目,再选择“属性”。 “目标框架”文本框显示定目标到 .NET Standard 2.0。
4.将代码窗口中的代码替换为以下代码,并保存文件:
using System; namespace StringLibrary
{
public static class StringExt
{
public static bool StartsWithUpper(this String str)
{
if (String.IsNullOrWhiteSpace(str))
return false; Char ch = str[];
return Char.IsUpper(ch);
}
}
}
4.右键类库,生成,没有错误的话应该生成成功。
以 NuGet 包的形式分发类库:
采用 NuGet 包的形式发布类库,让类库可供更多调用方使用
- 打开控制台窗口。 例如,在 Windows 任务栏的“有问题尽管问我” 文本框中,输入 Command Prompt(或缩写 cmd),然后选择“命令提示符” 桌面应用或按 Enter(如果已在搜索结果中选中控制台窗口),打开控制台窗口。
- 转到类库的项目目录。 除非重新配置了典型文件位置,否则文件通常位于 Documents\Visual Studio 2017\Projects\ClassLibraryProjects\StringLibrary 目录中。 此目录包含源代码和项目文件 StringLibrary.csproj 。
- 发出命令 dotnet pack --no-build。 此时,dotnet 实用工具会生成一个扩展名为 .nupkg 的包。
创建单元测试项目
- 在“解决方案资源管理器” 中,打开“NetCoreSolution” 解决方案节点的上下文菜单,再依次选择“添加” > “新项目” 。
- 在“添加新项目” 对话框中,选择“Visual C#” 节点。 然后,依次选择“.NET Core” 节点和“MSTest 测试项目(.NET Core)” 项目模板。 在“名称” 文本框中,输入项目名称“StringLibraryTest”。 选择“确定” ,创建单元测试项目。
备注:除了 MSTest 测试项目之外,还可以使用 Visual Studio 为 .NET Core 创建 xUnit 测试项目。
此时,Visual Studio 会创建项目,并在代码窗口中打开 UnitTest1.cs 文件。
单元测试模板创建的源代码负责执行以下操作:
它会导入 Microsoft.VisualStudio.TestTools.UnitTesting 命名空间,其中包含用于单元测试的类型。
向 UnitTest1 类应用 TestClassAttribute 特性。 测试类中标记有 [TestMethod] 属性的所有测试方法都会在单元测试运行时自动执行。
它会应用 TestMethodAttribute 属性,将 TestMethod1 定义为在单元测试运行时自动执行的测试方法。
- 在“解决方案资源管理器” 中,右键单击“StringLibraryTest” 项目的“依赖项” 节点,并从上下文菜单中选择“添加引用” 。
- 在“引用管理器” 对话框中,展开“项目” 节点,并选中“StringLibrary” 旁边的框。 添加对 StringLibrary 程序集的引用后,编译器可以查找 StringLibrary 方法。 选择“确定” 按钮。 这会添加对类库项目 StringLibrary 的引用。
添加并运行单元测试方法
运行单元测试时,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 方法。 由于测试方法在第一次遇到测试不通过时会立即失败,因此将调用方法重载,以便传递字符串来指明方法调用中使用的字符串值。
创建测试方法:
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using StringLibrary;
namespace StringLibraryTest
{
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestStartsWithUpper()
{
// Tests that we expect to return true.
string[] words = { "Alphabet", "Zebra", "ABC", "Αθήνα", "Москва" };
foreach (var word in words)
{
bool result = word.StartsWithUpper();
Assert.IsTrue(result,
String.Format("Expected for '{0}': true; Actual: {1}",
word, result));
}
} [TestMethod]
public void TestDoesNotStartWithUpper()
{
// Tests that we expect to return false.
string[] words = { "alphabet", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
"", ".", ";", " " };
foreach (var word in words)
{
bool result = word.StartsWithUpper();
Assert.IsFalse(result,
String.Format("Expected for '{0}': false; Actual: {1}",
word, result));
}
} [TestMethod]
public void DirectCallWithNullOrEmpty()
{
// Tests that we expect to return false.
string[] words = { string.Empty, null };
foreach (var word in words)
{
bool result = StringExt.StartsWithUpper(word);
Assert.IsFalse(result,
String.Format("Expected for '{0}': false; Actual: {1}",
word == null ? "<null>" : word, result));
}
}
}
}
- 请注意,TestStartsWithUpper 方法中测试的大写字符包括希腊文大写字母 alpha (U+0391) 和西里尔文大写字母 EM (U+041C),TestDoesNotStartWithUpper 方法中测试的小写字符包括希腊文小写字母 alpha (U+03B1) 和西里尔文小写字母 Ghe (U+0433)。
- 在菜单栏上,选择“文件” > “将 UnitTest1.cs 另存为” 。 在“文件另存为” 对话框中,选择“保存” 按钮旁边的箭头,然后选择“保存时使用编码” 。
- 在“确认另存为” 对话框中,选择“是” 按钮,保存文件。
- 在“高级保存选项” 对话框的“编码” 下拉列表中,选择“Unicode (UTF-8 带签名) - 代码页 65001” ,然后选择“确定” 。
如果无法将源代码保存为 UTF8 编码文件,Visual Studio 可能会将其另存为 ASCII 文件。 在这种情况下,运行时将无法准确解码 ASCII 范围以外的 UTF8 字符,且测试结果也会不准确。
- 在菜单栏上,选择“测试” > “运行” > “所有测试” 。 此时,“测试资源管理器” 窗口打开并显示测试已成功运行。 “通过的测试” 部分列出了三个测试,“摘要” 部分报告了测试运行结果。
处理未通过的测试
由于运行的测试均通过,因此需进行少量改动,以使其中一个测试方法失败:
- 通过修改 TestDoesNotStartWithUpper 方法中的 words 数组来包含字符串“Error”。 由于 Visual Studio 将在生成运行测试的解决方案时自动保存打开的文件,因此无需手动保存。
string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство", "1234", ".", ";", " " };
- 从菜单栏中选择“测试” > “运行” > “所有测试” ,运行测试。 “测试资源管理器” 窗口指示有两个测试成功,还有一个失败。
- 在“未通过的测试” 部分中,选择未通过的测试 TestDoesNotStartWith。 “测试资源管理器”窗口显示断言生成的消息: “Assert.IsFalse 失败。 “Error”应返回 false;实际返回 True”。 由于此次失败,数组中“Error”之后的所有字符串都未进行测试。
- 撤消在步骤 1 中执行的修改并删除字符串“Error”。 重新运行测试,测试将通过。
发 布:
测试类库成功之后,我们在控制台应用中可以使用我们写的类库了。右键-引用 添加StringLibrary项目;
在输出控制台转换我们输出的字符,代码:
static void Main(string[] args)
{
Console.WriteLine("\nWhat is your name? ");
var name = Console.ReadLine();
var date = DateTime.Now;
Console.WriteLine($"\nHello,{name} 是否大写开始:{name.StartsWithUpper()}, on {date:d} at {date:t}!");
Console.Write("\nPress any key to exit...");
Console.ReadKey(true);
}
将工具栏上的生成配置设置从“Debug 更改为“Release” 。
右键单击“MyConsoleApp” 项目(而不是 NetCoreSolution 解决方案),然后选择菜单中的“发布” 。 还可以选择 “生成” Visual Studio 主菜单中的 “发布 MyConsoleApp” 。
- 打开控制台窗口。 例如,在 Windows 任务栏的“在此处键入内容以进行搜索” 文本框中,输入“Command Prompt”(或缩写“cmd”),再选择“命令提示符” 桌面应用程序或按 Enter(如果已在搜索结果中选择),打开控制台窗口。
- 导航到已发布的应用程序,它位于应用程序项目目录的 bin\Release\netcoreapp2.2\publish\ 子目录中。 如下图所示,已发布的输出包括以下四个文件:
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 命令来运行应用程序。
3)创建,测试,发布 第一个NET CORE程序的更多相关文章
- 使用Visual Studio 2008创建你的第一个Windows Mobile程序介绍
使用Visual Studio 2008创建你的第一个Windows Mobile程序介绍 Windows MobileMobileWindowsMicrosoftWinForm 介绍 Microso ...
- 【.net core 0基础】创建你的第一个.net core应用
1.下载.NET core相应的SDK,https://dotnet.microsoft.com/download 2.安装完成后,打开命令提示符,输入命令 dotnet,检查是否正确安装,如果命令能 ...
- Angular CLI 创建你的第一个 Angular 示例程序
第一步:安装 Angular CLI 你要使用 Angular CLI 来创建项目.创建应用和库代码,并执行多种开发任务,比如测试.打包和发布. 全局安装 Angular CLI. 要想使用 npm ...
- 创建你的第一个Flutter应用程序
前言 Flutter,Google推出的跨平台开发框架.就在前几天,Flutter的首个发布预览版(Release Preview 1)正式发布! 即将迎来Flutter 正式版(1.0).本篇将带你 ...
- 运行第一个.net core程序
前置条件 ubuntu已安装.net core运行环境 分6步 mkdir netcore 创建一个项目文件夹 cd netcore 进入该文件夹 dotnet new new命令 用于创建一个 ...
- 如何发布第一个WP8.1程序(VisualStudio2015)
学习WP开发有一段时间了,近一个月开始着手开发程序,并在开发程序中不断地学习(有一定的基础后,边开发程序,边学习是很好的,能练习运用所学的知识,并能在遇到问题后上网上资料不断地学习,很有效果,因为老是 ...
- NET Core MVC 在linux上的创建及发布
NET Core MVC 在linux上的创建及发布 前言 ASP.NET core转眼都发布半月多了,社区最近也是非常活跃,虽然最近从事python工作,但也一直对.NET念念不忘,看过了园区大神们 ...
- dotnet core 发布只有一个 exe 的方法
在 dotnet core 发布的时候,会使用很多文件,这样发给小伙伴使用的时候不是很清真,本文告诉大家一个非官方的方法通过 warp 将多个文件打包为一个文件 和之前相同的方式发布一个 dotnet ...
- 将Windows系统编译的.NET Core程序发布到Ubuntu系统
在可移植方面.NET Core应用程序分为两种,Portable application(便捷,需要目标机器安装.NET Core Runtime)和Self-contained applicatio ...
随机推荐
- mint-ui里面的MessageBox怎么去判断确认还是取消
MessageBox.confirm('', { title: '请注意', message: '添加供应商前,请先搜索该供应商是否存在,请勿重复添加', showCancelButton: true ...
- MongoDB 高级查询_aggregate聚合管道
MongoDB 聚合管道(AggregationPipeline) 使用聚合管道可以对集合中的文档进行变换和组合.实际项目应用主要是表关联查询.数据的统计. MongoDB 中使用 db.COLLEC ...
- Java 8 创建 Stream 的 10 种方式,我保证你受益无穷!
之前栈长分享过 Java 8 一系列新特性的文章,其中重点介绍了 Stream. 获取上面这份 Java 8~12 系列新特性干货文章,请在微信搜索关注微信公众号:Java技术栈,在公众号后台回复:j ...
- Unity3D小知识
下载离线Unity3D官方文档 Unity同时打开多个场景(Multi-Scene editing) Unity将资源导出成package实现资源重用 Animator不一定只能用来做动画,也可以当状 ...
- 剑指offer:左旋转字符串
题目描述: 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S=”ab ...
- ubuntu16.04 安装使用meld及问题
本文链接:https://blog.csdn.net/ai_liuliu/article/details/95504095安装meldsudo apt-get install meld启动meld方法 ...
- 堆排序Heapsort的Java和C代码
Heapsort排序思路 将整个数组看作一个二叉树heap, 下标0为堆顶层, 下标1, 2为次顶层, 然后每层就是"3,4,5,6", "7, 8, 9, 10, 11 ...
- egg.js 相关
egg sequelize 建表规范 CREATE TABLE `wx_member` ( `id` ) NOT NULL AUTO_INCREMENT COMMENT 'primary key' ...
- SQL 对decimal类型转换为int类型
) AS INT) CountQty select ISNULL( CAST(E.Qty AS INT),0 ) FROM OrderDetail E 空值 需要默认为0 即可
- Qt QJson解析json数据
Qt QJson解析json数据 //加载根目录文件 void TeslaManageData::loadRootFolderFiles() { QNetworkAccessManager *mana ...