3

コマンドラインから SLN をビルドしたい。私が試してみました

D:\>msbuild MySolution.sln

C問題は、x86 を対象とするプロジェクトのビルドに失敗することですが、プロジェクトAとプロジェクトBは正しくビルドされます。エラーが発生します:

プロジェクト "D:.....\MySolution.sln" (1) は、ノード 0 (デフォルト ターゲット) で "D:.....\MySolution\ToolC\C.csproj" (4) をビルドしています。
C:\WINDOWS\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets(539,9): エラー: このプロジェクトの OutputPath プロパティが設定されていません。有効な構成/プラットフォームの組み合わせを指定したことを確認してください。Configuration='Debug' Platform='AnyCPU'
Done Building Project "D:.....\MySolution\ToolC\C.csproj" (デフォルト ターゲット) -- 失敗。

C「任意の CPU」をターゲットとして ビルドするのはなぜですか?


詳細
3 つの C# プロジェクト (たとえば、A、B、C) を含む 1 つの SLN ファイルがあります。

プロジェクトは、デフォルトで「任意の CPU」を対象としていますABプロジェクトCは「x86」を対象としています

SLN ファイルの内容は次のとおりです (Globalセクションのみ)。

Global
    GlobalSection(SolutionConfigurationPlatforms) = preSolution
        Debug|Any CPU = Debug|Any CPU
        Debug|x86 = Debug|x86
        Release|Any CPU = Release|Any CPU
        Release|x86 = Release|x86
    EndGlobalSection
    GlobalSection(ProjectConfigurationPlatforms) = postSolution
        {AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
        {AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA}.Debug|Any CPU.Build.0 = Debug|Any CPU
        {AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA}.Debug|x86.ActiveCfg = Debug|Any CPU
        {AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA}.Release|Any CPU.ActiveCfg = Release|Any CPU
        {AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA}.Release|Any CPU.Build.0 = Release|Any CPU
        {AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA}.Release|x86.ActiveCfg = Release|Any CPU
        {BBBBBBBB-BBBB-BBBB-BBBB-BBBBBBBBBBBB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
        {BBBBBBBB-BBBB-BBBB-BBBB-BBBBBBBBBBBB}.Debug|Any CPU.Build.0 = Debug|Any CPU
        {BBBBBBBB-BBBB-BBBB-BBBB-BBBBBBBBBBBB}.Debug|x86.ActiveCfg = Debug|Any CPU
        {BBBBBBBB-BBBB-BBBB-BBBB-BBBBBBBBBBBB}.Release|Any CPU.ActiveCfg = Release|Any CPU
        {BBBBBBBB-BBBB-BBBB-BBBB-BBBBBBBBBBBB}.Release|Any CPU.Build.0 = Release|Any CPU
        {BBBBBBBB-BBBB-BBBB-BBBB-BBBBBBBBBBBB}.Release|x86.ActiveCfg = Release|Any CPU
        {CCCCCCCC-CCCC-CCCC-CCCC-CCCCCCCCCCCC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
        {CCCCCCCC-CCCC-CCCC-CCCC-CCCCCCCCCCCC}.Debug|Any CPU.Build.0 = Debug|Any CPU
        {CCCCCCCC-CCCC-CCCC-CCCC-CCCCCCCCCCCC}.Debug|x86.ActiveCfg = Debug|x86
        {CCCCCCCC-CCCC-CCCC-CCCC-CCCCCCCCCCCC}.Debug|x86.Build.0 = Debug|x86
        {CCCCCCCC-CCCC-CCCC-CCCC-CCCCCCCCCCCC}.Release|Any CPU.ActiveCfg = Release|Any CPU
        {CCCCCCCC-CCCC-CCCC-CCCC-CCCCCCCCCCCC}.Release|Any CPU.Build.0 = Release|Any CPU
        {CCCCCCCC-CCCC-CCCC-CCCC-CCCCCCCCCCCC}.Release|x86.ActiveCfg = Release|x86
        {CCCCCCCC-CCCC-CCCC-CCCC-CCCCCCCCCCCC}.Release|x86.Build.0 = Release|x86
    EndGlobalSection
    GlobalSection(SolutionProperties) = preSolution
        HideSolutionNode = FALSE
    EndGlobalSection
EndGlobal

プロジェクトの CSPROJ ファイルの内容は次のとおりですC

  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    ....
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
    <OutputPath>bin\x86\Debug\</OutputPath>
    <PlatformTarget>x86</PlatformTarget>
    ....
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
    <OutputPath>bin\x86\Release\</OutputPath>
    <PlatformTarget>x86</PlatformTarget>
    ....
  </PropertyGroup>

私もこれを試しましたが、問題は同じままです:

<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
4

1 に答える 1

1

C プロジェクトのデフォルト設定はanycpu|debugですが、表示内容またはデフォルト値にその設定のプロパティ グループ セクションがないため、Outputpathプロパティは存在しません。これを修正して、いくつかのデフォルトを追加するか、新しいプロパティ グループを追加します。次に、 VSの[ビルド] -> [構成マネージャー]で適切な構成がセットアップされていることを確認します。

sln のどの構成でビルドしたい実際のターゲットを知るのは難しいですが、この sln は標準の csprojs (コンソール) で機能します。

Global
    GlobalSection(SolutionConfigurationPlatforms) = preSolution
        Debug|Any CPU = Debug|Any CPU
        Debug|x86 = Debug|x86
        Release|Any CPU = Release|Any CPU
        Release|x86 = Release|x86
    EndGlobalSection
    GlobalSection(ProjectConfigurationPlatforms) = postSolution
        {AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
        {AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA}.Debug|Any CPU.Build.0 = Debug|Any CPU
        {AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA}.Debug|x86.ActiveCfg = Debug|x86
        {AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA}.Debug|x86.Build.0 = Debug|x86
        {AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA}.Release|Any CPU.ActiveCfg = Release|x86
        {AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA}.Release|x86.ActiveCfg = Release|x86
        {BBBBBBBB-BBBB-BBBB-BBBB-BBBBBBBBBBBB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
        {BBBBBBBB-BBBB-BBBB-BBBB-BBBBBBBBBBBB}.Debug|Any CPU.Build.0 = Debug|Any CPU
        {BBBBBBBB-BBBB-BBBB-BBBB-BBBBBBBBBBBB}.Debug|x86.ActiveCfg = Debug|x86
        {BBBBBBBB-BBBB-BBBB-BBBB-BBBBBBBBBBBB}.Debug|x86.Build.0 = Debug|x86
        {BBBBBBBB-BBBB-BBBB-BBBB-BBBBBBBBBBBB}.Release|Any CPU.ActiveCfg = Release|x86
        {BBBBBBBB-BBBB-BBBB-BBBB-BBBBBBBBBBBB}.Release|x86.ActiveCfg = Release|x86
        {CCCCCCCC-CCCC-CCCC-CCCC-CCCCCCCCCCCC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
        {CCCCCCCC-CCCC-CCCC-CCCC-CCCCCCCCCCCC}.Debug|Any CPU.Build.0 = Debug|Any CPU
        {CCCCCCCC-CCCC-CCCC-CCCC-CCCCCCCCCCCC}.Debug|x86.ActiveCfg = Debug|x86
        {CCCCCCCC-CCCC-CCCC-CCCC-CCCCCCCCCCCC}.Debug|x86.Build.0 = Debug|x86
        {CCCCCCCC-CCCC-CCCC-CCCC-CCCCCCCCCCCC}.Release|Any CPU.ActiveCfg = Release|x86
        {CCCCCCCC-CCCC-CCCC-CCCC-CCCCCCCCCCCC}.Release|x86.ActiveCfg = Release|x86
    EndGlobalSection
    GlobalSection(SolutionProperties) = preSolution
        HideSolutionNode = FALSE
    EndGlobalSection
EndGlobal

「Any CPU」のターゲットを構成マネージャーを介してcsprojに追加する必要がありました。それが役立つ場合は、それらを提供できます。これは、次のいずれかを使用して正常にビルドされます。

msbuild Your.sln /t:Rebuild /p:Platform="Any CPU"

また

msbuild ConsoleApplication1.sln /t:Rebuild /p:Platform=x86

両方のプラットフォームを構築したい場合は、次のように csproj にターゲットを追加できます。

<Target Name="AllPlatforms" Outputs="$(TargetPath)">
    <ItemGroup>
      <AllPlatforms Include="AnyCPU,x86"/>
    </ItemGroup>

    <Message Text="Building All platform %(AllPlatforms.Identity)"/>
    <MSBuild Projects="$(MSBuildProjectFullPath)" Properties="Platform=%(AllPlatforms.Identity)"/>

  </Target>

ただし、sln ではなく cspoj で msbuild を呼び出す必要があると思われます。したがって、外部スクリプトを使用して 2 回呼び出すこともできます。それはすべて少しハッキーです。さらに、出力を取得するには、各プラットフォームの出力パスを変更する必要があります。

于 2013-08-12T13:08:19.307 に答える