Внешний псевдоним 'xxx' не был указан в параметре / reference - PullRequest
40 голосов
/ 23 марта 2010

У меня есть две сборки, которые, к сожалению, определяют один и тот же тип в одном и том же пространстве имен. Я пытаюсь использовать extern alias, чтобы обойти проблему. В Visual Studio IDE я установил свойство «Псевдонимы» ссылки на мой псевдоним. Это должно изменить командную строку компилятора C # на что-то вроде этого:

/reference:MyAlias=MyAssembly.dll

Но на самом деле это не так. В Visual Studio IDE, похоже, просто игнорируется настройка свойства Aliases в ссылке. Поэтому, когда я иду и добавляю строку extern alias MyAlias; вверху моего файла кода C #, я получаю сообщение об ошибке, что псевдоним не был указан в опции / reference для компилятора. Я не могу понять, что я делаю неправильно. Есть идеи?

Ответы [ 14 ]

22 голосов
/ 22 октября 2010

У меня та же проблема, и я смог воспроизвести проблему.

Оказывается, псевдонимы ссылок игнорируются в проектах, содержащих файлы 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>
10 голосов
/ 21 июня 2011

Обновление: Это ошибка. Это будет исправлено в .Net 4.5.

Как видно из сообщения об ошибке Microsoft Connect .

10 голосов
/ 15 марта 2011

Брайан, у меня была такая же проблема, как и у вас, и я понял, как это исправить.

Я бы сделал то же самое, что и вы:

  1. Используйте окно свойств, чтобы изменить псевдоним для сборки с 'global' на 'MyAlias'
  2. В верхней части файла, где используется псевдоним сборки, поместите внешний псевдоним MyAlias. Это должно быть перед любым оператором использования.
  3. Используйте префикс псевдонима, чтобы использовать желаемое пространство имен, например, используя MyAlias ​​:: MyNamespace.

И я все равно получил бы ошибку. Немного повредив, я понял, что способ исправить это - установить dll, на который ссылаются, на dll, который находится за пределами решения, в котором вы работаете. Как только я это сделал, сообщение об ошибке, которое мы оба видели, исчезло, и я смог продолжить работу над своим проектом.

Надеюсь, это поможет, удачного кодирования!

3 голосов
/ 16 февраля 2013

Если вы установите .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

3 голосов
/ 10 мая 2010

Работа для меня в VS2008 с помощью этих шагов:

  1. Используйте окно свойств, чтобы изменить псевдоним для сборки с «глобального» на «MyAlias»
  2. В верхней части файла, в котором используется псевдоним, укажите extern alias MyAlias. Это должно быть до любых using операторов .
  3. Используйте префикс псевдонима для использования нужного пространства имен, например using MyAlias::MyNamespace.
2 голосов
/ 12 января 2011

У меня была такая же проблема, и она была решена с помощью следующих действий.

Перейдите в окно свойств сборки с конфликтом и измените свойство Aliases с «global» на «X» (X - ваше имя псевдонима)

Надеюсь, это поможет.

2 голосов
/ 15 сентября 2010

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

1 голос
/ 05 мая 2019

Немного отличается от предложенного 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 s, так и для PackageReference s!

Решение было найдено здесь: https://github.com/NuGet/Home/issues/4989#issuecomment-311042085

1 голос
/ 18 февраля 2016

myproject. У меня была та же проблема, но вышеупомянутые решения не работали. Мой файл проекта выглядел как

    <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>
1 голос
/ 12 июня 2015

Установите целевую структуру проекта на .NET 4.5.1 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...