2010-03-05 32 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文件。

相關問題