以新的 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:
- 手动添加:在VS2019预览中,它的默认位置是“
C:\Program Files\Microsoft SDKs\Azure\.NET SDK\v2.9\ref
”,导航到文件夹找到程序集。然后去Reference=>add Reference=>Browser to add it manually
.
- 此外,我们可以从 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 中?
我正在使用 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:
- 手动添加:在VS2019预览中,它的默认位置是“
C:\Program Files\Microsoft SDKs\Azure\.NET SDK\v2.9\ref
”,导航到文件夹找到程序集。然后去Reference=>add Reference=>Browser to add it manually
. - 此外,我们可以从 VS 用户界面中删除和添加引用,但程序集应该在 'Extensions' 而不是 'Framework' 中。因为程序集好像没有在GAC中定位,所以我在GAC中没有找到。
If the assembly doesn’t exist in machine:
1.We可以通过nuget下载程序集。之后,删除我们不需要的其他程序集。
2.We可以将程序集从旧项目所在的PC复制到当前机器。并浏览以手动添加它。
希望对您有所帮助。任何更新都可以在这里分享。
所以我发现 this thread on GitHub 这表明
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 中?