8

我有一个依赖于几个 DLL 引用的 Visual Studio 项目。这是我的 csproj 中这些引用的示例:

<ItemGroup>
  <Reference Include="Class1.Project1">
    <SpecificVersion>False</SpecificVersion>
    <HintPath>..\bin\Class1.Project1.dll</HintPath>
    <Private>False</Private>
  </Reference>
  <Reference Include="Class1.Project2">
    <SpecificVersion>False</SpecificVersion>
    <HintPath>..\bin\Class1.Project2.dll</HintPath>
    <Private>False</Private>
  </Reference>
</ItemGroup>

但是,当我将此类作为项目依赖项包含在网站项目中时,Visual Studio 会查找上面显示的依赖项的依赖项。在构建过程中,Visual Studio 会将“Copy Local”属性默认为“True”,并将这些依赖项复制到我网站的 ~/bin 目录中。

这反过来又会覆盖该目录中已存在的 DLL 文件的版本。这会导致以下错误:

无法加载文件或程序集 'Class5.Project5, Version=3.6.1861.2, Culture=neutral, PublicKeyToken=dfeaee0e3978ac79' 或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。(来自 HRESULT 的异常:0x80131040)

如何使 Visual Studio 将所有内容的“复制本地”设置默认为“假” ?我不希望 Visual Studio 在构建期间自动复制 DLL 文件。我也不想将我的构建绑定到非常特定的 DLL 版本。

4

4 回答 4

2

在我看来,好像您将多个项目配置为输出到同一个目录 - 这是真的吗?

如果是这样,您需要检查您的配置,因为 Visual Studio 假定(不,需要)每个项目都有一个唯一的输出目录。

另外,你写道:

这反过来又会覆盖该目录中已存在的 DLL 文件的版本。

这些现有文件是从哪里来的?

Visual Studio 假定它拥有在构建输出目录中进行任何它认为合适的更改的完全权利 - 尝试与之争论是通往全新痛苦世界的好途径。

(不幸的是,我是根据经验说话的。叹息。)

于 2009-05-18T09:21:25.167 回答
1

我曾经遇到过这个问题,

发布时:防止覆盖现有 dll 文件的最简单方法是将它们设置为只读。对于无法替换的每个文件,您将在发布时收到警告,但它会完成这项工作。

On Build:要自动关闭 CopyLocal,您需要将 dll 文件放在 GAC 上。

于 2009-05-15T11:40:22.093 回答
0

您可以在项目文件中尝试以下操作。

<ReferenceOutputAssembly>false</ReferenceOutputAssembly> 

然后,在你的代码中试试这个。

<ItemGroup>
  <Reference Include="Class1.Project1">
    <SpecificVersion>False</SpecificVersion>
    <HintPath>..\bin\Class1.Project1.dll</HintPath>
    <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
  </Reference>
  <Reference Include="Class1.Project2">
    <SpecificVersion>False</SpecificVersion>
    <HintPath>..\bin\Class1.Project2.dll</HintPath>
    <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
  </Reference>
</ItemGroup>
于 2012-08-03T16:45:22.300 回答
0

为什么 bin 目录中已经有其他版本?

无论如何,我想知道您是否会在使用 Web 应用程序项目时遇到同样的问题。由于它是一个项目,它有一个列出直接引用的文件,如果这些是项目引用(对同一解决方案中其他程序集的输出的引用),则 MSBUILD 可以确保使用正确的版本。

看看您是否可以通过从一个新的 Web 应用程序项目开始并添加引用来重现这一点。

于 2009-05-15T11:58:37.167 回答