Understanding a csproj assembly reference
Asked Answered
P

1

70

I am using VS2010 and I tried to add a few assemblies from local hard disk to my C# project through file reference. Peeking into the csproj file, I found sometimes the file reference appears as

<Reference Include="name">

However sometimes it appears as

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

What could cause the difference?


Inspired by k3b's answer, I did another test. I created a new class library project.

  1. Add a file reference. The initial value of Specific Version in Properties pane is False. The csproj file look like

    <Reference Include="Name">
      <HintPath>...</HintPath>
    </Reference>
    
  2. Change Specific Version in Properties pane to True. VS adds version in the Include attribute.

    <Reference Include="Name, Version=...">
      <HintPath>...</HintPath>
    </Reference>
    
  3. Change Specific Version in Properties pane to False again. VS adds a child element SpecificVersion.

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

So it seems that the rule is:

  • When Version is present in Include attribute and there is no SpecificVersion child element, the file assembly is configured to be Specific Version
  • The SpecificVersion child element is only appended with value False.

One thing I still do not understand:

  • For my new test project, if I remove the file reference and add it back again, it goes back to format in point 1, which is the default.
  • For my existing project, if I remove the file reference and add it back again, I get back format in point 3. Although it also means that Specific Version is not used, I am wondering why it does not go back to format in point 1.
Purim answered 16/5, 2013 at 4:4 Comment(0)
F
32

Which reference-type you get depends on how you link the assembly.

  • select the referenced assembly in the project-explorer
  • go to the properties-page

there you find a boolean flag "specific Version"

  • true means: the assembly must have version=xxx
  • false means: ignore the assembly version

(I only have a german-vs2010 so the english translation for the german "Spezifische Version" may be slightly different)

[update]

I tried the following using vcs2010-express german

add reference with default SpecificVersion=False : no version

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

modified reference: SpecificVersion=True : added version

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

modified reference again: SpecificVersion=False : version remains and new element 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>

It seems that the specific version is remembered but ignorede because of <SpecificVersion>False</SpecificVersion>

Favorite answered 16/5, 2013 at 6:56 Comment(4)
are you sure? in my VS2010, SpecificVersion is a child of the element Reference. Is has no impact on <Reference Version="..."/> other that the attributs is ignored.Chloechloette
I did a test. The Specific Version initially is False. I then manually edited the csproj file to remove the version info. And then I changed Specific Version to True. I observed that VS inserted the version info. So it seems that it is somehow related to Specific Version. However, I am wondering now why VS does not remember my last change. Even I reset Specific Version to False and remove and readd the assembly reference, the version info is still inserted.Purim
I confirm your observations. Updated the answer accordingly.Favorite
For projects dependening on other projects I noticed the following: "inherited"/transitive dll dependencies are referenced with version and specific set to false while directly set dll dependencies go without any version info.Christly

© 2022 - 2024 — McMap. All rights reserved.