简体   繁体   English

Dotnet构建不适用于newcsproj和PackageReference

[英]Dotnet build doesn't work with newcsproj and PackageReference

Reproduce steps: 重现步骤:

  1. Open Visual Studio 2017, create new class library project, .NET 4.6.1 . 打开Visual Studio 2017,创建新的类库项目.NET 4.6.1
  2. Add reference to Newtonsoft.Json with Nuget Package Manager. 使用Nuget Package Manager添加对Newtonsoft.Json引用。
  3. Build project successfully with VS2017 . 使用VS2017成功构建项目。
  4. Open command line and run dotnet build from project directory. 打开命令行并从项目目录运行dotnet build

It gives the following error: 它给出以下错误:

error CS0246: The type or namespace name 'Newtonsoft' could not be found (are you missing a using directive or an assembly reference?) 错误CS0246:找不到类型或名称空间名称“ Newtonsoft”(您是否缺少using指令或程序集引用?)

dotnet version: 网络版本: 在此处输入图片说明

Any ideas how to get rid of this error? 任何想法如何摆脱这个错误?

Edit: Before running dotnet restore: 编辑:运行dotnet还原之前:

在此处输入图片说明

After running dotnet restore 运行dotnet还原后

在此处输入图片说明

Edit with files: ClassLibrary1.csproj 使用文件编辑:ClassLibrary1.csproj

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProjectGuid>{42A41D81-0A26-4D79-935E-6002BFAD37EB}</ProjectGuid>
    <OutputType>Library</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>ClassLibrary1</RootNamespace>
    <AssemblyName>ClassLibrary1</AssemblyName>
    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
    <FileAlignment>512</FileAlignment>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>bin\Debug\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin\Release\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="System" />
    <Reference Include="System.Core" />
    <Reference Include="System.Xml.Linq" />
    <Reference Include="System.Data.DataSetExtensions" />
    <Reference Include="Microsoft.CSharp" />
    <Reference Include="System.Data" />
    <Reference Include="System.Net.Http" />
    <Reference Include="System.Xml" />
  </ItemGroup>
  <ItemGroup>
    <Compile Include="Class1.cs" />
    <Compile Include="Properties\AssemblyInfo.cs" />
  </ItemGroup>
  <ItemGroup>
    <PackageReference Include="Newtonsoft.Json">
      <Version>9.0.1</Version>
    </PackageReference>
  </ItemGroup>
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

Class1.cs Class1.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;

namespace ClassLibrary1
{
    public class Class1
    {

        [JsonProperty]
        public string asd { get; set; }
    }
}

You're using the "old style" msbuild project, which won't work with the dotnet CLI. 您正在使用“旧样式” msbuild项目,该项目无法与dotnet CLI一起使用。

Replace your whole project file with: 将整个项目文件替换为:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net461</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Newtonsoft.Json" Version="10.0.3" />
  </ItemGroup>

</Project>

Now it will be compatible with the dotnet CLI, and all should be well. 现在它将与dotnet CLI兼容,并且一切都应该很好。

To reference a library on the command line you need to use the /r: compiler option. 要在命令行上引用库,您需要使用/ r:编译器选项。 For example run csc /r:Path_to_your_DLL /t:Path_to_your_.cs_files 例如,运行csc /r:Path_to_your_DLL /t:Path_to_your_.cs_files

According to this microsoft doc , Visual studio seems to do the work of including all the libraries automatically when you use nuget inside visual studio, but since you are trying to build using command line, you have to manually reference all the libraries yourself. 根据该Microsoft文档 ,当您在Visual Studio中使用nuget时,Visual Studio似乎会自动完成包括所有库的工作,但是由于您尝试使用命令行进行构建,因此您必须自己手动引用所有库。 在此处输入图片说明

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM