C# 将OutDir与MsBuild一起使用时,解决方案无法生成

C# 将OutDir与MsBuild一起使用时,解决方案无法生成,c#,.net,build,msbuild,C#,.net,Build,Msbuild,我们有几个.Net 4.0解决方案,它们都依赖于由一个特定解决方案(我们的Server.sln)构建的程序集(我想Shared.sln应该是一个更好的名称)。我们的构建过程首先使用将Server.sln构建到Binaries目录,然后将后续解决方案构建到子目录(例如Binaries\Client、Binaries\Web等),再次使用OutDir参数指定到相应子目录的路径。这使我们能够轻松地将单独的应用程序发布到不同的位置。这适用于我们所有的解决方案,但我们创建的新API.sln除外 与其他解决

我们有几个.Net 4.0解决方案,它们都依赖于由一个特定解决方案(我们的Server.sln)构建的程序集(我想Shared.sln应该是一个更好的名称)。我们的构建过程首先使用将Server.sln构建到Binaries目录,然后将后续解决方案构建到子目录(例如Binaries\Client、Binaries\Web等),再次使用OutDir参数指定到相应子目录的路径。这使我们能够轻松地将单独的应用程序发布到不同的位置。这适用于我们所有的解决方案,但我们创建的新API.sln除外

与其他解决方案一样,API.sln引用了Server.sln构建的一些DLL,但我得到的实际编译错误是一个项目(我们称之为Project1)找不到对Project2的引用。Project1和Project2都是API.sln中的项目,Project1通过项目引用引用Project2;不是dll文件引用。此外,Project2也没有任何外部依赖关系;它仅有的引用是System、System.Core和System.Runtime.Serialization

如果我将OutDir设置为Binaries目录,那么一切都会正常工作,但我不想这样做,因为所有的API.sln程序集都会与所有的Server.sln程序集混合,这使得仅部署API.sln程序集变得更加困难。当我将OutDir设置为Binaries\API时,我得到的生成错误是:

The name '[Project2 Class Name]' does not exist in the current context [Path to Project1.csproj]
但是我检查了,Project1.dll和Project2.dll程序集都被创建到Binaries\API目录,所以我不确定为什么会生成此错误。我们的TFS生成服务器存在此问题,但我也可以通过使用相同参数在.sln上调用MsBuild在本地计算机上重新创建它。有什么想法吗

以下是我用于实际执行生成的两个msbuild命令:

构建Server.sln:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe /nologo "C:\PlatformAPIBuild\BuildProcessTests\Sources\RQ4.Server.sln" /nr:False /fl /flp:"logfile=C:\PlatformAPIBuild\BuildProcessTests\Sources\RQ4.Server.log;encoding=Unicode;verbosity=normal" /p:SkipInvalidConfigurations=true /p:ReferencePath=C:\PlatformAPIBuild\BuildProcessTests\Binaries  /p:OutDir="C:\PlatformAPIBuild\BuildProcessTests\Binaries\\" /p:Configuration="Release" /p:Platform="Any CPU" /p:VCBuildOverride="C:\PlatformAPIBuild\BuildProcessTests\Sources\RQ4.Server.sln.Any CPU.Release.vsprops"
然后构建API.sln:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe /nologo "C:\PlatformAPIBuild\BuildProcessTests\Sources\IQ.Platform.PublicAPI.sln" /nr:False /fl /flp:"logfile=C:\PlatformAPIBuild\BuildProcessTests\Sources\IQ.Platform.PublicAPI.log;encoding=Unicode;verbosity=normal" /p:SkipInvalidConfigurations=true /p:ReferencePath=C:\PlatformAPIBuild\BuildProcessTests\Binaries  /p:OutDir="C:\PlatformAPIBuild\BuildProcessTests\Binaries\Platform.PublicAPI\\" /p:Configuration="Release" /p:Platform="Any CPU" /p:VCBuildOverride="C:\PlatformAPIBuild\BuildProcessTests\Sources\IQ.Platform.PublicAPI.sln.Any CPU.Release.vsprops" 
从API.sln构建。您会注意到它有如下错误:

Warning as Error: Reference to type 'IQ.Platform.Framework.WebApi.Model.Hypermedia.AccessControl' claims it is defined in 'c:\PlatformAPIBuild\BuildProcessTests\Binaries\Platform.PublicAPI\IQ.Platform.Framework.WebApi.Model.dll', but it could not be found
但是它说的文件不在那里,当我在构建失败后查找它时,它实际上在那里,你可以看到它在日志文件顶部做的第一件事就是将该程序集复制到该路径,所以我不确定它为什么找不到它。IQ.Platform.Framework.WebApi.Model就是我上面讨论的项目2


从API.sln构建中删除所有测试项目,这样只剩下一个错误,这将使查看日志文件变得更容易。和。

请检查并确保解决方案中项目的编译和生成顺序为Project2->Project1->ProjectAPI?项目生成顺序正确;我在VisualStudio和MsBuild日志文件中都进行了检查。我只是注意到Project2实际上也包含在Server.sln中。因此,在构建Server.sln时,Project2.dll首先构建到Binaries目录,然后在构建API.sln时再次构建到Binaries\API目录。我不确定这是否有什么不同,但我认为这可能值得指出,因为当我告诉API.sln构建到Binaries目录时,它似乎起作用。你能尝试一下,而不是Binaries文件夹吗?你能将它输出到一个完全不同的文件夹中,输出sln,然后输出sln/Project1、输出sln/API等等。。。。看看会发生什么!当我将Server.sln更改为build为Binaries\Server,然后尝试将Client.sln或API.sln编译为Binaries\Client和Binaries\API时,它们都表示找不到某些程序集。看起来Server.sln必须位于基本目录中。现在,请不要考虑其他任何事情。如果我这样做了,我会让你知道的。对不起,我无能为力了。