这段代码产生了FileNotFoundException,但最终运行没有问题:
void ReadXml() { XmlSerializer serializer = new XmlSerializer(typeof(MyClass)); //... }
这是例外:
mscorlib.dll中发生类型为’System.IO.FileNotFoundException’的第一次机会异常
附加信息:无法加载文件或程序集’MyAssembly.XmlSerializers,版本= 1.4.3190.15950,区域性=中性,PublicKeyToken =空’或其依赖项之一。该系统找不到指定的文件。
似乎该框架会自动生成序列化程序集(如果找不到)。 我可以使用sgen.exe手动生成它,从而减轻了异常。
如何使Visual Studio自动生成XML序列化程序集?
更新:生成序列化程序集:打开设置似乎没有执行任何操作。
这是通过修改.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>
这对我行得通。