Понимание справочной системы csproj

Я использую VS2010, и я попытался добавить несколько сборок с локального жесткого диска на мой проект С# через ссылку на файл. Заглянув в файл csproj, я обнаружил, что ссылка на файл появляется как

<Reference Include="name">

Однако иногда это выглядит как

<Reference Include="name, Version=xxx, Culture=neutral, 
                                          processorArchitecture=MSIL">

Чем может быть разница?


Вдохновленный ответом k3b, я сделал еще один тест. Я создал новый проект библиотеки классов.

  • Добавьте ссылку на файл. Исходное значение Специфицированной версии в панели Свойства - False. Файл csproj выглядит как

    <Reference Include="Name">
      <HintPath>...</HintPath>
    </Reference>
    
  • Измените конкретную версию в панели "Свойства" на "Истина". VS добавляет версию в атрибут Include.

    <Reference Include="Name, Version=...">
      <HintPath>...</HintPath>
    </Reference>
    
  • Снова измените конкретную версию в панели свойств на False. VS добавляет дочерний элемент SpecificVersion.

    <Reference Include="Name, Version=...">
      <HintPath>...</HintPath>
      <SpecificVersion>False</SpecificVersion>
    </Reference>
    

Итак, кажется, что правило:

  • Когда версия присутствует в атрибуте Include и нет дочернего элемента SpecificVersion, сборка файла настроена на определенную версию
  • Детский элемент SpecificVersion добавляется только со значением False.

Одна вещь, которую я до сих пор не понимаю:

  • Для моего нового тестового проекта, если я удалю ссылку на файл и добавлю его обратно, он вернется к форматированию в точке 1, которая по умолчанию.
  • Для моего существующего проекта, если я удалю ссылку на файл и добавлю его обратно, я верну формат в пункте 3. Хотя это также означает, что конкретная версия не используется, мне интересно, почему она не возвращается в формат в пункте 1.

Ответ 1

Какой ссылочный тип вы получите, зависит от того, как вы связываете сборку.

  • выберите ссылочную сборку в проекте-проводнике
  • перейдите на страницу свойств

там вы найдете логический флаг "конкретная версия"

  • true означает: сборка должна иметь версию = xxx
  • false означает: игнорировать версию сборки

(У меня есть только german-vs2010, поэтому английский перевод для немецкой "Spezifische Version" может немного отличаться)

[обновление]

Я попробовал следующее, используя vcs2010-express german

добавить ссылку с по умолчанию SpecificVersion = False: нет версии

<Reference Include="Castle.Core">
  <HintPath>..\..\..\lib\fluentNHibernate\Castle.Core.dll</HintPath>
</Reference>

измененная ссылка: SpecificVersion = True: добавлена ​​версия

<Reference Include="Castle.Core, Version=2.5.1.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL">
  <HintPath>..\..\..\lib\fluentNHibernate\Castle.Core.dll</HintPath>
</Reference>

измененная ссылка снова: SpecificVersion = False: версия остается и новый элемент SpecificVersion

<Reference Include="Castle.Core, Version=2.5.1.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL">
  <HintPath>..\..\..\lib\fluentNHibernate\Castle.Core.dll</HintPath>
  <SpecificVersion>False</SpecificVersion>
</Reference>

Кажется, что конкретная версия запоминается, но игнорируется из-за <SpecificVersion>False</SpecificVersion>