3 using System.Runtime.Versioning;
4 using SiliconStudio.AssemblyProcessor.Serializers;
5 #if SILICONSTUDIO_PLATFORM_WINDOWS_DESKTOP
7 using System.CodeDom.Compiler;
8 using System.Collections.Generic;
14 namespace SiliconStudio.AssemblyProcessor
16 internal partial class ComplexSerializerCodeGenerator
18 private string targetFramework;
20 private AssemblyDefinition assembly;
21 private string assemblySerializerFactoryClassName;
22 private List<TypeReference> referencedAssemblySerializerFactoryTypes =
new List<TypeReference>();
24 private List<ICecilSerializerDependency> serializerDependencies =
new List<ICecilSerializerDependency>();
25 private List<ICecilSerializerFactory> serializerFactories =
new List<ICecilSerializerFactory>();
26 private CecilSerializerContext cecilSerializerContext;
30 public List<ICecilSerializerDependency> SerializerDependencies
32 get {
return serializerDependencies; }
35 public List<ICecilSerializerFactory> SerializerFactories
37 get {
return serializerFactories; }
40 public ComplexSerializerCodeGenerator(IAssemblyResolver assemblyResolver, AssemblyDefinition assembly)
42 this.assembly = assembly;
43 this.assemblySerializerFactoryClassName = assembly.Name.Name.Replace(
" ", string.Empty).
Replace(
".",
string.Empty) +
"SerializerFactory";
46 foreach (var referencedAssemblyName
in assembly.MainModule.AssemblyReferences)
48 var referencedAssembly = assembly.MainModule.AssemblyResolver.Resolve(referencedAssemblyName);
50 var assemblySerializerFactoryType = GetSerializerFactoryType(referencedAssembly);
51 if (assemblySerializerFactoryType != null)
52 referencedAssemblySerializerFactoryTypes.Add(assemblySerializerFactoryType);
56 var targetFrameworkAttribute = assembly.CustomAttributes
57 .FirstOrDefault(x => x.AttributeType.FullName == typeof(TargetFrameworkAttribute).FullName);
58 if (targetFrameworkAttribute != null)
60 targetFramework =
"\"" + (string)targetFrameworkAttribute.ConstructorArguments[0].Value +
"\"";
61 var frameworkDisplayNameField = targetFrameworkAttribute.Properties.FirstOrDefault(x => x.Name ==
"FrameworkDisplayName");
62 if (frameworkDisplayNameField.Name != null)
64 targetFramework +=
", FrameworkDisplayName=\"" + (string)frameworkDisplayNameField.Argument.Value +
"\"";
69 cecilSerializerContext =
new CecilSerializerContext(assembly);
70 var processors =
new List<ICecilSerializerProcessor>();
82 processors.Add(
new ProfileSerializerProcessor());
85 foreach (var processor
in processors)
86 processor.ProcessSerializers(cecilSerializerContext);
89 internal static TypeDefinition GetSerializerFactoryType(AssemblyDefinition referencedAssembly)
91 var assemblySerializerFactoryAttribute =
92 referencedAssembly.CustomAttributes.FirstOrDefault(
94 x.AttributeType.FullName ==
95 "SiliconStudio.Core.Serialization.Serializers.AssemblySerializerFactoryAttribute");
98 if (assemblySerializerFactoryAttribute == null)
101 var typeReference = (TypeReference)assemblySerializerFactoryAttribute.Fields.Single(x => x.Name ==
"Type").Argument.Value;
102 if (typeReference == null)
105 return typeReference.Resolve();
Mono.Cecil.TypeAttributes TypeAttributes
Fill CecilSerializerContext.SerializableTypes with serializable types handled by referenced assemblie...