在Dnx / AspNet5中运行一个简单的控制台应用程序,并且不会在Visual Studio外部运行?

时间:2016-01-23 15:34:00

标签: c#-4.0 asp.net-core dnx

我已经将一个简单的小型控制台应用程序编写为AspNet5控制台包

namespace ConsoleApp1
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("Hello world");
            Console.ReadLine();
        }
    }
}

在Visual Studio中通过调试运行它,我得到了一个带有Hello World的命令窗口。但是当我用项目属性编译它时,#34;在构建时生成输出"我得到了一个使用以下输出生成的artifacts \ bin \ ConsoleApp1 \ Debug \ app目录 enter image description here

和一个dnx46目录 enter image description here

app目录中.cmd文件的内容为

@dnx --appbase "%~dp0." Microsoft.Dnx.ApplicationHost ConsoleApp1 %*

project.json文件的内容如下

{
  "version": "1.0.0-*",
  "description": "ConsoleApp1 Console Application",
  "authors": [
    "Doug"
  ],
  "tags": [
    ""
  ],
  "projectUrl": "",
  "licenseUrl": "",
  "compilationOptions": {
    "emitEntryPoint": true
  },
  "dependencies": {
    "ConsoleApp1": "1.0.0"
  },
  "commands": {
    "ConsoleApp1": "ConsoleApp1"
  },
  "frameworks": {
    "dnx46": {
      "System.Console": "4.0.0-beta-23516"
    }
  },
  "entryPoint": "ConsoleApp1",
  "loadable": false
}

双击cmd文件不会运行该程序。我输入了ReadLine()代码来暂停运行中的应用程序,看看输出会是什么,但是我看到闪存然后就消失了。我还尝试使用以下命令从powershell中的app目录运行它" dnx ConsoleApp1"但它不会运行。这只是一个简单的控制台应用程序,不应该很难运行,但我似乎无法让它在visual studio环境之外运行。我做错了什么????

更新1 我让它从src的目录运行执行,但我似乎无法从artifacts目录以相同的方式运行输出。任何想法???

PS C:\Users\Doug\Documents\Visual Studio 14\Projects\WebApplication2\src\ConsoleApp1> dnx run
Hello world

正如这里的FYI是我的dnvm列表输出 enter image description here

更新2 如果我改为" .cmd"的目录,下面是输出。文件并尝试在打开的窗口中手动执行它,这就是为什么它只是终止和关闭...由于.cmd文件的内容,我认为这至少会起作用...我会尽快尝试dnu发布。如果发布有效,那么artifacts目录中生成的.cmd文件的重点是什么。

enter image description here

更新3

好的,所以我从包含项目源文件的目录中运行了dnu publish命令。输出如下。

enter image description here

结果" .cmd"双击目录结构中突出显示的文件,出现cmd.exe窗口,输出正确。目录结构和输出如下。 enter image description here

然而,这让我很好奇......当我在编译生成的artifacts目录中运行相同的dnu publish命令时,"生成构建输出"检查选项,生成的.cmd文件不会执行控制台程序??? artifacts目录中的输出与程序源中的文件之间有什么区别,它们允许将所有内容拉到一起执行。

PS ......这似乎很简单,只是为了让控制台程序在visual studio之外运行!这是DNX的意图吗?没有exe?只是好奇

更新4 我在输出工件的目录中运行了以下内容...结果仍然是工件目录中没有可运行的程序版本,但输出文件看起来几乎与/ src目录bin中的相同。

我为没有拍摄屏幕截图而道歉,但我的屏幕不够大,无法一次抓住所有内容。

PS C:\Users\Doug\Documents\Visual Studio 14\Projects\WebApplication2\artifacts\bin\ConsoleApp1\Debug\app> dnu restore
Microsoft .NET Development Utility Clr-x86-1.0.0-rc1-16231

  CACHE https://www.nuget.org/api/v2/
Restoring packages for C:\Users\Doug\Documents\Visual Studio 14\Projects\WebApplication2\artifacts\bin\ConsoleApp1\Debug\app\project.json
Writing lock file C:\Users\Doug\Documents\Visual Studio 14\Projects\WebApplication2\artifacts\bin\ConsoleApp1\Debug\app\project.lock.json
Restore complete, 123ms elapsed

NuGet Config files used:
    C:\Users\Doug\AppData\Roaming\NuGet\nuget.config

Feeds used:
    https://www.nuget.org/api/v2/

PS C:\Users\Doug\Documents\Visual Studio 14\Projects\WebApplication2\artifacts\bin\ConsoleApp1\Debug\app> dnu publish --runtime active --no-source
Microsoft .NET Development Utility Clr-x86-1.0.0-rc1-16231

Copying to output path C:\Users\Doug\Documents\Visual Studio 14\Projects\WebApplication2\artifacts\bin\ConsoleApp1\Debug\app\bin\output
Using Project dependency app 1.0.0 for DNX,Version=v4.6
  Packing nupkg from Project dependency app
    Source C:\Users\Doug\Documents\Visual Studio 14\Projects\WebApplication2\artifacts\bin\ConsoleApp1\Debug\app\project.json
    Target C:\Users\Doug\Documents\Visual Studio 14\Projects\WebApplication2\artifacts\bin\ConsoleApp1\Debug\app\bin\output\approot\packages\app\1.0.0

Building app for DNX,Version=v4.6
  Using Project dependency app 1.0.0
    Source: C:\Users\Doug\Documents\Visual Studio 14\Projects\WebApplication2\artifacts\bin\ConsoleApp1\Debug\app\project.json

  Using Project dependency ConsoleApp1 1.0.0
    Source: C:\Users\Doug\Documents\Visual Studio 14\Projects\WebApplication2\src\ConsoleApp1\project.json

  Using Assembly dependency fx/mscorlib 4.0.0
    Source: C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6\mscorlib.dll

  Using Assembly dependency fx/System 4.0.0
    Source: C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6\System.dll

  Using Assembly dependency fx/System.Core 4.0.0
    Source: C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6\System.Core.dll

  Using Assembly dependency fx/Microsoft.CSharp 4.0.0
    Source: C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6\Microsoft.CSharp.dll

dnu : error CS5001: Program does not contain a static 'Main' method suitable for an entry point
At line:1 char:1
+ dnu publish --runtime active --no-source
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (error CS5001: P... an entry point:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError


Build failed.
    0 Warning(s)
    1 Error(s)

Time elapsed 00:00:00.3519605
Total build time elapsed: 00:00:00.3550713
Total projects built: 1

Using Project dependency ConsoleApp1 1.0.0 for DNX,Version=v4.6
  Packing nupkg from Project dependency ConsoleApp1
    Source C:\Users\Doug\Documents\Visual Studio 14\Projects\WebApplication2\src\ConsoleApp1\project.json
    Target C:\Users\Doug\Documents\Visual Studio 14\Projects\WebApplication2\artifacts\bin\ConsoleApp1\Debug\app\bin\output\approot\packages\ConsoleApp1\1.0.0

Building ConsoleApp1 for DNX,Version=v4.6
  Using Project dependency ConsoleApp1 1.0.0
    Source: C:\Users\Doug\Documents\Visual Studio 14\Projects\WebApplication2\src\ConsoleApp1\project.json

  Using Assembly dependency fx/mscorlib 4.0.0
    Source: C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6\mscorlib.dll

  Using Assembly dependency fx/System 4.0.0
    Source: C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6\System.dll

  Using Assembly dependency fx/System.Core 4.0.0
    Source: C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6\System.Core.dll

  Using Assembly dependency fx/Microsoft.CSharp 4.0.0
    Source: C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6\Microsoft.CSharp.dll

Exported application command: ConsoleApp1
ConsoleApp1 -> C:\Users\Doug\Documents\Visual Studio 14\Projects\WebApplication2\src\ConsoleApp1\bin\Debug\ConsoleApp1.1.0.0.nupkg
ConsoleApp1 -> C:\Users\Doug\Documents\Visual Studio 14\Projects\WebApplication2\src\ConsoleApp1\bin\Debug\ConsoleApp1.1.0.0.symbols.nupkg

Build succeeded.
    0 Warning(s)
    0 Error(s)

Time elapsed 00:00:00.2780556
Total build time elapsed: 00:00:00.2790409
Total projects built: 1
Adding NuGet package C:\Users\Doug\Documents\Visual Studio 14\Projects\WebApplication2\src\ConsoleApp1\bin\Debug\ConsoleApp1.1.0.0.nupkg to C:\Users\Doug\Documents\Visua
l Studio 14\Projects\WebApplication2\artifacts\bin\ConsoleApp1\Debug\app\bin\output\approot\packages
Installing ConsoleApp1.1.0.0
Add complete, 46ms elapsed
Removing C:\Users\Doug\Documents\Visual Studio 14\Projects\WebApplication2\src\ConsoleApp1\bin\Debug\ConsoleApp1.1.0.0.nupkg
Removing C:\Users\Doug\Documents\Visual Studio 14\Projects\WebApplication2\src\ConsoleApp1\bin\Debug\ConsoleApp1.1.0.0.symbols.nupkg

Bundling runtime dnx-clr-win-x86.1.0.0-rc1-update1
Time elapsed 00:00:01.1140479

PS C:\Users\Doug\Documents\Visual Studio 14\Projects\WebApplication2\artifacts\bin\ConsoleApp1\Debug\app> 

这是目录输出导致在artifacts目录中运行命令dnu publish ...输出相同,但.cmd文件不会运行

enter image description here

你能告诉我在项目的/ src目录和产品输出的/ artifacts目录之间运行区别吗?

PS:抱歉这么长的帖子,只是真的试图绕过这个DNX的东西!再次感谢您的帮助

1 个答案:

答案 0 :(得分:2)

由于您列出了多个问题,我将逐一解决这些问题。

  

双击cmd文件将不会运行该程序。我输入了ReadLine()代码来暂停运行中的应用程序,看看输出会是什么,但是我看到闪存然后就消失了。

这是预期的。 cmd文件在新控制台中启动应用程序,当进程终止时,控制台将关闭。

您有几个选择:

  1. 就像你一样,在程序结束时添加一个ReadLine。
  2. 从控制台运行cmd文件。
  3. 按照此问题enter image description here
  4. 中的说明,在运行后保持控制台处于打开状态
      

    更新1我得到这个从src的目录运行执行,但我似乎无法以相同的方式从artifacts目录运行输出。任何想法???

    “在构建时生成输出”不会产生可运行的可执行文件(是的,它令人困惑),但是nuget包。

    所以,在dnx世界中:

    1. 如果您在构建时生成输出,则相当于运行dnu pack
    2. 如果要创建具有可运行应用程序的文件夹,则必须运行dnu publish(或从VS发布)。根据您传递的参数,您将获得一个文件夹,其中包含可运行的应用程序,其依赖项以及可选的运行时。

      因此,可以使用以下内容生成自包含的已发布应用程序:

      dnu publish --runtime <runtime name or "active"> --no-source
      

      --no-source参数将预先编译您拥有源的项目(这是您将获得最接近经典C#应用程序的项目)。如果没有这个参数,每次应用程序启动时都会动态编译源代码。

      publish命令的默认输出位于bin\output