使用dotnet run运行多个并行实例的.NET Core应用程序

17

我遇到了以下错误:

C:\Program Files\dotnet\sdk\2.0.3\Microsoft.Common.CurrentVersion.targets(4052,5): 警告 MSB3026: 无法将 "obj\Debug\netcoreapp2.0\MyApp.dll" 复制到 "bin\Debug\netcoreapp2.0\MyApp.dll"。在1000毫秒后开始重试。由于另一个进程正在使用文件, 'C:\stackoverflow\MyApp\bin\Debug\netcoreapp2.0\MyApp.dll',因此无法访问该文件。 [C:\stackoverflow\MyApp\MyApp.csproj]

在从不同终端尝试多次使用dotnet run相同项目时发生。如何在开发过程中轻松运行同一应用程序的多个实例,而无需复制文件夹?

如果同时启动两个,有时会工作 :/

4个回答

18

我曾遇到同样的问题,并使用 --no-build 选项解决了它:

dotnet run --no-build <path to .dll> <args>

请参考: MSDN文档


2
这是正确的答案。您不需要dll路径,而且您可以将参数放在--no-build的任一侧。 - Drew Miller

16

我用bat文件同时运行了6个应用程序的实例。唯一的问题是当我启动应用程序的构建并立即运行脚本时。因此,我认为你应该确保构建过程结束后再运行批处理文件,例如使用dotnet运行命令重复六次。您的应用程序应该构建为执行此文件。

start /d "." dotnet run args
start /d "." dotnet run args
start /d "." dotnet run args
start /d "." dotnet run args
start /d "." dotnet run args
start /d "." dotnet run args

这对我有效,也许你最后没有 Console.ReadLine(); 所以控制台立即关闭了。 - MateuszWkDev
其中一个仍然关闭,即使在结尾处使用了Console.ReadLine。我正在尝试启动2个实例的应用程序将一直运行直到终止(在这种情况下,只有其中一个将这样做,因为另一个将终止)。我很惊讶这应该是个问题,因为我本来期望这是一个相当正常的事情,在开发带有命令行参数的控制台应用程序时。 - Soren
我已经以这种方式运行我的实例,不知道为什么你的解决方案不起作用,也许尝试清理和重新构建解决方案。 - MateuszWkDev
啊,我刚刚复制了这个项目并尝试手动运行它们。看起来它退出了,因为地址已经被使用了一个异常。所以我想为了让这个解决方案工作,应用程序需要在已经使用的情况下选择另一个端口。我猜这也可以通过命令行参数来处理,传递不同的端口。我会把这个问题保持开放状态一两天,看看是否有其他解决方案。谢谢。 - Soren
我使用了类似这样的东西。另外,我在构建相同的程序集时遇到了问题,所以我添加了一个睡眠命令:sleep 10&dotnet watch run - g4j
显示剩余5条评论

2
在开发过程中我发现最好用的是dotnet watch命令行工具。
你可以有一个批处理文件,启动多个dotnet watch run <project>命令,就像MateuszWkDev的答案中所述。
在监视模式下运行不会阻止对文件的编辑,并且一旦您自动编辑源文件,它将重新构建和重新运行应用程序。
假设您在src文件夹中有一个批处理文件,其中包含SomeProject、OtherProject和YetAnotherProject文件夹,这些文件夹包含csproj文件。那么批处理文件可能如下所示:
start /d "%~dp0\SomeProject"       dotnet watch run SomeProject
start /d "%~dp0\OtherProject"      dotnet watch run OtherProject
start /d "%~dp0\YetAnotherProject" dotnet watch run YetAnotherProject

运行此批处理文件后,您将获得三个终端运行dotnet watch run <project>命令。

1

还有一种hacky的方法,就是像这样设置构建配置的唯一名称:

start /d "." dotnet run -c Instance1 args
start /d "." dotnet run -c Instance2 args
start /d "." dotnet run -c Instance3 args
start /d "." dotnet run -c Instance4 args
start /d "." dotnet run -c Instance5 args
start /d "." dotnet run -c Instance6 args

此外,在项目文件 (MyApp.csproj) 中,您不必指定所有构建配置。
如果未明确设置配置名称,则使用默认值,即 Debug。这就是为什么 Debug 文件夹中的 DLL 被锁定的原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接