6

ac# プロジェクトでc++ XSD タスクを使用するにはどうすればよいですか? 次のように、csproj ファイルにタスクを作成済みです。

  <Target Name="BeforeBuild">
    <XSD Namespace="$(RootNamespace).Xml" Language="CS" GenerateFromSchema="classes" Sources="Xml/schema.xsd" />
  </Target>

しかし、プロジェクト ファイルの編集中に IntelliSense が XSD タスクを提供してくれますが、ビルド出力には次のように表示されます。

Error   1   The "XSD" task was not found. Check the following: 
1.) The name of the task in the project file is the same as the name of the task class. 
2.) The task class is "public" and implements the Microsoft.Build.Framework.ITask interface. 3.) The task is correctly declared with <UsingTask> in the project file, or in the *.tasks files located in the "C:\Windows\Microsoft.NET\Framework\v4.0.30128" directory. MyProject.csproj

ああ、私は Visual Studio 2010 RC を使用しています。

*

4

5 に答える 5

4

これは、C++ターゲットがインポートされないためです。XSDは、マネージビルドプロセスによって定義されるデフォルトのタスクの1つではないためです。それを参照するには、UsingTaskを追加する必要があります。これをcsprojファイルに追加します。

<UsingTask TaskName="XSD" AssemblyName="Microsoft.Build.CppTasks.Common, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>

幸運、ジェイミー

于 2010-04-29T16:27:03.910 に答える
4

わずかに改善されたバージョン/アプローチは、共通の .targets ファイルで次を使用することです。

<!-- Establish the proper $(CPPTasks) location -->
<Choose>
  <When Condition=" '_$(VisualStudioVersion)'=='_11.0' " >
    <PropertyGroup>
        <CPPTasks>V110\Microsoft.Build.CPPTasks.Common.v110.dll</CPPTasks>
    </PropertyGroup>
  </When>
  <Otherwise>
    <PropertyGroup>
        <CPPTasks>Microsoft.Build.CPPTasks.Common.dll</CPPTasks>
    </PropertyGroup>
  </Otherwise>
</Choose>

次に、.csproj で次の操作を実行できます。

<UsingTask TaskName="XSD" AssemblyFile="$(VCTargetsPath)$(CPPTasks)" />

これは VS2010、VS2011、VS2013 でテストされていることに注意してください (DLL 名は、インストールされている VS のバージョンに応じて前後に切り替わります。:(

改善点は、個々の .csproj ファイルではなく、適切な DLL パスと名前のロジックが 1 つの場所にのみ含まれていることです。

于 2015-07-24T14:16:54.350 に答える
2

少し異なる構文で動作するようになりました。これは VS 2012 Update 4 を使用しています。

何がうまくいったか:

<UsingTask TaskName="XSD" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft.Cpp\v4.0\V110\Microsoft.Build.CPPTasks.Common.v110.dll" />
<Target Name="BeforeBuild">
    <Message Text="Generating serialization class(es)..." />
    <ItemGroup>
        <_SerializationFile Include="$(ProjectDir)My_Xsd_File.cs" />
    </ItemGroup>
    <XSD Condition="!Exists('@(_SerializationFile)')" GenerateFromSchema="classes" Language="CS" Namespace="$(RootNamespace)" Sources="My.Xsd.File.xsd" />
</Target>

私の場合、直接AssemblyFile属性を使用しUsingTaskました。.また、XSD 名に埋め込まれた文字も文字に変換されることに注意してください_

于 2014-12-18T22:57:44.287 に答える
1

これをプロジェクト ファイルに追加します。

<UsingTask TaskName="XSD" AssemblyName="Microsoft.Build.CppTasks.Common, Version=4.0.0.0,         Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
 <Target Name="BeforeBuild">
  <XSD Sources="MySchema.xsd" GenerateFromSchema="classes" Language="CS">
  </XSD>
 </Target>

MSB0001 を取得している XSD タスクを使用した質問を見てください: 内部 MSBuild エラー: xsd.exe が予期せずルート化されたパスではありません

xsd.exe と Microsoft.Build.CppTasks.Common.dll のパスを環境変数に追加し、コンピューターを再起動します。それは再び正常に動作します。

xsd.exe と Microsoft.Build.CppTasks.Common.dll のパスは次のとおりです。

C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\; C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0

または、ビルド前イベントに次のコマンド ラインを追加して、これを実現することもできます。

xsd.exe /classes /language:CS MySchema.xsd
于 2014-11-03T04:34:39.583 に答える