我可以将Visual Studio中"复制本地"的默认选项设置为False吗?大多数情况下,当我将dll作为项目的依赖项添加时,我希望将Copy Local属性设置为False。默认情况下,它是True。是否有一种方法可以更改Visual Studio的默认行为?(2008)
我可以将Visual Studio中"复制本地"的默认选项设置为False吗?大多数情况下,当我将dll作为项目的依赖项添加时,我希望将Copy Local属性设置为False。默认情况下,它是True。是否有一种方法可以更改Visual Studio的默认行为?(2008)
不会 - Visual Studio使用一组内部规则来确定Copy Local的设置。
从MSDN:
- 如果引用是另一个项目,称为项目对项目引用,则该值为true。
- 如果程序集在全局程序集缓存中找到,则该值为false。
- 作为特殊情况,mscorlib.dll引用的值为false。
- 如果程序集在Framework SDK文件夹中找到,则该值为false。
- 否则,该值为true。
实际上,您可以。您需要以下几点:
.targets
文件,并将 copylocal (<Private>
标签,确切地说) 默认设置为false。.csproj
文件中导入该目标。您可以将其添加在最后一行之前,关闭 </Project>
标记之前,它看起来像 <Import Project="..\Build\yourtarget.targets" />
。现在,每个具有此目标的项目都默认禁用了copylocal。
缺点是您需要修改每个csproj文件,包括新项目。您可以通过修改VS项目模板解决新项目问题。与博客文章中描述的 Class.cs
不同,您需要修改的是 Class.vstemplate
(在相同的zip文件中)。
使用这种方法,还有一个问题 - 路径本身。如果在新生成的csproj文件中使用硬编码的相对路径,则可能会出现错误(除非您具有平面项目结构)。
您可以:
肯定有更好的解决方法,但我还没有找到。
.csproj
文件,通过模板导入到每个新项目中。模板系统不是很干净,我们还不确定是否喜欢它。 - Anthony Mastrean从 msbuild v 15 开始,您可以在包含源代码的根文件夹中复制一个名为Directory.Build.props的单个文件:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemDefinitionGroup>
<Reference>
<Private>False</Private>
</Reference>
<ProjectReference>
<Private>False</Private>
</ProjectReference>
</ItemDefinitionGroup>
</Project>
已经没有其他事情要做了!这在Visual Studio 2017以及vNext Build中运作良好。您可能需要关闭Visual Studio,然后重新打开解决方案才能生效。
我们不使用.targets文件(如ya23的答案中建议的那样),所以我们只是在文本编辑器中手动编辑.csproj项目文件,并在引用中添加<Private>元素,就像这样:
<Reference Include="[...]">
<Private>False</Private>
[...]
</Reference>
<Private>
元素的值与“复制本地”属性的值相匹配。例如,如果 <Private>
设置为 False,则“复制本地”也为 False。
关于@herzbube发布的解决方案,如果您想关闭在.csproj文件中的所有(或大多数)引用的“复制本地”功能,则无需在每个Reference
上单独设置<Private>False</Private>
,您可以直接将以下内容放入.csproj中:
<ItemDefinitionGroup>
<Reference>
<Private>False</Private>
</Reference>
</ItemDefinitionGroup>
这不会影响使用<ProjectReference>
引用的项目,但您可以为这些项目执行同样的操作——要么替代,要么一并执行:
<ItemDefinitionGroup>
<ProjectReference>
<Private>False</Private>
</ProjectReference>
</ItemDefinitionGroup>
<ItemDefinitionGroup>
<Reference>
<Private>False</Private>
</Reference>
<ProjectReference>
<Private>False</Private>
</ProjectReference>
</ItemDefinitionGroup>
<Reference … >
或 <ProjectReference … >
标签之前放置这些覆盖,因为这些块只适用于出现在它们下面的引用。然后,如果有一些你确实想要本地复制的内容,你可以单独覆盖这些内容(即在各自的标签内部),这次使用 True
。<Private>False</Private>
,这通常取决于具体情况,但对于初学者来说,每个使用默认(即每个项目本地)C#输出位置的大型解决方案几乎总是应该采取以下步骤:<ProjectReference>
相互依赖,并且最终构建一个或多个应用程序(即可执行文件):<ProjectReference>
块。
原因:没有必要将任何 .dll 收集到其自己的子目录中,因为从该位置永远不会运行任何可执行文件。这种繁琐的复制只是无用的忙碌工作,并可能不必要地减慢您的构建速度,可能相当大。<ProjectReference>
,您表明您不希望将引用的项目DLL复制到生成文件夹中。这不包括您在该类库中可能使用的其他软件包引用。此外,如果您最终在<Reference>
节点中包含false属性,则未在应用程序项目中明确引用的传递依赖项将不会被复制到生成文件夹中。 - Pavisa<private>
,2.) 您指出的维护问题很少(并且不重要),以及3.) 作为交换,每次构建时不会复制 1,000 个支持 .dll 文件到从未“执行”的位置,后者事实上使它们的存在变得无用甚至有害。 - Glenn Slayden.csproj
交叉引用的工作流不会一直改变,或者很少出现在调试器运行时明显暴露的错误,可以轻松检测和解决。 - Glenn Slayden