Visual Studio如何在未通知csproj时确定输出路径?

fer*_*olo 1 c# msbuild csproj visual-studio visual-studio-2012

我正在尝试从另一个解决方案引用一个C#DLL项目,但构建是在一个非常奇怪的输出文件夹中生成DLL.

目录内容是这样的:

c:\a\b\c\src\Solution.sln
c:\a\x\y\z\MyDLL\MyDLL.csproj
Run Code Online (Sandbox Code Playgroud)

MyDLL.csproj不具有<OutputPath>标记.但它有一个我经常看不到的<SolutionDir>标签.

计算的输出路径,如Properties视图中所示,恰好是:

..\..\..\..\b\c\src-z\MyDLL\objd\i386
Run Code Online (Sandbox Code Playgroud)

这对应于此路径:

c:\a\b\c\src-z\src\MyDLL\objd\i386
Run Code Online (Sandbox Code Playgroud)

这很奇怪,因为我不知道配置src-z的任何东西.我想知道Visual Studio是否正在计算带连字符的路径?

我想解决这个问题,可能会改变<SolutionDir>,但我不想打破其他解决方案.

计算似乎在构建过程的早期发生,因为构建器记录的第一件事是:

1>Project 'MyDLL (x\y\z\MyDLL\MyDLL.csproj)' is not up to date.
  Input file 'x\y\z\MyDLL\MyDLL.csproj' is modified after output
  file 'c:\a\b\c\src-z\src\MyDLL\objd\i386\MyDLL.pdb'.
Run Code Online (Sandbox Code Playgroud)

那么,当找不到项目<OutputPath>标签时,VS使用什么算法来计算输出路径?

Mic*_*ltu 7

填充OutputPath的代码可以在C:\Program Files (x86)\MSBuild\12.0\Bin\Microsoft.Common.CurrentVersion.targets(默认情况下,如果MSBuild安装目录不同,可能会更改).

关于它的评论如下:

OUTDIR:

指示项目或解决方案的最终输出位置.构建解决方案时,OutDir可用于在一个位置收集多个项目输出.此外,OutDir包含在用于解析引用的AssemblySearchPaths中.

OutputPath:

此属性通常在项目文件中指定,用于初始化OutDir.出于传统原因,OutDir和OutputPath是有区别的,如果可能的话,应该使用OutDir.

因此,虽然OutputPath通常是引用的内容,但OutDir实际上很重要.如果没有设置平台或配置,则OutputPath设置为bin\Debug\

如果我们查看该文件,我们可以看到设置的逻辑OutDir非常简单.如果OutDir未设置则设置为OutputPath.如果GenerateProjectSpecificOutputPath设置了将项目后命名的文件夹附加到路径,则会有一些额外的逻辑.

看着Microsoft.CSharp.targets,Microsoft.CSharp.CurrentVersion.targets,Microsoft.Common.TargetsMicrosoft.Common.CurrentVersion.targets,既不OutDirOutputPath出现在其他地方设置.因此,假设一个"开箱即用" C#项目,它基本上就等于要么OutDir,OutputPathbin\Debug.

相关的最后一点信息是工作目录. OutDir可以是相对路径,在这种情况下,它将位于工作目录中的某个位置.

至于BaseIntermediateOutputPath,信息在同一个文件中:

BaseIntermediateOutputPath:

这是顶级文件夹,其中将创建所有配置特定的中间输出文件夹.对象默认值为obj \

IntermediateOutputPath:

这是完整的中间输出路径,如果没有指定,则从BaseIntermediateOutputPath派生(例如,obj\debug).如果重写此属性,则设置BaseIntermediateOutputPath无效.

看一下逻辑,默认为obj\if if not set(注意,相对路径,因此工作目录再次发挥作用).