我有一个 XSD 文件(一个 DTD),我在其上运行 XSD 工具来生成一个 C# 文件。我在以下两个地方修改了我的 csproj 的 msbuild 文件:
为项目组添加了一个特殊类型:
<ItemGroup>
<SchemaFiles Include="Data\DeepZoomSchema.xsd">
</SchemaFiles>
</ItemGroup>
然后在文件的底部:
<Target Name="BeforeBuild" Inputs="@(SchemaFiles)" Outputs="@(SchemaFiles->'$(IntermediateOutputPath)%(Filename).cs')">
<XSD Language="CS" GenerateFromSchema="classes" SuppressStartupBanner="false" Namespace="DZParallelLib.Data" Sources="@(SchemaFiles)" AdditionalOptions="/out:$(IntermediateOutputPath)" />
<ItemGroup>
<Compile Include="@(SchemaFiles->'$(IntermediateOutputPath)%(Filename).cs')">
</Compile>
</ItemGroup>
</Target>
首先,这个项目现在编译得很好。所以我想我已经完成了困难的部分。但是,从不解析 DeepZoomSchema.cs 输出文件的意义上说,智能感知被破坏了。
在我的理想世界中,从 VS2012 IDE 中,我希望找到并解析 .cs 文件。我找到了一种方法来做到这一点,如下所示:
<ItemGroup>
<SchemaFiles Include="Data\DeepZoomSchema.xsd">
</SchemaFiles>
</ItemGroup>
<ItemGroup>
<Compile Include="@(SchemaFiles->'$(IntermediateOutputPath)%(Filename).cs')">
<Visible>False</Visible>
</Compile>
</ItemGroup>
然后构建步骤变得更加简单:
<UsingTask TaskName="XSD" AssemblyName="Microsoft.Build.CppTasks.Common, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<Target Name="BeforeBuild" Inputs="@(SchemaFiles)" Outputs="@(SchemaFiles->'$(IntermediateOutputPath)%(Filename).cs')">
<XSD Language="CS" GenerateFromSchema="classes" SuppressStartupBanner="false" Namespace="DZParallelLib.Data" Sources="@(SchemaFiles)" AdditionalOptions="/out:$(IntermediateOutputPath)" />
</Target>
现在 IDE 可以正确解析事情(并且解决方案仍在构建),但感觉不对。当我过去编写 MS 构建规则时(我承认,我没有做过很多),我总是将中间输出文件放在构建规则中(就像我之前所做的那样)。另外,感觉我应该在这里使用“DependentUpon”标签,并使它们可见,只是默认情况下在 IDE 中不显示(有点像代码隐藏文件??)。基本上,第一个解决方案感觉它是“正确”的方式,但 IDE 不喜欢它。
所以,我的问题是:有没有比我描述的第二种解决方案更好的方法来完成我想做的事情?