以新的 CSPROJ 格式引用 GAC 程序集?

Reference GAC assemblies in new CSPROJ format?

我正在使用 Visual Studio 2019 预览版 2.1。我有一个 .NET Framework 4.6.1 class 库 C# 项目,它有一些旧 csproj 项目格式 (ToolsVersion="15.0") 的 Azure 引用。这个旧的 csproj 目前可以正常构建和运行。我正在尝试迁移到新的项目格式。一切进展顺利,除了我有一个不是来自 NuGet 的参考——它来自 GAC:Microsoft.WindowsAzure.ServiceRuntime。但是,我还没有弄清楚如何获取新的项目格式来查找程序集。例如这里是新的项目文件:

<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>

事实上,Microsoft.WindowsAzure.ServiceRuntime 引用正是旧格式中的行。在 VS 中加载它时会产生以下警告:

警告 MSB3245 无法解析此引用。找不到程序集 "Microsoft.WindowsAzure.ServiceRuntime, Version=2.7.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"。检查以确保程序集存在于磁盘上。如果您的代码需要此引用,您可能会遇到编译错误。我的项目 C:\Program Files (x86)\Microsoft Visual Studio19\Preview\MSBuild\Current\Bin\Microsoft.Common.CurrentVersion.targets 2114

我试图删除版本:

<Reference Include="Microsoft.WindowsAzure.ServiceRuntime" />

但这并没有帮助。如果我删除它并尝试从 VS 用户界面添加引用,我会看到 'Framework'(GAC)中有一堆 Microsoft.* 和 System.* 选项,但 Microsoft.WindowsAzure.ServiceRuntime 不是其中之一。只是为了确认我启动了 ILSpy 并选择了 "Open From GAC..." 并且果然它与一堆其他未出现在 VS 用户界面中的程序集一起存在。

如何让 VS 从 GAC 加载此引用?

谢谢

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

If the assembly exists in the default folder:

  1. 手动添加:在VS2019预览中,它的默认位置是“C:\Program Files\Microsoft SDKs\Azure\.NET SDK\v2.9\ref”,导航到文件夹找到程序集。然后去Reference=>add Reference=>Browser to add it manually.
  2. 此外,我们可以从 VS 用户界面中删除和添加引用,但程序集应该在 'Extensions' 而不是 'Framework' 中。因为程序集好像没有在GAC中定位,所以我在GAC中没有找到。

If the assembly doesn’t exist in machine:

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

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

希望对您有所帮助。任何更新都可以在这里分享。

所以我发现 this thread on GitHub 这表明 没有发现添加到 GAC 的程序集是预期的行为:

This behaviour is by-design. You can opt back in as shown here. This should not be considered a workaround, but rather a deliberate and supported opt-in where you accept the consequences of having potentially different (and even incorrect) build behaviour on different machines.

解决方法如下:

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

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

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