Ссылка сборок GAC в новом формате CSPROJ? - PullRequest
0 голосов
/ 02 февраля 2019

Я использую Visual Studio 2019 Preview 2.1.У меня есть проект C # библиотеки классов .NET Framework 4.6.1, в котором есть некоторые ссылки Azure в старом формате проекта csproj (ToolsVersion = "15.0").Этот старый 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, версия = 2.7.0.0, культура = нейтральная, 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, я вижу, что есть несколько вариантов Microsoft. * И System. * В 'Framework' (GAC), но Microsoft.WindowsAzure.ServiceRuntime не является одним изих.Просто чтобы подтвердить, что я запустил ILSpy и выбрал «Открыть из GAC ...» и, конечно же, он есть вместе с кучей других сборок, которые не отображаются в пользовательском интерфейсе VS.

Как я могу получитьVS чтобы загрузить эту ссылку из GAC?

Спасибо

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Итак, я обнаружил этот поток на GitHub , который указывает, не обнаруживает сборки, добавленные в GAC, это ожидаемое поведение:

Это поведение является задним числом.Вы можете вернуться, как показано здесь .Это не должно рассматриваться как обходной путь, а скорее является преднамеренным и поддерживаемым соглашением, при котором вы принимаете последствия потенциально различного (и даже неправильного) поведения при сборке на разных машинах.

Решение состоит в том, чтобывыполните следующее:

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

Я могу подтвердить, что это решает мою проблему полностью, даже без использования HintPath.

Но естественный следующий вопрос - если разрешение добавленных сборок в GAC не будетработать по умолчанию, почему Microsoft не использует NuGet для Azure SDK?Единственная официальная ссылка Azure в NuGet старая.Означает ли это, что любой проект Azure, использующий новый формат CSPROJ, должен будет вручную добавить GAC в AssemblySearchPaths?

0 голосов
/ 04 февраля 2019

Формат этого "<Reference Include="Microsoft.WindowsAzure.ServiceRuntime, Version=2.7.0.0, …" />" Правильный.И эта проблема, кажется, является результатом того, что VS не может найти эту сборку из правильного положения.Предложения:

Если сборка существует в папке по умолчанию:

  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.enter image description here

Если сборка не существует в машине:

1.Можно загрузить сборку по NuGet .После этого удалите другие сборки, которые нам не нужны.

2.Мы можем скопировать сборку с ПК, на котором существует старый проект, на текущую машину.И просмотрите, чтобы добавить это вручную.

Надеюсь, это поможет.Любое обновление не стесняйтесь поделиться здесь.

...