在本文中,您将会了解到关于Docker在Windows上运行NetCore系列的新资讯,同时我们还将为您解释一使用命令控制台运行.NetCore控制台应用的相关在本文中,我们将带你探索Docker在W
在本文中,您将会了解到关于Docker在Windows上运行NetCore系列的新资讯,同时我们还将为您解释一使用命令控制台运行.NetCore控制台应用的相关在本文中,我们将带你探索Docker在Windows上运行NetCore系列的奥秘,分析一使用命令控制台运行.NetCore控制台应用的特点,并给出一些关于(转).Net Core控制台生成exe能独立运行、.NET Core 2.1 以下的控制台应用程序生成 EXE,且使用命令行参数动态运行控制器应用程序的示例、.Net Core 3.1 异步控制台应用程序在 VS 之外运行时挂起、.Net Core 实践 - 如何在控制台应用(.Net Core)使用appsettings.json配置的实用技巧。
本文目录一览:- Docker在Windows上运行NetCore系列(一)使用命令控制台运行.NetCore控制台应用
- (转).Net Core控制台生成exe能独立运行
- .NET Core 2.1 以下的控制台应用程序生成 EXE,且使用命令行参数动态运行控制器应用程序的示例
- .Net Core 3.1 异步控制台应用程序在 VS 之外运行时挂起
- .Net Core 实践 - 如何在控制台应用(.Net Core)使用appsettings.json配置
Docker在Windows上运行NetCore系列(一)使用命令控制台运行.NetCore控制台应用
原文: Docker在Windows上运行NetCore系列(一)使用命令控制台运行.NetCore控制台应用
系列文章:https://www.cnblogs.com/alunchen/p/10121379.html
本篇文章操作系统信息
Windows:Window 10
Visual Studio:2017 15.8.0
创建项目并添加Dockerfile
在VS2017及以上版本上创建一个控制台项目,这里的名称叫【ConsoleAppDockerWindows2】。
创建DockerFile文件
1)右键项目 --> 选中【添加】 --> 选中【容器业务流程协调程序支持】
2)选择【Docker Compose】
3)目标OS:选择【Windows】
创建后的解析
创建完成后,可以看到项目中多了DockerFile文件,并且也多了docker-compose的项目。我们着重看DockerFile文件,因为此文件是程序运行在Docker中的配置文件。而docker-compose可以删除,其作用是在告诉VS所要运行docker的入口点,并且可以定义多个不同容器中的依赖关系来运行。这里不讲述docker-compose。
因为我们在VS中运行Docker,建议不要删除。
怎么运行呢?
通过命令运行Dockerfile并生成镜像
当完成创建Dockerfile文件后,在控制台可以看到此镜像已经安装在docker里面了。
并且通过 【docker ps -a】查看到已经添加到本地docker容器中。
即当在VS中创建Dockerfile时,会自动地把程序添加到本地镜像与容器中。
运行程序有很多种方法:
1)点击VS中运行 Docker 按钮,直接就可以运行
2)通过命令运行。
第一种就不介绍了,界面华完成。
第二种介绍一下。主要为了适应以后Linux的操作。
通过命令运行docker
步骤是:编译项目->添加到镜像->将镜像添加到容器
1)首先打开项目在本地包含Dockerfile的路径,路径里面必须有Dockerfile的文件。
并且修改一下Dockerfile文件,主要修改一下路径
2)然后生成镜像,运行命令【docker build -t consoleappdockerwindows2-cmd . 】
如图:
看到上图运行成功。
运行生成运行的命令,首先会去找到Dockerfile文件,然后根据此文件配置下载需要的环境。
输入【docker image】,可以看到运行镜像已经存在了
3)把镜像添加到容器中并运行
使用docker run 【镜像id】,就能运行镜像了:
下面说明说明一下Dockerfile
docker命令(FROM,COPY,RUN等)开头,每个命令将按从上到下的顺序执行。
- FROM:指定要使用的docker镜像,在第1行中我们指定了用于运行应用程序的microsoft/dotnet:2.1-runtime-nanoserver-1803映像。
- WORKDIR:指定image的工作目录。我们这里使用/ app作为我们的运行程序目录、/src编译目录。
- COPY:将文件从本地文件系统复制到映像中。第一个COPY是将本地的csproj文件复制到image中,第二个COPY是将当前所有文件复制到image中。 复制我们将最初复制csproj文件并运行restore然后复制所有剩余文件并运行dotnet publish来构建我们的应用程序。
系列文章
Docker在Linux/Windows上运行NetCore文章系列
可以关注本人的公众号,多年经验的原创文章共享给大家。
(转).Net Core控制台生成exe能独立运行
原文介绍了两种方式,方式一经测试可用(生成exe在开发机器上可运行),但是因为服务器是windows server2012 r2,没有安装补丁,造成了困难,尚未在服务器上运行成功。
(提示 api-ms-win-crt-runtimel1-1-0.dll,需要安装多个补丁,暂时放弃)
原文地址:https://blog.csdn.net/u011511086/article/details/80419676
方式一:强烈推荐,能独立运行,依赖DLL也会生成出来,支持无安装环境也能到处运行
按win+R输入cmd在控制台中,进入项目可见bin的目录下执行如下命令:
dotnet publish -r win10-x64 /p:PublishSingleFile=true
执行效果:
项目目录:
生成的exe,依赖的所有dll都在publish文件夹里面,如此此exe程序就可以打包到处运行了,而不用安装运行环境了
在这里插入图片描述
转载自:
https://blog.lindexi.com/post/dotnet-core-发布只有一个-exe-的方法.html
方式二:(不推荐)
修改项目的csproj文件内容,加入
<RuntimeIdentifier>win10-x64</RuntimeIdentifier>
变成:
打开Windows PowerShell
进入项目根目录命令
cd D:\项目\TankQiandaoWx\TankQiandaoWx\TankQiandaoWx
在项目根目录执行命令:
运行程序
dotnet run -p TankQiandaoWx.csproj
发布exe
dotnet publish TankQiandaoWx.csproj
转载:
https://www.cnblogs.com/linezero/p/nightlynetcore2.html
————————————————
版权声明:本文为CSDN博主「棉晗榜」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u011511086/article/details/80419676
.NET Core 2.1 以下的控制台应用程序生成 EXE,且使用命令行参数动态运行控制器应用程序的示例
文章:
https://stackoverflow.com/questions/44038847/vs2017-compile-netcoreapp-as-exe
引用
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.CommandLineUtils" Version="1.1.1" />
<PackageReference Include="System.Collections.NonGeneric" Version="4.3.0" />
</ItemGroup>
Program.cs
using Microsoft.Extensions.CommandLineUtils;
namespace EnumerableSample
{
class Program
{
static void Main(string[] args)
{
var app = new CommandLineApplication(throwOnUnexpectedArg: false);
app.FullName = "LINQ Sample App";
LinqSamples.Register(app);
FilteringSamples.Register(app);
GroupingSamples.Register(app);
CompoundFromSamples.Register(app);
JoinSamples.Register(app);
SortingSamples.Register(app);
app.Command("help", cmd =>
{
cmd.Description = "Get help for the application";
CommandArgument commandArgument = cmd.Argument("<COMMAND>", "The command to get help for");
cmd.OnExecute(() =>
{
app.ShowHelp(commandArgument.Value);
return 0;
});
});
app.OnExecute(() =>
{
app.ShowHelp();
return 0;
});
app.Execute(args);
}
}
}
LinqSamples.cs
using Microsoft.Extensions.CommandLineUtils;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
namespace EnumerableSample
{
internal class LinqSamples
{
internal static void Register(CommandLineApplication app)
{
MethodInfo[] methods = Assembly.GetExecutingAssembly()
.GetTypes()
.Where(t => t.Name == nameof(LinqSamples))
.Single()
.GetMethods()
.Where(m => m.IsPublic && m.IsStatic)
.ToArray();
foreach (var method in methods)
{
app.Command(method.Name.ToLower(), cmd =>
{
cmd.Description = method.Name;
cmd.OnExecute(() => { method.Invoke(null, null); return 0; });
});
}
}
public static void GenerateRange()
{
var values = Enumerable.Range(1, 20);
foreach (var item in values)
{
Console.Write($"{item} ", item);
}
Console.WriteLine();
}
}
}
FilteringSamples.cs
using DataLib;
using Microsoft.Extensions.CommandLineUtils;
using System;
using System.Linq;
namespace EnumerableSample
{
public class FilteringSamples
{
internal static void Register(CommandLineApplication app)
{
app.Command("filter", cmd =>
{
var invokeMethodOption = new CommandOption("-m", CommandOptionType.NoValue);
var indexOption = new CommandOption("-i", CommandOptionType.NoValue);
var typeOption = new CommandOption("-t", CommandOptionType.NoValue);
cmd.Options.AddRange(new[] { invokeMethodOption, indexOption, typeOption });
cmd.Description = "filter -[m|i|t]";
cmd.OnExecute(() =>
{
if (invokeMethodOption.HasValue())
{
FilteringWithMethods();
}
else if (indexOption.HasValue())
{
FilteringWithIndex();
}
else if (typeOption.HasValue())
{
TypeFiltering();
}
else
{
Filtering();
}
return 0;
});
});
}
public static void Filtering()
{
var racers = from r in Formula1.GetChampions()
where r.Wins > 15 && (r.Country == "Brazil" || r.Country == "Austria")
select r;
foreach (var r in racers)
{
Console.WriteLine($"{r:A}");
}
}
public static void FilteringWithIndex()
{
var racers = Formula1.GetChampions()
.Where((r, index) => r.LastName.StartsWith("A") && index % 2 != 0);
foreach (var r in racers)
{
Console.WriteLine($"{r:A}");
}
}
public static void FilteringWithMethods()
{
var racers = Formula1.GetChampions()
.Where(r => r.Wins > 15 && (r.Country == "Brazil" || r.Country == "Austria"));
foreach (var r in racers)
{
Console.WriteLine($"{r:A}");
}
}
public static void TypeFiltering()
{
object[] data = { "one", 2, 3, "four", "five", 6 };
var query = data.OfType<string>();
foreach (var s in query)
{
Console.WriteLine(s);
}
}
}
}
运行截图:
谢谢浏览!
.Net Core 3.1 异步控制台应用程序在 VS 之外运行时挂起
我看到的唯一问题是在这段代码中,它在 O(n^2) 时间内运行:
int total = 0;
while (apiTasks.Any())
{
// if (apiTasks.Count % 100 == 0) await Console.Out.WriteLineAsync($"{apiTasks.Count} remaining.");
Task<int> finishedTask = await Task.WhenAny(apiTasks);
apiTasks.Remove(finishedTask);
total += await finishedTask;
}
如果不需要输出,则将其替换为单个 Task.WhenAll
:
var totals = await Task.WhenAll(apiTasks);
var total = totals.Sum();
如果您确实需要输出,那么您可以通过补全一次重新排序,然后await
每一个。有 some blogs on how to do that,或者您可以使用 Nito.AsyncEx
:
int total = 0;
var orderedApiTasks = apiTasks.OrderByCompletion();
for (int i = 0; i != orderedApiTasks.Count; ++i)
{
total += await orderedApiTasks[i];
if (i % 100 == 0) await Console.Out.WriteLineAsync($"{orderedApiTasks.Count - i} remaining.");
}
,
以下批处理解决方案有效。它在 2-3 秒内恢复每个批次(如果在调试器中运行约 10 秒)
感谢 https://www.michalbialecki.com/2018/04/19/how-to-send-many-requests-in-parallel-in-asp-net-core/ 并感谢所有人的帮助!
using System;
using System.Threading.Tasks;
using System.Collections.Generic;
using System.Data;
using Amazon.S3;
using System.Linq;
using Amazon.S3.Model;
namespace MyNamespace
{
public class S3PrefixGrabber
{
private static IAmazonS3 clientS3;
static async Task Main(string[] args)
{
var query = "SELECT bucket,prefix from myTable";
DataTable dt = GetStuffFromDB(query);
List<S3Prefix> unpopulatedList = (from DataRow dr in dt.Rows select new S3Prefix() { B = dr[0].ToString(),P = dr[1].ToString() }).ToList();
var batchSize = 1000;
int numberOfBatches = (int)Math.Ceiling((double)unpopulatedList.Count() / batchSize);
List<S3Prefix> populatedList = new List<S3Prefix>();
for (int i = 0; i < numberOfBatches; i++)
{
var currentItems = unpopulatedList.Skip(i * batchSize).Take(batchSize);
var tasks = currentItems.Select(id => GetS3DataAsync(id));
populatedList.AddRange(await Task.WhenAll(tasks));
}
}
static async Task<S3Prefix> GetS3DataAsync(S3Prefix s3Item)
{
clientS3 = new AmazonS3Client();
var response = await clientS3.ListObjectsV2Async(new ListObjectsV2Request { BucketName = s3Item.B,Prefix = s3Item.P });
s3Item.O = response.S3Objects.Count;
return s3Item;
}
}
public class S3Prefix
{
public string B { get; set; }
public string P { get; set; }
public int O { get; set; }
}
}
运行 10k 条记录,RAM 为 75MB,CPU 为 40%
运行 300k 条记录,RAM 为 700MB,CPU 为 40%
日志中的一个片段(我没有包含在上面的代码中),仅供参考:
06:32:52.310: ================== 开始 ==================
06:32:52.795:查询:SELECT 存储桶,前缀 FROM myTable
06:32:52.874:打开连接
06:32:54.205:灌装适配器
06:33:06.309: 313863 行从 DB
返回
06:33:07.647:批处理...批处理大小:1000 批处理:314
06:33:07.647:开始第 1/314 批……在 02.84 秒内完成。
06:33:10.492:开始第 2/314 批次......在 02.48 秒内完成。
06:33:12.977:开始第 3/314 批次......在 02.19 秒内完成。
...
06:38:55.435:开始批次 150/314... 02.32 秒内完成。
06:38:57.761:开始批次 151/314... 02.17 秒内完成。
06:38:59.936:开始批次 152/314... 02.27 秒内完成。
...
06:45:13.579:开始批次 312/314... 02.17 秒内完成。
06:45:15.751:开始批次 313/314... 02.35 秒内完成。
06:45:18.105:开始批次 314/314... 02.10s 完成。
06:45:20.211:将 313863 行写入 CSV...完成。
06:45:23.086:DB 行:313863 CSV 行:313863 NotInS3:0 InS3ButNotFound:0
06:45:23.087:在 12:30.77 秒内完成。
06:45:23.092:==================结束==================
.Net Core 实践 - 如何在控制台应用(.Net Core)使用appsettings.json配置
新建控制台应用(.Net Core)程序
添加json文件,命名为appsettings.json,设置文件属性 如果较新则复制
。添加内容如下
{
"MyWords" : "Hello World!"
}
nuget添加相关引用
依次添加以下引用
Microsoft.Extensions.Configuration
Microsoft.Extensions.Configuration.FileExtensions
Microsoft.Extensions.Configuration.Json
Microsoft.Extensions.Hosting
实现思路
在看到《.NET 通用主机》的文章之后,认为可以尝试借助GenericHost更优雅的在Console项目中使用appsetings.json进行项目配置。 Main入口代码如下:
using System;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
namespace ConsoleApp1
{
class Program
{
private static IConfiguration _appConfiguration;
static void Main(string[] args)
{
var hostBuilder = new HostBuilder().ConfigureAppConfiguration((hostContext, configApp) =>
{
var hostingEnvironment = hostContext.HostingEnvironment;
_appConfiguration = AppConfigurations.Get(hostingEnvironment.ContentRootPath, hostingEnvironment.EnvironmentName);
}).ConfigureServices((hostContext, services) =>
{
//注入IConfiguration到DI容器
services.AddSingleton(_appConfiguration);
//注入MyService到DI容器
services.AddSingleton<IMyService, MyService>();
});
//初始化通用主机
var host = hostBuilder.Build();
//获取MyService
var myService = host.Services.GetService<IMyService>();
//调用SayMyWords方法
myService.SayMyWords();
Console.ReadKey();
}
}
}
demo地址
https://github.com/PuzzledAlien/DotNetCore_Practice/tree/master/%E5%A6%82%E4%BD%95%E5%9C%A8%E6%8E%A7%E5%88%B6%E5%8F%B0%E5%BA%94%E7%94%A8(.Net%20Core)%E4%BD%BF%E7%94%A8appsetting.json%E9%85%8D%E7%BD%AE
参考文章与说明
- .NET 通用主机
说明:
- 通用主机Hosting的开源地址:https://github.com/aspnet/Extensions/tree/master/src/Hosting
今天关于Docker在Windows上运行NetCore系列和一使用命令控制台运行.NetCore控制台应用的分享就到这里,希望大家有所收获,若想了解更多关于(转).Net Core控制台生成exe能独立运行、.NET Core 2.1 以下的控制台应用程序生成 EXE,且使用命令行参数动态运行控制器应用程序的示例、.Net Core 3.1 异步控制台应用程序在 VS 之外运行时挂起、.Net Core 实践 - 如何在控制台应用(.Net Core)使用appsettings.json配置等相关知识,可以在本站进行查询。
本文标签: