首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >生成Xml序列化程序集作为构建的一部分

生成Xml序列化程序集作为构建的一部分
EN

Stack Overflow用户
提问于 2008-09-25 16:06:17
回答 8查看 64.9K关注 0票数 67

此代码会生成一个FileNotFoundException,但最终运行时没有任何问题:

代码语言:javascript
复制
void ReadXml()
{
    XmlSerializer serializer = new XmlSerializer(typeof(MyClass));
    //...
}

以下是例外情况:

mscorlib.dll中出现类型为“System.IO.FileNotFoundException”的第一次机会异常

其他信息:未能加载文件或程序集“MyAssembly.XmlSerializers,Version=1.4.3190.15950,Culture=neutral,PublicKeyToken=null”或其依赖项之一。系统找不到指定的文件。

如果找不到序列化程序集,框架似乎会自动生成它。我可以使用sgen.exe手动生成序列化程序集,这减轻了异常。

如何让visual studio自动生成XML序列化程序集?

更新: Generate Serialization Assembly: On设置似乎不执行任何操作。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2008-10-15 14:45:19

这就是我如何通过修改.CSPROJ文件中的MSBUILD脚本来做到这一点:

首先,将.CSPROJ文件作为文件而不是项目打开。滚动到文件的底部,直到您找到以下注释掉的代码,就在Project标签结束之前:

代码语言:javascript
复制
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->

现在我们只需插入我们自己的AfterBuild目标来删除任何现有的XmlSerializer并对我们自己的进行SGen,如下所示:

代码语言:javascript
复制
<Target Name="AfterBuild" DependsOnTargets="AssignTargetPaths;Compile;ResolveKeySource" Inputs="$(MSBuildAllProjects);@(IntermediateAssembly)" Outputs="$(OutputPath)$(_SGenDllName)">
   <!-- Delete the file because I can't figure out how to force the SGen task. -->
   <Delete
     Files="$(TargetDir)$(TargetName).XmlSerializers.dll"
     ContinueOnError="true" />
   <SGen
     BuildAssemblyName="$(TargetFileName)"
     BuildAssemblyPath="$(OutputPath)"
     References="@(ReferencePath)"
     ShouldGenerateSerializer="true"
     UseProxyTypes="false"
     KeyContainer="$(KeyContainerName)"
     KeyFile="$(KeyOriginatorFile)"
     DelaySign="$(DelaySign)"
     ToolPath="$(TargetFrameworkSDKToolsDirectory)"
     Platform="$(Platform)">
      <Output
       TaskParameter="SerializationAssembly"
       ItemName="SerializationAssembly" />
   </SGen>
</Target>

这对我很有效。

票数 57
EN

Stack Overflow用户

发布于 2012-01-10 11:43:52

正如Martin在his answer中所解释的那样,通过项目属性打开序列化程序集的生成是不够的,因为SGen任务会将/proxytypes开关添加到sgen.exe命令行中。

微软有一个documented MSBuild property,它允许您禁用/proxytypes开关并使SGen任务生成序列化程序集,即使程序集中没有代理类型也是如此。

SGenUseProxyTypes

一个布尔值,指示代理类型是否应由SGen.exe生成。SGen目标使用此属性来设置UseProxyTypes标志。此属性默认为true,并且没有可更改此属性的UI。若要为非webservice类型生成序列化程序集,请将此属性添加到项目文件中,并在导入Microsoft.Common.Targets或C#/ To之前将其设置为false

正如文档所建议的,您必须手动修改项目文件,但您可以将SGenUseProxyTypes属性添加到配置中以启用生成。您的项目文件配置最终将如下所示:

代码语言:javascript
复制
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
    <!-- Snip... -->
    <GenerateSerializationAssemblies>On</GenerateSerializationAssemblies>
    <SGenUseProxyTypes>false</SGenUseProxyTypes>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
    <!-- Snip... -->
    <GenerateSerializationAssemblies>On</GenerateSerializationAssemblies>
    <SGenUseProxyTypes>false</SGenUseProxyTypes>
  </PropertyGroup>
票数 73
EN

Stack Overflow用户

发布于 2008-11-05 06:20:57

这个问题的其他答案已经提到了project Properties->Build->Generate Serialization Assemblies设置,但是默认情况下,只有当项目中有"XML Web service proxy types“时,才会生成程序集。

理解Visual Studio确切行为的最好方法是检查C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727**Microsoft.Common.targets**文件中的GenerateSerializationAssemblies目标。

您可以从Visual Studio output 窗口检查此构建任务的结果,并从Show output from:下拉框中选择 build 。您应该会看到类似以下内容:

C:\Program Files\Microsoft Visual Studio /assembly:D:\Temp\LibraryA\obj\Debug\LibraryA.dll /proxytypes /reference:../编译器:/delaysign- LibraryA -> D:\Temp\LibraryA\bin\Debug\LibraryA.dll

这里的关键点是/代理类型开关。您可以阅读有关XML Serializer Generator Tool (Sgen.exe)的各种开关的信息

如果您熟悉MSBuild,您可以自定义GenerateSerializationAssemblies目标,使SGen任务具有UseProxyTypes="false“而不是true属性,但随后您需要承担自定义Visual Studio / MSBuild系统的所有相关责任。或者,您可以扩展构建过程,在不使用/proxytypes开关的情况下手动调用SGen。

如果你阅读了SGen的文档,他们很清楚微软想要限制这个工具的使用。考虑到关于这个话题的大量噪音,很明显,微软在记录Visual Studio体验方面做得不是很好。甚至有一个关于这个问题的Connect Feedback项目,反应不是很好。

票数 29
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/134224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档