Переопределение ссылки DLL решения NuGet на базовую библиотеку

Я работаю над программой Windows C# .NET 4.5, которая использует несколько проектов NuGet, чтобы уменьшить объем кода, который мне нужно написать (зачем изобретать велосипед?). Один из этих проектов NuGet по какой-либо причине имеет зависимость, которая переопределяет один из методов MSCORLIB, используемых где-то еще в моей программе.

ReSharper предупреждает меня о двусмысленной ссылке (и я, очевидно, не могу скомпилировать), и я не могу, хоть убей, понять, как указать использование метода MSCORLIB для этой зависимости проекта NuGet. Я потратил пару часов на поиски в Google и чтение разных вещей, но не нашел решения.

Часть моей программы с ошибкой неоднозначной ссылки не в любом случае полагается на зависимость пакета NuGet, поэтому, если я смогу просто реализовать метод MSCORLIB именно в этом месте, я буду золотым.

Это вообще возможно? Я попытался явно добавить ссылку на MSCORLIB в проект с помощью ReSharper «Использовать эту сборку ...», но выбор любой из них не помог, а также вкладка «Ссылки» в Visual Studio.

Кроме того, если я смогу найти обходной путь, и он сломает этот пакет NuGet, мне, очевидно, придется найти совершенно новое решение.

Anders 10.03.2018 04:56

Вы пробовали использовать в верхней части файла: using NugetRef = NugetPackage.Namespace; для псевдонима ссылки на пакет nuget, чтобы устранить неоднозначность вызова?

Ron Beyer 10.03.2018 05:19

Будет ли это работать в этом случае, поскольку они ссылаются на одно и то же пространство имен? Смотрите это изображение: i.imgur.com/rNHtmOg.png

Anders 10.03.2018 05:22

Возможно, не в этом случае ... Вы можете динамически загрузить один из них в новый AppDomain и удалить статическую ссылку.

Ron Beyer 10.03.2018 05:25

У меня нет опыта в этом (Обновлено: динамическая загрузка, о которой вы говорите, - это то, о чем я говорю). Есть ли у вас под рукой какой-нибудь материал, который я мог бы прочитать, чтобы узнать, является ли это потенциальным решением?

Anders 10.03.2018 05:27

Спасибо много. Сможете ли вы создать ответ, чтобы, если я получу решение из ваших комментариев, я мог бы поблагодарить вас за решение?

Anders 10.03.2018 05:39

Это проблема, для решения которой используются псевдонимы. Стандартный вариант использования для них - это ссылка на две разные версии одной и той же сборки, которые будут иметь типы с одинаковыми полными именами. Подробнее см. этот вопрос.

Mike Zboray 10.03.2018 07:42

Что вы имеете в виду под точно, говоря «имеет зависимость, которая отменяет один из методов MSCORLIB, используемых где-то еще в моей программе»? Не могли бы вы привести конкретный пример?

Jon Skeet 10.03.2018 11:00
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
9
1 208
1

Ответы 1

Вы можете решить эту проблему, используя псевдонимы сборки и extern alias. Чтобы решить эту проблему, вам нужно будет вручную отредактировать файл .csproj вашего проекта.

Если вы используете packages.config, найдите в своем файле .csproj элемент <Reference>, который соответствует проекту, вызывающему конфликтующий тип, и назначьте ему псевдоним.

<Reference Include = "bouncy_castle_hmac_sha_pcl, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
  <HintPath>..\packages\BouncyCastle-PCL.1.0.0.6\lib\bouncy_castle_hmac_sha_pcl.dll</HintPath>
  <Aliases>bouncy_castle</Aliases>
</Reference>

Если вместо этого вы используете PackageReference, прямого элемента <Reference> не будет, поэтому вместо этого вам нужно добавить цель для присвоения этого значения.

<Target Name = "AssignAliasesToAssemblies" BeforeTargets = "FindReferenceAssembliesForReferences;ResolveReferences">
  <ItemGroup>
    <ReferencePath Condition = "'%(FileName)' == 'bouncy_castle_hmac_sha_pcl'">
      <Aliases>bouncy_castle</Aliases>
    </ReferencePath>
  </ItemGroup>
</Target>

Затем вы можете перезагрузить свой проект. В вашем C# добавьте extern alias bouncy_castle; в начало файла. Это проинструктирует компилятор, как устранить неоднозначность между двумя типами.

extern alias bouncy_castle;
using System.Security.Cryptography;

namespace ClassLibrary2
{
    public class Class1
    {
        public HMACSHA1 Algorithm { get; }
        public bouncy_castle::System.Security.Cryptography.HMACSHA1 TheOtherOne { get; }
    }
}

Кстати, смотрите этот выпуск: https://github.com/NuGet/Home/issues/4989

Другие вопросы по теме