此代码会生成一个FileNotFoundException,但最终运行时没有任何问题:
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设置似乎不执行任何操作。
发布于 2008-10-15 14:45:19
这就是我如何通过修改.CSPROJ文件中的MSBUILD脚本来做到这一点:
首先,将.CSPROJ文件作为文件而不是项目打开。滚动到文件的底部,直到您找到以下注释掉的代码,就在Project标签结束之前:
<!-- 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,如下所示:
<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>
这对我很有效。
发布于 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
属性添加到配置中以启用生成。您的项目文件配置最终将如下所示:
<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>
发布于 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项目,反应不是很好。
https://stackoverflow.com/questions/134224
复制相似问题