2010-03-05 58 views
4

如何在c#项目中使用C++ XSD Task?我已经创建任务的的csproj文件是这样的:在c#项目中使用XSD构建任务

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

但构建输出称,虽然智能感知为我提供的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。

*

回答

0

忘记C++位,这是从msdn页面标题分心。该工具被称为XML Schema Definition Tool (Xsd.exe),以及它用于创建模式或代码。

要进一步调试,请将您的msbuild日志记录级别设置为/versbosity:诊断并查看哪些头文件(导入的MSBUILD任务定义正在引入)。

+0

我知道xsd.exe工具,现在我正在使用Exec任务来完成这项工作。只是想知道如果我可以以某种方式使用已经可用的特定任务(并根据msdn是一个包装xsd.exe).... – m0sa 2010-03-07 17:50:56

+0

这就是我说的。R取消诊断并查看哪些任务已加载以及从何处开始。然后,我们可以看到正确的任务是由MSBUILD实际加载还是不加载。 – 2010-03-07 20:17:23

4

这是因为C++目标没有导入。由于XSD不是托管构建过程定义的默认任务之一。你需要添加一个UsingTask来引用它。添加到您的csproj文件:

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

好运, 杰米

+0

您可能还需要将“C:\ Program Files(x86)\ Microsoft SDKs \ Windows \ v7.0A \ Bin \ NETFX 4.0 Tools \”添加到您的PATH中,然后重新启动VS.您的目录可能会有所不同,取决于.Net和您的平台(32/64位)的版本。 – hoserdude 2012-05-11 23:57:32

+0

是的,我必须补充一点 - 虽然测试的简单方法是从命令行启动devenv。太糟糕了,没有添加到工具搜索路径的MSBuild任务! – Gordon 2013-03-21 05:43:41

+0

XSD派生层次结构包括Microsoft.Build.Utilities.ToolTask​​。如果您希望任务在不修改路径的情况下工作,则可以从XSD派生并重写GenerateFullPathToTool()方法。 Microsoft.Build.Utilities.ToolLocationHelper可用于使用GetPathToDotNetFrameworkSdkFile方法查找工具库的安装路径。 – 2014-12-13 17:16:05

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> 

请看问题的Using XSD task I'm getting MSB0001: Internal MSBuild Error: xsd.exe unexpectedly not a rooted path

并添加路径的xsd.exe和Microsoft.Build.CppTasks.Common.dll到环境变量,重新启动我的电脑。它再次正常工作。

XSD.EXE和Microsoft.Build.CppTasks.Common.dll的路径是:

C:\ Program Files文件(x86)的\微软的SDK \的Windows \ v7.0A \ BIN \ NETFX 4.0工具\ ; C:\ Program Files文件(x86)的\的MSBuild \ Microsoft.Cpp \ V4.0

或者你也可以在你的预生成事件中添加以下命令行来实现这一目标:

xsd.exe /classes /language:CS MySchema.xsd 
2

明白了使用稍微不同的语法。这是使用VS 2012更新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> 

我用UsingTask直接AssemblyFile属性在我的情况。还请注意,在XSD名称中嵌入的.字符也转换为_字符。

+0

AssemblyFile =“$(VCTargetsPath)Microsoft.Build.CPPTasks.Common.v110.dll”也应该如此,我猜它会随着VS版本的安装而改变。 – superjos 2015-07-23 16:31:20

3

稍微改进版/方法是使用在一个共同的.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版本:(

的改善。只有一个地方包含正确的DLL路径和名称的逻辑,而不是单个的.csproj文件。