在我的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 2010编译时,DLL文件包含在bin文件夹中。但是当使用MSBuild编译时,第三方DLL文件不包括在内。

非常令人沮丧。我解决这个问题的方法是在我的web项目中包含NuGet引用,即使我没有直接使用它。

其他回答

正如Alex Burtsev在评论中提到的,任何只在XAML资源字典中使用的东西,或者在我的例子中,任何只在XAML中使用而不在后面的代码中使用的东西,都不会被MSBuild视为“在使用中”。

因此,只需在后面的一些代码中对程序集中的类/组件新建一个虚拟引用,就足以使MSBuild相信该程序集中确实在使用。

我有同样的问题,dll是一个动态加载的引用。 为了解决这个问题,我在dll的命名空间中添加了一个“using”。 现在dll被复制到输出文件夹中。

我认为@deadlydog的答案在当前的Nuget系统中是无效的。我在visual studio 2022中重新创建了Y => X => A => B的场景,我所要做的就是在终端中运行命令

msbuild -t:clean,rebuild,pack

将目标框架从. net framework 4客户端配置文件更改为. net framework 4为我解决了这个问题。

所以在你的例子中:将MyWebProject1上的目标框架设置为.NET framework 4

我也有同样的问题。

检查项目的框架版本是否与您引用的dll的框架版本相同。

在我的例子中,我的客户端是使用“Framework 4客户端”编译的,DLL在“Framework 4”中。