我需要提前为我的某些类生成XML序列化程序,以避免在应用程序运行时构建它们。
我设法(最终)让sgen作为后期构建操作运行。它似乎正在生成预期的DLL。
然而它没被使用。我已将诊断配置为将文件保留在磁盘上,我可以看到它们仍在生成。
这是一个中等复杂度的现有类(ClassA)。所以我创建了一个简单的类(ClassB)并测试了它的工作正常。我所谓的简单类有一个对另一个类的引用,以及其中另一个类的列表。
奇怪的是,如果我尝试编译ClassA& ClassB既不起作用 - 只有当它的ClassB单独运行ClassB时,ClassA才能工作。
我认为有一些关于ClassA的东西不能提前序列化,但如果是这样的话,我怎么知道问题是什么?它没有抛出任何错误,它正在生成一个DLL。
这是我的构建配置。
<ItemGroup>
<SgenTypes Include="GK.Data.XmlSerialTest" /> <!-- ClassB - works but only by itself -->
<!--<SgenTypes Include="GK.Data.CalendarInfo" />--><!-- ClassA (desired class) Uncomment to test -->
</ItemGroup>
<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)" Types="@(SgenTypes)" 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>