我正在尝试从另一个解决方案引用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.targets
,Microsoft.CSharp.CurrentVersion.targets
,Microsoft.Common.Targets
和Microsoft.Common.CurrentVersion.targets
,其他任何地方都没有设置OutDir
和OutputPath
。因此,假定“开箱即用”的C#项目,它基本上等于OutDir
,OutputPath
或bin\Debug
。
相关的最后信息是工作目录。 OutDir
可以是相对路径,在这种情况下,它将位于工作目录中的某个位置。
对于BaseIntermediateOutputPath
,该信息位于同一文件中:
BaseIntermediateOutputPath:
这是顶层文件夹,将在其中创建所有配置特定的中间输出文件夹。默认值为obj \
IntermediateOutputPath:
这是完整的中间输出路径,如果未指定,则从BaseIntermediateOutputPath派生(例如obj \ debug)。如果此属性被覆盖,则设置BaseIntermediateOutputPath无效。
查看逻辑,如果未设置,则默认为obj\
(注意,相对路径,因此工作目录将再次起作用)。