Visual studio 如何让Visual Studio在未经我的许可的情况下停止在生成过程中复制DLL?

Visual studio 如何让Visual Studio在未经我的许可的情况下停止在生成过程中复制DLL?,visual-studio,copy-local,Visual Studio,Copy Local,我有一个VisualStudio项目,它依赖于几个DLL引用。以下是我的csproj中的参考资料示例: <ItemGroup> <Reference Include="Class1.Project1"> <SpecificVersion>False</SpecificVersion> <HintPath>..\bin\Class1.Project1.dll</HintPath> <Priva

我有一个VisualStudio项目,它依赖于几个DLL引用。以下是我的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>

假的
..\bin\Class1.Project1.dll
假的
假的
..\bin\Class1.Project2.dll
假的
然而,当我将此类作为项目依赖项包含在网站项目中时,VisualStudio正在查找上述依赖项的依赖项。在构建过程中,VisualStudio将“Copy Local”属性默认设置为“True”,并将这些依赖项复制到我的网站的~/bin目录中

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

无法加载文件或程序集 'Class5.Project5,版本=3.6.1861.2, 文化=中立, PublicKeyToken=dfeaee0e3978ac79'或 它的一个依赖项。位于 程序集的清单定义不正确 与程序集引用不匹配。 (来自HRESULT的异常:0x8013100)


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

我曾经遇到过这个问题

发布时:防止在现有dll文件上写入的最简单方法是将它们设置为只读。对于每个无法替换的文件,您将在发布时收到一条警告,但该文件可以完成此任务


编译时:要自动关闭CopyLocal,需要将dll文件放在GAC上。

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

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


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

我觉得好像您有多个项目配置为输出到同一个目录中-这是真的吗

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

你还写道:

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

这些现有文件来自哪里

VisualStudio假定它有权在构建输出目录中进行它认为合适的任何更改—试图与它争论是通向一个全新痛苦世界的好途径


(不幸的是,我是凭经验说的。叹气。)

您可以在项目文件中尝试以下内容

<ReferenceOutputAssembly>false</ReferenceOutputAssembly> 
false
然后,在你的代码中试试这个

<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>

假的
..\bin\Class1.Project1.dll
假的
假的
..\bin\Class1.Project2.dll
假的

VS不要求每个项目都有唯一的输出目录。在我工作的地方,我们有1000多个项目将所有内容输出到一个bin目录。(诀窍是从这个输出目录创建引用。)我们使用nant来填充构建先决条件,并在调试和发布构建之间清理输出目录。这可能不是一个最佳实践,但它确实有效。非常有趣!当我尝试使用VS2003时,我发现编译失败,因为输出目录中的文件正在使用中,当另一个项目试图清除内容时,一个项目保持打开状态。您正在使用哪个版本的Visual Studio?