一尘不染

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

c#

这段代码产生了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序列化程序集?


更新:生成序列化程序集:打开设置似乎没有执行任何操作。


阅读 480

收藏
2020-05-19

共1个答案

一尘不染

这是通过修改.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>

这对我行得通。

2020-05-19