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

目录内容是这样的:

c:\a\b\c\src\Solution.sln
c:\a\x\y\z\MyDLL\MyDLL.csproj


MyDLL.csproj没有<OutputPath>标记。但是,它确实有一个标签,我很少看到。

如“属性”视图中所示,计算出的输出路径恰好是:

..\..\..\..\b\c\src-z\MyDLL\objd\i386


这对应于以下路径:

c:\a\b\c\src-z\src\MyDLL\objd\i386


这很奇怪,因为我对src-z的配置一无所知。 Visual Studio是否使用连字符计算路径?

我想解决此问题,可能会更改,但是我不想破坏其他解决方案。

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

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'.


那么,当找不到项目标记时,Visual Studio使用什么算法来计算输出路径?

最佳答案

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

关于它的评论为:


  OutDir:
  
  指示项目或解决方案的最终输出位置。构建解决方案时,可以使用OutDir在一个位置收集多个项目输出。此外,OutDir包含在AssemblySearchPaths中,用于解析引用。
  
  输出路径:
  
  此属性通常在项目文件中指定,并用于初始化OutDir。由于遗留原因,OutDir和OutputPath有所区别,应尽可能使用OutDir。


因此,虽然经常引用OutputPath,但实际上OutDir才是最重要的。如果没有设置平台或配置,则OutputPath设置为bin\Debug\

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

查看Microsoft.CSharp.targetsMicrosoft.CSharp.CurrentVersion.targetsMicrosoft.Common.TargetsMicrosoft.Common.CurrentVersion.targets,其他任何地方都没有设置OutDirOutputPath。因此,假定“开箱即用”的C#项目,它基本上等于OutDirOutputPathbin\Debug

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

对于BaseIntermediateOutputPath,该信息位于同一文件中:


  BaseIntermediateOutputPath:
  
  这是顶层文件夹,将在其中创建所有配置特定的中间输出文件夹。默认值为obj \
  
  IntermediateOutputPath:
  
  这是完整的中间输出路径,如果未指定,则从BaseIntermediateOutputPath派生(例如obj \ debug)。如果此属性被覆盖,则设置BaseIntermediateOutputPath无效。


查看逻辑,如果未设置,则默认为obj\(注意,相对路径,因此工作目录将再次起作用)。

10-07 21:01