将NuGet包信息添加到.NET Framework项目时发生不相关的加载错误

jexiocij  于 2023-01-14  发布在  .NET
关注(0)|答案(1)|浏览(70)

我是JetBrains产品的用户,更确切地说是IDE Rider。
我的同事主要是微软产品的用户,更具体地说是Visual Studio。
所以,我很惊讶,当他在Visual Studio中打开我的解决方案或c#项目时,它们被破坏了。(特定项目的属性)

这个错误有点误导,因为提到的常量实际上是定义的。它也是误导,因为错误的原因是在.csproj-文件中添加了NuGet包信息。
对我来说,错误与原因有些无关,因此对我应该如何进行感到非常困惑。
下面是该错误的完整输出:

System.ArgumentException: Expected 1 values for property Build::DefineConstants, but got 0.
Parameter name: values
   at Microsoft.VisualStudio.ProjectSystem.VS.Implementation.PropertyPages.Designer.Property.Update(ImmutableArray`1 values)
   at Microsoft.VisualStudio.ProjectSystem.VS.Implementation.PropertyPages.Designer.Property..ctor(PropertyMetadata metadata, ImmutableArray`1 values, PropertyContext context, ImmutableHashSet`1 varyByDimensions)
   at Microsoft.VisualStudio.ProjectSystem.VS.Implementation.PropertyPages.Designer.PropertyContextFactoryBase.ToProperty(IUIProperty property, Page page, Category category, Int32 order, PropertyContext propertyContext, IPropertyEditorRegistry propertyEditorRegistry)
   at Microsoft.VisualStudio.ProjectSystem.VS.Implementation.PropertyPages.Designer.ProjectPropertyDataAccess.Observer.<HandleDataAsync>g__CreateProperties|14_5(<>c__DisplayClass14_0& )
   at Microsoft.VisualStudio.ProjectSystem.VS.Implementation.PropertyPages.Designer.ProjectPropertyDataAccess.Observer.<HandleDataAsync>g__ProcessInitialData|14_1(<>c__DisplayClass14_0& )
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.VisualStudio.ProjectSystem.VS.Implementation.PropertyPages.Designer.ProjectPropertyDataAccess.Observer.<InitializeAsync>d__10.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at Microsoft.VisualStudio.ProjectSystem.VS.Implementation.PropertyPages.Designer.ProjectPropertyDataAccess.Observer.<CreateAsync>d__9.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.VisualStudio.ProjectSystem.VS.Implementation.PropertyPages.Designer.ProjectPropertiesEditor.<>c__DisplayClass0_0.<<-ctor>b__0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.VisualStudio.ProjectSystem.VS.Implementation.PropertyPages.Designer.AsyncLoadContent.<>c__DisplayClass0_0.<<Initialize>b__0>d.MoveNext()

但我可以在Rider中打开这些项目属性而没有问题:

我已经将问题缩小到了特定的信息属性,我使用这些属性将信息放入NuGet包中。This documentation/guide提到我应该使用汇编信息,但我在使用nuget pack时遇到了汇编信息获取的问题,这就是为什么我使用.csproj文件中已知的属性。
然后我求助于遵循"Create a NuGet package using MSBuild"-Documentation中的信息,这是更好的选择,因为我可以将打包集成到构建中。
通过添加NuGet-Target-Package,我看到Rider中出现了一个新的选项卡,允许我编辑这些信息。这让我觉得我在Rider中做了正确的事情,但在Visual Studio中看到的结果,让我看起来像是在做一些我不知道的NuGet规范方面非常无意的事情。
下面是csproj文件的完整版本

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" 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>{63B8CCEF-5C50-4F25-8E6B-C623DA1BDD2F}</ProjectGuid>
    <OutputType>Library</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>Testcenter.RobotFramework</RootNamespace>
    <TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
    <AssemblyName>Testcenter.RobotFramework</AssemblyName>
    <FileAlignment>512</FileAlignment>
    <DefineConstants>DEBUG</DefineConstants>
    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
    <!-- Properties which cause problems in Visual Studio. The error doesn't occur if these are commented out.
    <TargetFramework>netframework4.8</TargetFramework>
    <PackageId>Testcenter.RobotFramework</PackageId>
    <Version>1.0.0</Version>
    <Authors>Testcenter Team, Some Person</Authors>
    <Company>SomeCompany</Company>
    <PackageOutputPath>$(ProjectDir)</PackageOutputPath>
    <Description>A class library to implement a remote library interface conforming to RobotFramework.</Description>
    <Title>RobotFramework Remote-Library-Interface for C#</Title>
    <Copyright>Copyright (c) SomeCompany 2022</Copyright>
    <RepositoryUrl>https://redacted.url.com</RepositoryUrl>
    <Product>Testcenter.RobotFramework</Product>
    <AssemblyVersion>1.0.0</AssemblyVersion>
    <FileVersion>1.0.0</FileVersion> -->
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <OutputPath>bin\Debug\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <OutputPath>bin\Release\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Testing|AnyCPU' ">
    <OutputPath>bin\Testing\</OutputPath>
    <DefineConstants>TEST</DefineConstants>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Libraries|AnyCPU' ">
    <OutputPath>bin\Libraries\</OutputPath>
    <DefineConstants>ONLY_LIBRARY</DefineConstants>
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="mscorlib" />
    <Reference Include="System" />
    <Reference Include="System.ComponentModel.Composition" />
    <Reference Include="System.Configuration" />
    <Reference Include="System.Core" />
    <Reference Include="System.Data" />
    <Reference Include="System.IO.Compression" />
    <Reference Include="System.Xml" />
    <Reference Include="System.Xml.Linq" />
  </ItemGroup>
  <ItemGroup>
    <Compile Include="Configuration\LibraryConfig.cs" />
    <Compile Include="Configuration\ServerConfiguration.cs" />
    <Compile Include="Configuration\XML\AssemblyElement.cs" />
    <Compile Include="Configuration\XML\AssemblyElementCollection.cs" />
    <Compile Include="Configuration\XML\PortElement.cs" />
    <Compile Include="Configuration\XML\XmlServerConfiguration.cs" />
    <Compile Include="Keyword\IKeywordManager.cs" />
    <Compile Include="Keyword\Keyword.cs" />
    <Compile Include="Keyword\KeywordErrorType.cs" />
    <Compile Include="Keyword\KeywordManager.cs" />
    <Compile Include="Keyword\KeywordResult.cs" />
    <Compile Include="Keyword\KeywordStatus.cs" />
    <Compile Include="Properties\AssemblyInfo.cs" />
    <Compile Include="Trash\XmlDocumentation.cs" />
  </ItemGroup>
  <ItemGroup>
    <Content Include="README.md" />
  </ItemGroup>
  <ItemGroup>
    <PackageReference Include="NLog" Version="5.1.0" />
    <PackageReference Include="NuGet.Build.Tasks.Pack" Version="6.4.0">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
    </PackageReference>
    <PackageReference Include="Testcenter.RobotFramework.Exceptions" Version="1.0.0" />
    <PackageReference Include="Testcenter.TestAutomation.Utility" Version="1.0.0" />
  </ItemGroup>
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
         Other similar extension points exist, see Microsoft.Common.targets.
    <Target Name="BeforeBuild">
    </Target>
    <Target Name="AfterBuild">
    </Target>
    -->
</Project>

我的意图是将NuGet包信息嵌入到相应的项目文件中,而不必创建.nuspec
但是在遇到那个错误之后,感觉那可能是个误会。
我非常不确定现在什么是正确的,就以下方面而言:

  • 如果我想遵守某些“规范”,我应该把这些NuGet-Assembly信息放在哪里?(我找不到必要的信息)
  • 从.Net framework包创建NuGet包时,我是否需要一个NuGet-Spec文件?(NuGet-Spec是什么?我为什么需要它?)
  • .Net NuGet package.Net framework package之间有何区别?

我发现所有这些都非常令人困惑,因为在打包C#项目或创建NuGets方面我是新手。
但是我不得不在.NET Framework 4.8上工作,与.NET核心相比,这似乎使这个过程不是很简单。

wwtsj6pe

wwtsj6pe1#

    • 与问题中的实际错误消息相关。**

DefineConstants错误确实有点误导。我能够从您在我的机器上的初始.csproj开始重现它,并将其缩小到TargetFramework属性。
移除

<TargetFramework>netframework4.8</TargetFramework>

允许打开项目属性时不出错。将其更改为

<TargetFramework>net48</TargetFramework>

重新引入错误。
进一步挖掘,这似乎是一个问题,是否Visual Studio示例有. NET框架4.8 SDK与. NET框架4.8目标包安装(参考Visual Studio Can't Target .NET Framework 4.8)。

    • 与您问题中的NuGet部分相关**

你的问题中的NuGet部分实际上与你得到的错误完全无关,但是我会回答你的观点。
我的意图是将NuGet包信息嵌入到相应的项目文件中,而不必创建.nuspec
这很好,而且NuGet打包/发布场景(. NET和. NET Framework)都支持这一点。事实上,这是值得鼓励的。你需要阅读文档来了解哪些对NuGet很重要。
但是在遇到那个错误之后,感觉那可能是个误会。
是的
我应该将这些NuGet-Assembly信息放在哪里...
通常在.csproj中和/或使用汇编属性表示版本等内容。
当我从. net framework包创建NuGet包时,我需要一个NuGet-Spec文件吗?(NuGet-Spec是什么?为什么我需要它?)
是的,它是一个manifest文件,嵌入到NuGet包中。如果你把属性放在csproj文件中,它就会自动生成,你不必手动创建它。
NetNuGet包和. Netframework包之间的区别是什么?
从NuGet包管理器的Angular 来看,其实什么都不是,各种包管理器都需要清单,需要包内容(汇编和任何其他内容),需要按照作者的意图安装包。
从打包/发布的Angular 来看,步骤基本相同,但工具不同。
"终于..."
作为一个实验,如果你可以访问一个启用了ReSharper的VS示例,你可以尝试基于ReSharper的构建。我非常肯定它也不使用MSBuild,所以看看你的错误是否会发生可能会很有趣。

相关问题