使用`dotnet new`在C#中创建Windows窗体应用程序

时间:2017-10-05 09:58:55

标签: c# .net winforms visual-studio-code

我正在尝试在Visual Studio Code 2017中创建一个(简单的)Windows窗体应用程序。遗憾的是我无法使用完整的VS版本,所以我没有菜单选项来创建新项目。

以前,我通过在VSC中从终端运行dotnet new console来创建控制台项目。但是,我无法使用表单应用程序。

从市场安装以下扩展程序:

enter image description here

我尝试了什么:

1

创建控制台应用程序,并引用using System.Windows.Forms;:但是,这需要我引用此命名空间:

  

类型或命名空间' Forms'命名空间中不存在" System.Windows"

所以我尝试使用NuGet Package Manager: Add Package命令添加它,但在这里我找不到包System.Windows.Forms

我能想到的最后一件事是手动添加对.csproj文件的引用:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.0</TargetFramework>
    <RuntimeIdentifiers>win7-x64</RuntimeIdentifiers>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Newtonsoft.Json" Version="10.0.3"/>
    <PackageReference Include="System.Windows.Forms" HintPath = "\..\WINDOWS\Microsoft.NET\Framework\v4.0.30319"/>
  </ItemGroup>
</Project>

但是当运行dotnet restore时会发出警告:

warning NU1604: Project dependency System.Windows.Forms does not contain an inclusive lower bound. Include a lower bound in the dependency version to ensure consistent restore results.
warning NU1701: Package 'System.Windows.Forms 4.0.0' was restored using '.NETFramework,Version=v4.6.1' instead of the project target framework '.NETCoreApp,Version=v2.0'. This package may not be fully compatible with your project.

运行时会出现以下异常:

System.BadImageFormatException: Could not load file or assembly 'System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'. Reference assemblies should not be loaded for execution.  They can only be loaded in the Reflection-only loader context. (Exception from HRESULT: 0x80131058) ---> System.BadImageFormatException: Cannot load a reference assembly for execution.

2

创建一个.cs文件,并使用csc进行编译。这样我可以使用Forms,但是我失去了dotnet处理其他依赖项的功能。

问题

我觉得这个问题会受到XY问题的影响。我是C#和.NET的新手,所以我不确定我失败的地方,我想做的事情是否可行。

所以我的问题是,如何使用dotnet new命令创建Windows窗体应用程序?

2 个答案:

答案 0 :(得分:4)

  

这个答案是一种解决方法。还有一个hacky解决方法。如果可以,请使用Visual Studio而不是此。

花了一些时间(阅读:很多)令人费解,但我设法将一些信息左右联系在一起。

创建表单,哪个框架?

根据this answer on another question,.NET中有不同的框架允许创建不同的应用程序,如下图所示:

.NET frameworks

Quora上的另一个post似乎是第二点:

  

所有本机用户界面技术(Windows Presentation Foundation,Windows Forms等)都是框架的一部分,而不是核心。

这意味着我们正在使用错误的框架。默认情况下,dotnet new似乎使用.NET CORE框架,我们可以在.csproj文件中看到:

<TargetFramework>netcoreapp2.0</TargetFramework>

这不是我们想要的。我们想要.NET FRAMEWORK。根据{{​​3}},我们可以将其更改为net<versionnumber>

添加依赖项

然后可以像这样添加依赖项System.Windows.Forms

<PackageReference Include="System.Windows.Forms" HintPath = "\..\WINDOWS\Microsoft.NET\Framework\v4.0.30319"/>

最后一件事

编译时,我遇到了另一个编译错误:

 error CS0656: Missing compiler required member 'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create'

可以使用Microsoft.CSharpNuGet添加到依赖项中,从而轻松解决此问题。

然后.csproj文件如下所示:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net452</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Newtonsoft.Json" Version="10.0.2"/>
    <PackageReference Include="System.Windows.Forms" HintPath="\..\WINDOWS\Microsoft.NET\Framework\v4.0.30319"/>
    <PackageReference Include="Microsoft.CSharp" Version="4.4.0"/>
  </ItemGroup>
</Project>

答案 1 :(得分:3)

从dotnet 3.0开始,您只需运行以下命令即可初始化WinForms应用程序:

dotnet new winforms

要初始化wpf应用程序,只需运行:

dotnet new wpf

通过运行dotnet newdotnet new --help(两个命令都产生相同的输出),您可以查看dotnet 3.0的所有可用项目类型。

P.S .:已通过dotnet 3.0.100-preview-010184测试。