了解 csproj 程序集参考

Posted

技术标签:

【中文标题】了解 csproj 程序集参考【英文标题】:Understanding a csproj assembly reference 【发布时间】:2013-05-10 20:06:25 【问题描述】:

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

<Reference Include="name">

但有时它会显示为

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

什么可能导致差异?


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

    添加文件引用。 Properties 窗格中Specific Version 的初始值为Falsecsproj 文件看起来像

    <Reference Include="Name">
      <HintPath>...</HintPath>
    </Reference>
    

    属性窗格中的特定版本更改为True。 VS 在Include 属性中添加版本。

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

    属性窗格中的特定版本再次更改为False。 VS 添加子元素SpecificVersion

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

所以看来规则是:

Version 存在于 Include 属性中且没有SpecificVersion 子元素时,文件程序集配置为特定版本 SpecificVersion 子元素仅附加值 False

有一件事我还是不明白:

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

【问题讨论】:

【参考方案1】:

您获得哪种引用类型取决于您如何链接程序集。

在项目浏览器中选择引用的程序集 转到属性页

在那里你会找到一个布尔标志“特定版本”

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

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

[更新]

我使用 vcs2010-express German 尝试了以下操作

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

好像是因为&lt;SpecificVersion&gt;False&lt;/SpecificVersion&gt;而记住了具体的版本而忽略了

【讨论】:

你确定吗?在我的 VS2010 中,SpecificVersion 是元素 Reference 的子元素。 Is 对 &lt;Reference Version="..."/&gt; 没有影响,其他属性被忽略。 我做了一个测试。特定版本最初为 False。然后我手动编辑了 csproj 文件以删除版本信息。然后我将特定版本更改为 True。我观察到 VS 插入了版本信息。所以它似乎与特定版本有关。但是,我现在想知道为什么 VS 不记得我的最后一次更改。即使我将特定版本重置为 False 并删除并读取程序集引用,版本信息仍被插入。 我确认您的观察。相应地更新了答案。 对于依赖于其他项目的项目,我注意到以下内容:“继承”/传递 dll 依赖项使用版本引用,并且特定设置为 false,而直接设置 dll 依赖项没有任何版本信息。

以上是关于了解 csproj 程序集参考的主要内容,如果未能解决你的问题,请参考以下文章

Linux Mono C#错误:无法打开程序集'Bovine.csproj':文件不包含有效的CIL图像

Visual Studio组件包含哪些公共程序集?

将其他依赖程序集发布到 azure 应用服务

防止将引用的程序集 PDB 和 XML 文件复制到输出

由于缺少未丢失的程序集引用,Visual Studio拒绝构建项目

防止将引用的程序集PDB和XML文件复制到输出