参考GAC在新的csproj格式的组件?

时间:2019-02-02 05:56:35

标签: visual-studio msbuild visual-studio-2019

我正在使用Visual Studio 2019预览版2.1。我有在旧的csproj项目格式一些Azure的引用(ToolsVersion =“15.0”)一个.NET Framework 4.6.1类库C#项目。这个古老的csproj目前构建和工作得很好。我正在尝试迁移到新的项目格式。除了我的参考不是来自NuGet之外,其他一切都进展顺利,它来自GAC:Microsoft.WindowsAzure.ServiceRuntime。但是,我还没有想出如何获得新的项目格式找到组装。例如,这是新的项目文件:

import Component from "Component.js"

emailTwo(){
   alert("Component 2 Email");
}

<Component someAction={this.emailTwo}>

实际上,Microsoft.WindowsAzure.ServiceRuntime引用与旧格式完全相同。在VS中加载它时,会产生以下警告:

警告MSB3245无法解析此参考。无法找到程序集 “Microsoft.WindowsAzure.ServiceRuntime,版本= 2.7.0.0,文化=中性公钥= 31bf3856ad364e35,ProcessorArchitecture用于= MSIL”。检查以确保程序集在磁盘上。如果您的代码需要此引用,则可能会出现编译错误。 MyProject的C:\ Program Files文件(x86)的\微软的Visual Studio \ 2019 \预览\的MSBuild \电流\ BIN \ Microsoft.Common.CurrentVersion.targets 2114

我试图删除该版本:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
    <TargetFramework>net461</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <None Include="app.config" />
  </ItemGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.Azure.KeyVault" Version="2.3.2" />
    <PackageReference Include="Microsoft.Azure.KeyVault.Core" Version="1.0.0" />
    <PackageReference Include="Microsoft.Azure.KeyVault.WebKey" Version="2.0.7" />
    <PackageReference Include="Microsoft.IdentityModel.Clients.ActiveDirectory" Version="3.19.1" />
    <PackageReference Include="Microsoft.Rest.ClientRuntime" Version="2.3.8" />
    <PackageReference Include="Microsoft.Rest.ClientRuntime.Azure" Version="3.3.7" />
    <PackageReference Include="Microsoft.WindowsAzure.ConfigurationManager" Version="3.2.3" />
    <PackageReference Include="Newtonsoft.Json" Version="10.0.2" />
    <PackageReference Include="WindowsAzure.Storage" Version="9.0.0" />
  </ItemGroup>
  <ItemGroup>
    <Reference Include="Microsoft.WindowsAzure.ServiceRuntime, Version=2.7.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
    <Reference Include="System" />
    <Reference Include="System.Core" />
    <Reference Include="System.Runtime.Caching" />
    <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>
</Project>

但这没有帮助。如果我删除它,并尝试从VS用户界面添加引用,我看到有一堆微软的*和系统。*在“框架”(海关总署),但Microsoft.WindowsAzure.ServiceRuntime选项不是一个他们。只是为了确认我开始了ILSpy并选择“打开从GAC ......”果然是有带着一帮不出现在VS用户界面的其他组件一起。

我怎样才能获得VS加载从GAC此引用?

谢谢

2 个答案:

答案 0 :(得分:1)

因此我发现this thread on GitHub表示<参考>未发现添加到GAC的程序集是预期的行为:

  

此行为是设计使然。您可以选择退出,如here所示。这不应该被认为是一种解决方法,而应该是经过深思熟虑和受支持的选择加入,您可以接受在不同机器上具有潜在不同(甚至不正确)的构建行为的后果。

解决方案是执行以下操作:

<PropertyGroup>
  <AssemblySearchPaths>$(AssemblySearchPaths);{GAC}</AssemblySearchPaths>
</PropertyGroup>

即使不使用HintPath,我也可以确认这完全解决了我的问题。

但是下一个自然的问题是-如果默认情况下无法解析GAC中添加的程序集,那么Microsoft为什么不将NuGet用于Azure SDK? NuGet中唯一的官方Azure参考是旧的。这是否意味着任何使用新CSPROJ格式的Azure项目都需要将GAC手动添加到AssemblySearchPaths中?

答案 1 :(得分:0)

"<Reference Include="Microsoft.WindowsAzure.ServiceRuntime, Version=2.7.0.0, …" />"的格式为Right。这个问题似乎是由于VS无法从正确的位置找到该程序集而导致的。 建议:

  

如果程序集存在于默认文件夹中:

  1. 手动添加:在VS2019预览中,默认位置为“ C:\Program Files\Microsoft SDKs\Azure\.NET SDK\v2.9\ref”,导航到该文件夹​​以找到装配。然后转到Reference=>add Reference=>Browser to add it manually
  2. 此外,我们可以从VS用户界面中删除和添加引用,但程序集应位于“扩展名”而不是“框架”中。因为该程序集似乎不在GAC中,所以我在GAC中找不到它。      enter image description here
  

如果组装件不在机器中:

1。我们可以通过nuget下载程序集。之后,删除我们不需要的其他程序集。

2。我们可以将程序集从存在旧项目的PC复制到当前机器。并浏览以手动添加它。

希望有帮助。任何更新都可以在此处共享。