了解csproj程序集引用

时间:2013-05-16 04:04:52

标签: c# visual-studio-2010 reference .net-assembly csproj

我正在使用VS2010,我尝试通过文件引用从本地硬盘添加一些程序集到我的C#项目。窥视csproj文件,我发现有时文件引用显示为

<Reference Include="name">

但有时它显示为

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

可能导致差异的原因是什么?


受k3b的回答启发,我做了另一次测试。我创建了一个新的类库项目。

  1. 添加文件参考。 属性窗格中特定版本的初始值为 False csproj文件看起来像

    <Reference Include="Name">
      <HintPath>...</HintPath>
    </Reference>
    
  2. 属性窗格中的特定版本更改为 True 。 VS在Include属性中添加了版本。

    <Reference Include="Name, Version=...">
      <HintPath>...</HintPath>
    </Reference>
    
  3. 属性窗格中的特定版本再次更改为 False 。 VS添加子元素SpecificVersion

    <Reference Include="Name, Version=...">
      <HintPath>...</HintPath>
      <SpecificVersion>False</SpecificVersion>
    </Reference>
    
  4. 所以规则似乎是:

    • 包含属性中存在版本并且没有SpecificVersion子元素时,文件程序集将配置为特定版本
    • SpecificVersion子元素仅附加值 False

    有一点我还是不明白:

    • 对于我的新测试项目,如果我删除文件引用并再次添加它,它将返回到第1点的格式,这是默认值。
    • 对于我现有的项目,如果我删除文件引用并再次添加它,我会在第3点找回格式。虽然这也意味着没有使用特定版本,但我想知道它为什么不回归格式在第1点。

1 个答案:

答案 0 :(得分:28)

您获得的参考类型取决于您如何链接程序集。

  • 在project-explorer
  • 中选择引用的程序集
  • 转到属性页面

你找到一个布尔标志“特定版本”

  • true表示:程序集必须具有version = xxx
  • false表示:忽略程序集版本

(我只有德语vs2010所以德语“Spezifische版本”的英文翻译可能略有不同)

[更新]

我使用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>

,似乎记住了特定版本但忽略了