Внешний псевдоним "xxx" не был указан в опции/reference
У меня есть две сборки, которые, к сожалению, определяют один и тот же тип в одном и том же пространстве имен. Я пытаюсь использовать extern alias
для решения этой проблемы. В Visual Studio IDE я установил свойство "Псевдонимы" ссылки на мой псевдоним. Это должно изменить командную строку компилятора С# следующим образом:
/reference:MyAlias=MyAssembly.dll
Но на самом деле это не так. В Visual Studio IDE, похоже, просто игнорируется свойство свойства "Псевдонимы" в ссылке. Поэтому, когда я иду и добавляю строку extern alias MyAlias;
вверху моего файла кода С#, я получаю сообщение об ошибке, что псевдоним не был указан в параметре /reference для компилятора. Я не могу понять, что я делаю неправильно. Любые идеи?
Ответы
Ответ 1
У меня такая же проблема, и я смог воспроизвести проблему.
Оказывается, ссылочные псевдонимы игнорируются в проектах, содержащих xaml файлы, которые имеют определение xmlns для сборки вывода, например xmlns: local = 'clr-namespace: TestProject.
Если вы считаете, что это ваш случай, пожалуйста, проголосуйте за мой отчет об ошибке в Microsoft Connect.
EDIT:
В приведенной выше ссылке предлагается предлагаемое решение, требующее редактирования файла проекта вручную. Чтобы это работало, я должен был дать полный путь сборки. Добавьте в конец файла проекта следующие инструкции:
<Target Name="solveAliasProblem" >
<ItemGroup>
<ReferencePath Remove="FullPath.dll"/>
<ReferencePath Include="FullPath.dll">
<Aliases>ourAlias</Aliases>
</ReferencePath>
</ItemGroup>
</Target>
<PropertyGroup>
<CoreCompileDependsOn>solveAliasProblem;$(PrepareResourcesDependsOn)</CoreCompileDependsOn>
</PropertyGroup>
Ответ 2
Брайан, у меня была такая же проблема, как вы и я выяснили, как это исправить.
Я бы сделал то же самое, что и вы:
- Используйте окно свойств, чтобы изменить псевдоним для сборки с 'global' на 'MyAlias'
- В верхней части файла, в котором используется алиасовая сборка, добавьте внешний псевдоним MyAlias. Это должно быть до любого использования операторов.
- Используйте префикс псевдонима для использования пространства имен, которое вы хотите, например, с помощью MyAlias :: MyNamespace.
И я все равно получаю ошибку. Немного покрутив, я понял, что способ исправить это - установить ссылочную DLL в DLL, которая находится за пределами решения, в котором вы работаете. Когда я это сделал, сообщение об ошибке, которое мы оба видели, ушло, и я смог продолжить работу над своим проектом.
Я надеюсь, что это поможет, счастливое кодирование!
Ответ 3
Обновление:
Это ошибка. Он будет исправлен в .Net 4.5.
Как видно на Отчет об ошибке Microsoft Connect.
Ответ 4
Работайте со мной в VS2008, используя следующие шаги:
- Используйте окно свойств, чтобы изменить псевдоним для сборки с 'global' на 'MyAlias'
- В верхней части файла, где используется алиасовая сборка, поместите
extern alias MyAlias
. Это должно быть перед любыми операторами using
.
- Используйте префикс псевдонима для использования требуемого пространства имен, например
using MyAlias::MyNamespace
.
Ответ 5
Если вы установите .NET Framework 4.5, он обновит ваш MSBuild до Microsoft (R) Build Engine version 4.0.30319.17929
, который исправил эту проблему для моей команды.
Загрузить .Net Framework 4.5:
http://www.microsoft.com/en-us/download/details.aspx?id=30653
Ответ 6
У меня была точно подобная проблема, похоже, когда вы очищаете свое решение и строите проект, MSBuild в первый раз игнорирует ссылки и дает ошибку (может быть, у нее нет встроенных сборок с указанными ссылками), однако при второй попытке сборки, он работает.
Ответ 7
У меня была та же проблема, и она была решена с помощью следующего.
Перейдите в окно свойств сборки с конфликтом и измените свойство "Псевдонимы" с "global" на "X" (X - ваше псевдоним)
Надеюсь, что это поможет.
Ответ 8
Установите целевую структуру проекта в .NET 4.5.1.
Ответ 9
myprojectHed ту же проблему, но вышеупомянутые решения не работали, мой файл проекта выглядел как
<Reference Include="AntiXSSLibrary" Condition="'$(TargetFrameworkVersion)' == 'v4.0' or '$(TargetFrameworkVersion)' == 'v4.5'">
<HintPath>..\Dependencies\Third-party\.net 4\AntiXSSLibrary.dll</HintPath>
<Aliases>antixss</Aliases>
</Reference>
<Reference Include="AntiXssLibrary">
<HintPath>..\..\lib\myproject\AntiXssLibrary.dll</HintPath>
</Reference>
Добавление псевдонима, с которым работала фактическая DLL проекта. Итак,
<Reference Include="AntiXSSLibrary" Condition="'$(TargetFrameworkVersion)' == 'v4.0' or '$(TargetFrameworkVersion)' == 'v4.5'">
<HintPath>..\Dependencies\Third-party\.net 4\AntiXSSLibrary.dll</HintPath>
<Aliases>antixss</Aliases>
</Reference>
<Reference Include="AntiXssLibrary">
<HintPath>..\..\lib\myproject\AntiXssLibrary.dll</HintPath>
<Aliases>antixss</Aliases>
</Reference>
Ответ 10
У меня была та же проблема, и я, наконец, обнаружил, что файл .csproj имеет целевую версию 4.5, а DLL, с которой я столкнулся с проблемой, нацелен на 4.5.2.
Я изменил свою целевую версию файла .csproj на 4.5.2 и получил успешную сборку.
Ответ 11
У меня была та же проблема, и я мог решить ее только тогда, когда я изменил целевую версию на 4.6.1. Варианты 4, 4.5, 4.5.1 или 4.6 не помогли.
Ответ 12
Пожалуйста, проверьте версию вашей целевой платформы. Должна быть такая же версия.
Я изменяю ту же версию исправил проблему.
введите описание изображения здесь
Ответ 13
Возникла такая же проблема после установки некоторых пакетов NUget, если путь к моему проекту содержит знак "=". У меня был каталог типа "D:\= Projects...", и переименование его решило проблему.
Ответ 14
Немного отличное решение от одного предложенного orcun:
Вручную добавьте это в файл проекта csproj
:
<Target Name="ChangeAliasesOfStrongNameAssemblies" BeforeTargets="FindReferenceAssembliesForReferences;ResolveReferences">
<ItemGroup>
<!-- Use the file name, no need to specify the full path. -->
<ReferencePath Condition="'%(FileName)' == 'StackExchange.Redis.StrongName'">
<!-- Give the desired alias to the file here -->
<Aliases>myAlias</Aliases>
</ReferencePath>
</ItemGroup>
</Target>
Затем вы можете использовать его, добавив псевдоним в верхней части списка using
:
extern alias myAlias;
...
var test = new myAlias::Fully.Qualified.NameSpace();
Кстати, этот работает как для Reference
и для PackageReference
Решение было найдено здесь: https://github.com/NuGet/Home/issues/4989#issuecomment-311042085