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

时间:2018-03-28 19:59:39

标签: c# dll msbuild dependencies azure-web-sites

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

AuthUserSession

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

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

2 个答案:

答案 0 :(得分:1)

为什么会发生这种情况

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

如何修复

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

您可以在项目中添加项目引用。  它看起来像这样 - 注意元数据元素,当然这一切都在std::function标签内:

<ItemGroup>

虽然以这种方式编辑项目以使错误消失是令人厌烦的,但最好使用项目引用并将解决方案文件视为“视图”。

如果您需要,可以在没有解决方案文件的情况下构建项目。

有关如何解决问题的详细信息,请参阅此blog

答案 1 :(得分:1)

即使使用msbuild多次提出此问题,也没有直接的方法来执行此操作。就变通办法而言,最受欢迎的变通办法是利用'Z'项目程序集(在'X'项目中的'Z'项目中创建某个类的虚拟实例)或在程序集中添加直接引用。从“ X”项目到“ Z”项目。

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