msbuild 包中不包含 C# 孙项目 DLL

Posted

技术标签:

【中文标题】msbuild 包中不包含 C# 孙项目 DLL【英文标题】:C# grandchild project DLLs not included in msbuild package 【发布时间】:2018-09-07 15:35:34 【问题描述】:

我有一个 C# 项目 X,它引用了一个 C# 项目 Y,它引用了一个 C# 项目 Z。所以依​​赖链看起来像这样:X => Y => Z。没有直接/显式依赖 X => Z。当我使用 msbuild 命令构建要发布的包时

msbuild DesignService.csproj /m /p:Configuration="Debug" /p:Platform="AnyCPU" /verbosity:quiet /t:Package /p:PackageLocation=X.zip /p:PackageAsSingleFile=True

我得到一个 zip 文件,其中包含 X 和 Y 的 DLL,但没有 Z。然后当包发布(到 Azure 应用服务)时,当调用 Z 中的代码时,我得到运行时错误,说 DLL找不到。如果我在 X 中添加 Z 作为直接/显式引用,它就可以正常工作。但我认为我不应该这样做。

如何在我的发布包中从 msbuild 获取 Z 的 DLL,而不在 X 中添加显式引用?

【问题讨论】:

我在本地复制了这个。我使用 Azure API 应用程序作为我的 .csproj。然后我在使用 msbuild 打包时遇到了和你类似的问题。我可以通过转到 Visual Studio > 右键单击​​项目 > 属性 > 打包/发布 Web > 要部署的项目 > 更改为“此项目中的所有文件”来解决这个问题。 @P.Brian.Mackey 谢谢,但我已经将它设置为“此项目文件夹中的所有文件”,范围更广。 这有帮助吗? github.com/Azure/service-fabric-issues/issues/257 @P.Brian.Mackey 这似乎是相关的,但我不确定我可以从中获取哪些可操作的项目,尤其是因为它仍然处于打开状态。 有一些解决方法可以帮助您解决问题。如果是同一个问题,很高兴知道错误报告已经存在。 【参考方案1】:

为什么会发生这种情况

X.csproj 被调用,因为它有一个对 Y.csproj 的项目引用,所以它调用了 Y.csproj——它“绕到后面”。 Z.csproj 尚未构建,因此构建中断。

如何解决

遵循这个原则:根本不要使用解决方案文件中表达的依赖关系。

您可以在项目中添加项目引用。 它看起来像这样——注意元数据元素,当然所有这些都在<ItemGroup> 标签内:

<ProjectReference Include=”… foo.csproj”> 
    <ReferenceOutputAssembly>false</ReferenceOutputAssembly> 
</ProjectReference>

尽管必须以这种方式编辑项目以消除错误很烦人,但最好使用项目引用来代替,并将解决方案文件视为一个“视图”。

您最终会得到可以在没有解决方案文件的情况下构建的项目。

有关如何解决问题的更多详细信息,您可以参考blog。

【讨论】:

在我的问题中,我是 msbuilding 一个 csproj,而不是解决方案,所以这是否相关?您可以编辑您的答案以明确建议的编辑进入哪个 csproj 吗? X.csproj 对吗? 您不应该使用 sln 文件来构建包。这个答案更多地是关于带有构建目标而不是包目标的 msbuild。这不相关。如果有的话,OP应该走相反的方向并独立构建每个包。这是解决问题的方法。【参考方案2】:

没有直接的方法可以做到这一点,即使这个问题已经在 msbuild 中多次提出。就变通方法而言,最流行的是利用“Z”项目程序集(在“X”项目中从“Z”项目创建某个类的虚拟实例)或在“X”项目到“Z”项目。

blog 解释了我认为最干净的解决方法。从本质上讲,它涉及创建一个单独的.targets 文件,该文件只不过是 msbuild 的说明,以确保在构建和打包 DLL 时,它还包括所有传递依赖项。然后需要将此 .targets 文件添加到您的 X.csproj 文件中,以便在使用 msbuild 构建它时,调用此目标文件。

【讨论】:

以上是关于msbuild 包中不包含 C# 孙项目 DLL的主要内容,如果未能解决你的问题,请参考以下文章

MsBuild 找不到发布配置文件

Xamarin 形式;条件编译符号在 MSBUILD 命令行中不起作用

将我自己的 C# 项目配置添加到 MSBuild / Visual Studio

调试位于 nuget 包中的 C# 接口实现

在 x86 中编译引用 C++/CLI DLL 的 C# 项目时,MSBuild 无法构建

如何将 msbuild 升级到 C# 6?