msbuild包中未包含C#孙子项目DLL
我有一个C#project X,它引用了一个C#project Y,它引用了一个C#project Z。因此,依赖关系链如下所示:X=>Y=>Z。当我使用msbuild命令为发布构建包时,没有直接/显式的依赖关系X=>Zmsbuild包中未包含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
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应该走相反的方向,独立地构建每个包。这是解决这个问题的一个办法。