在我的Visual Studio解决方案中,我有四个项目(每个项目都针对。net 3.5)——对于我的问题,只有这两个是重要的:

这个类库引用了一个第三方DLL文件(elma . DLL) 这个web应用程序项目有一个对MyBaseProject的引用

我通过点击“添加引用…”将elmah.dll引用添加到Visual studio 2008中的MyBaseProject中。→“浏览”选项卡→选择“elmah.dll”。

Elmah Reference的属性如下:

别名-全局 本地复制- true 文化- - - - - - 错误日志模块和处理程序(ELMAH)。网 文件类型-程序集 路径- D:\webs\otherfolder\_myPath\__tools\elmah\ elmah .dll 解决-正确 运行时版本- v2.0.50727 指定版本- false 强名称- false 版本- 1.0.11211.0

在MyWebProject1中,我通过以下方式添加了对项目MyBaseProject的引用: “添加引用……”→“项目”标签→选择“MyBaseProject”。除了以下成员之外,该引用的属性是相同的:

描述- - - 路径- D:\web \CMS\MyBaseProject\bin\Debug\MyBaseProject.dll 版本- 1.0.0.0

如果我在Visual Studio中运行构建,elmah.dll文件将被复制到我的MyWebProject1的bin目录中,以及MyBaseProject.dll!

但是,如果我清理并运行解决方案的MSBuild(通过D:\web \CMS> C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe /t:ReBuild /p:Configuration=Debug MyProject.sln) 在MyWebProject1的bin目录中缺少elmah.dll -尽管构建本身没有包含警告或错误!

我已经确保MyBaseProject的.csproj包含值为"true"的私有元素(这应该是Visual Studio中"copy local"的别名):

<Reference Include="Elmah, Version=1.0.11211.0, Culture=neutral, processorArchitecture=MSIL">
  <SpecificVersion>False</SpecificVersion>
  <HintPath>..\mypath\__tools\elmah\Elmah.dll</HintPath>
    **<Private>true</Private>**
</Reference>

(私有标签在默认情况下不会出现在.csproj的xml中,尽管Visual Studio说“copy local”为真。我切换“复制本地”为假-保存-并将其设置为真-保存!)

MSBuild有什么问题?我如何得到(elmah.dll)引用复制到MyWebProject1的bin?

我不想在每个项目的postbuild命令中添加一个postbuild复制操作!(假设我有许多项目依赖MyBaseProject!)


当前回答

如果你没有在代码中直接使用程序集,那么Visual Studio会检测到它没有被使用,并且不会在输出中包含它。我不知道为什么你看到Visual Studio和MSBuild之间有不同的行为。您可以尝试将构建输出设置为诊断输出,并比较结果,看看它在哪里出现分歧。

至于你的elma .dll引用,如果你没有在代码中直接引用它,你可以将它作为一个项目添加到你的项目中,并将构建操作设置为内容,将复制到输出目录设置为始终。

其他回答

我今天也遇到了类似的问题,这肯定不是你问题的答案。但我想告诉大家,并可能提供一些见解。

我有一个ASP。网络应用程序。构建过程被设置为清理然后构建。

我有两个詹金斯的CI脚本。一个用于制作,一个用于分期。我将应用程序部署到登台,一切工作正常。已部署到生产环境,并且缺少一个引用的DLL文件。这个DLL文件只是在项目的根目录中。不在任何NuGet存储库中。DLL被设置为不复制。

两个部署之间的CI脚本和应用程序是相同的。在暂存环境中的清理和部署之后,DLL文件在ASP. DLL的部署位置被替换。NET应用程序(bin/)。但在生产环境中却不是这样。

结果在一个测试分支中,我在构建过程中添加了一个步骤,将这个DLL文件复制到bin目录。现在我花了一点时间才算出来。CI过程本身没有清洁。DLL被留在工作目录中,并被意外地与ASP打包在一起。. NET .zip文件。生产分支从来没有以同样的方式复制DLL文件,也从来没有意外地部署过它。

TLDR;检查并确保您知道构建服务器正在做什么。

引用构建期间未使用的程序集不是正确的实践。您应该扩展构建文件,以便它复制其他文件。可以使用生成后事件,也可以更新属性组。

一些例子可以在其他帖子中找到

作为项目依赖项的一部分,复制动态生成的文件 如何在项目中包含文件,在构建或发布期间自动将它们复制到构建输出目录

来看看:

这个MSBuild论坛线程是我开始的

你会在那里找到我的临时解决办法!

(MyBaseProject需要一些代码来引用elma .dll中的一些类(无论什么),因为elma .dll被复制到MyWebProject1的bin中!)

使用致命狗的方案,

Y => x => a => b,

我的问题是当我构建Y时,X中的程序集(A和B,所有15个)没有显示在Y的bin文件夹中。

我从Y中删除引用X,保存,构建,然后重新添加X引用(一个项目引用),保存,构建,然后a和B开始出现在Y的bin文件夹中。

在Website项目中包含项目引用中所有引用的DLL文件并不总是一个好主意,特别是当你使用依赖项注入时:你的web项目只是想添加一个对接口DLL文件/项目的引用,而不是任何具体的实现DLL文件。

因为如果您直接向实现DLL文件/项目添加引用,您不能阻止开发人员在实现DLL文件/项目的具体类上调用“new”,而不是通过接口。你也已经在你的网站上声明了一个“硬代码”来使用这个实现。