【问题标题】:Reference GAC assemblies in new CSPROJ format?以新的 CSPROJ 格式引用 GAC 程序集?
【发布时间】:2019-06-26 16:12:04
【问题描述】:

我正在使用 Visual Studio 2019 预览版 2.1。我有一个 .NET Framework 4.6.1 类库 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”。检查以确保该程序集存在于磁盘上。如果您的代码需要此引用,您可能会遇到编译错误。 MyProject C:\Program Files (x86)\Microsoft Visual Studio\2019\Preview\MSBuild\Current\Bin\Microsoft.Common.CurrentVersion.targets 2114

我试图删除版本:

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

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

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

谢谢

【问题讨论】:

  • 试试我的解决方案怎么样。如果有任何更新,您可以在这里分享,以便我们为您检查。

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


【解决方案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 中?

【讨论】:

    【解决方案2】:

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

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

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

    如果机器中不存在该程序集:

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

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

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

    【讨论】:

    • 如果我像建议的那样使用“浏览”手动添加它,它只会添加一个提示路径,即:&lt;HintPath&gt;..\..\..\Program Files\Microsoft SDKs\Azure\.NET SDK\v2.9\ref\Microsoft.WindowsAzure.ServiceRuntime.dll&lt;/HintPath&gt; 这可以正常工作并使一切正常工作。但是为什么新的 CSPROJ 格式不能像旧格式那样在 GAC 中找到程序集呢?如果我像建议的那样查看“扩展”,我只会看到:No user assemblies were found on the machine. 所以我的 atm 已畅通,但我认为我必须在系统中有一个硬路径引用才能使 GAC 引用正常工作,这很糟糕。跨度>
    • 不知何故,我的 vs2019 今天在“扩展”中找不到程序集。然后我检查“C:\ Program Files \ Microsoft SDKs \ Azure \ .NET SDK \ v2.9 \ ref”并发现Microsoft SDK下没有Azure文件夹。我不确定我是否不小心删除了错误它。
    • 之后,我使用 gacutil.exe 手动将程序集添加到 GAC。我仍然无法在“扩展”中找到程序集。所以我手动创建了一个文件夹架构,如“\Azure\.NET SDK\v2.9\ref”,然后我现在可以在“扩展”中找到它。似乎 "Microsoft SDKS\...\" 路径是 vs2019 中的搜索路径之一,如果可能,您可以尝试使用 gacutil 手动将其添加到 GAC 以检查它是否有效。
    • 注意:上面链接的 nuget 包似乎不是微软的官方包。所有者是 dmytro_belinskyi。我建议不要安装它。
    猜你喜欢
    • 2017-10-23
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多