5

私は、コード生成を使用して、テキストベースの説明からコマンド ライン ツールを使用して C# クラスを生成するプロジェクトに取り組んでいます。これらの記述を JavaScript にも使用する予定です。

現在、これらのクラスは生成されてからチェックインされますが、変更が両方のビルドに反映されるように、コードを自動的に生成できるようにしたいと考えています。

手動で実行されるステップは次のとおりです。

servicegen.exe -i:MyService.txt -o:MyService.cs

ビルドするときは、MSBuild/VS で最初に CS ファイルを生成してからコンパイルする必要があります。csprojを変更することにより、おそらく MSBuild タスクを使用してExecDependentUpon& AutoGen?を使用してこれを行うことができます。

4

2 に答える 2

6

通常、ビルド前のコマンドをビルド前のイベントに配置することをお勧めしますが、コマンド ライン ツールはコンパイルに必要な C# クラスを作成するため、これは.csproj ファイルの BeforeBuild ターゲットで行う必要があります。これは、MSBuild が、プロセス全体で BeforeBuild が呼び出されてから PreBuildEvent が呼び出されるまでの間に、コンパイルする必要があるファイルを探すためです (このフローは、MSBuild で使用される Microsoft.Common.targets ファイルで確認できます)。 .

ファイルを生成するには、BeforeBuild ターゲット内から Exec タスクを呼び出します。

<Target Name="BeforeBuild">
  <Exec Command="servicegen.exe -i:MyService.txt -o:MyService.cs" />
</Target>

Exec タスクにさまざまなオプションを指定する方法の詳細については、Exec タスクの MSDN ドキュメントを参照してください。

于 2013-03-28T17:09:40.303 に答える
3

Antlr には、生成されたコードをプロジェクトに追加するために使用できるプロセスの例があります。これには、ソース ファイルの下にネストされて生成されたファイルを表示できるという利点がありますが、追加するのはより複雑です。

生成元のファイルを含む項目グループを追加する必要があります。次に例を示します。

<ItemGroup>
  <ServiceDescription Include="MyService.txt"/>
</ItemGroup>

次に、生成される cs ファイルを、残りのソース コードを含む ItemGroup に追加します。

<ItemGroup>
  ...
  <Compile Include="Program.cs" />
  <Compile Include="Properties\AssemblyInfo.cs" />
  ...etc..
  <Compile Include="MyService.txt.cs">
    <AutoGen>True</AutoGen>
    <DesignTime>True</DesignTime>
    <DependentUpon>MyService.txt</DependentUpon>  <!--note: this should be the file name of the source file, not the path-->      
  </Compile>
</ItemGroup>      

そして最後にビルド ターゲットを追加してコード生成を実行します (% を使用して、ItemGroup 内の各項目に対してコマンドを実行します)。これは別のファイルに入れることができるので、多くのプロジェクトから含めることができます。

<Target Name="GenerateService">
  <Exec Command="servicegen.exe -i:%(ServiceDescription.Identity) -o:%(ServiceDescription.Identity).cs" />
</Target>
<PropertyGroup>
  <BuildDependsOn>GenerateService;$(BuildDependsOn)</BuildDependsOn>
</PropertyGroup>
于 2013-04-01T22:49:00.893 に答える