Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
msbuild包中未包含C#孙子项目DLL_C#_Dll_Msbuild_Dependencies_Azure Web App Service - Fatal编程技术网

msbuild包中未包含C#孙子项目DLL

msbuild包中未包含C#孙子项目DLL,c#,dll,msbuild,dependencies,azure-web-app-service,C#,Dll,Msbuild,Dependencies,Azure Web App Service,我有一个C#project X,它引用了一个C#project Y,它引用了一个C#project Z。因此,依赖关系链如下所示:X=>Y=>Z。当我使用msbuild命令为发布构建包时,没有直接/显式的依赖关系X=>Z msbuild DesignService.csproj /m /p:Configuration="Debug" /p:Platform="AnyCPU" /verbosity:quiet /t:Package /p:PackageLocation=X.zip /p:Packa

我有一个C#project X,它引用了一个C#project Y,它引用了一个C#project Z。因此,依赖关系链如下所示:X=>Y=>Z。当我使用msbuild命令为发布构建包时,没有直接/显式的依赖关系X=>Z

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中添加显式引用?

为什么会发生这种情况

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

如何修复

遵循这一原则:根本不要使用解决方案文件中表示的依赖项

您可以将项目引用放在项目中。 它看起来是这样的——注意元数据元素,所有这些都在
标记中,当然:

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

假的
<>虽然必须用这样的方式编辑你的项目以使bug消失,但最好是使用项目引用,而将解决方案文件仅仅看作是一个“视图”。p> 最终,您将得到一些项目,如果您愿意,这些项目可以在没有解决方案文件的情况下构建


有关如何解决此问题的更多详细信息,请参阅此部分。

即使msbuild多次提出此问题,也没有直接的方法来解决此问题。就解决方法而言,最常用的方法是使用“Z”项目程序集(在“X”项目中从“Z”项目创建某个类的虚拟实例),或者在“X”项目中向“Z”项目添加直接引用


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

我在本地复制了此文件。我使用Azure API应用程序作为我的.csproj。然后,当我使用msbuild打包时,遇到了与您类似的问题。我可以通过进入visual studio>右键单击项目>属性>打包/发布Web>要部署的项目>更改为“此项目中的所有文件”。@P.Brian.Mackey谢谢,但我已经将其设置为“此项目文件夹中的所有文件”,范围更广。这有帮助吗@P.Brian.Mackey这似乎是相关的,但我不确定我能从中获得哪些可操作的项目,特别是因为它仍然是开放的。有一些变通方法可以帮助你解决这个问题。如果是同一个问题,最好知道bug报告已经存在。在我的问题中,我是
msbuild
ing一个csproj,而不是一个解决方案,那么这是否相关?您能否编辑您的答案,以明确建议编辑的csproj?对吗?你不应该使用sln文件来构建包。这个答案更多地是关于msbuild,而不是包目标。这是不相关的。如果有的话,OP应该走相反的方向,独立地构建每个包。这是解决这个问题的一个办法。