/// <summary> /// Initializes this instance. /// </summary> public static void Initialize() { if (initialized) { return; } lock (InitializationLock) { if (initialized) { return; } // load the code generator before intercepting assembly loading CodeGeneratorManager.Initialize(); // initialize serialization for all assemblies to be loaded. AppDomain.CurrentDomain.AssemblyLoad += OnAssemblyLoad; Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); // initialize serialization for already loaded assemblies. CodeGeneratorManager.GenerateAndCacheCodeForAllAssemblies(); foreach (var assembly in assemblies) { ProcessAssembly(assembly); } initialized = true; } }
public void Start(bool strict = true) { // loading application assemblies now occurs in four phases. // 1. We scan the file system for assemblies meeting pre-determined criteria, specified in SiloAssemblyLoader.LoadApplicationAssemblies (called by the constructor). // 2. We load those assemblies into memory. In the official distribution of Orleans, this is usually 4 assemblies. // Generate code for newly loaded assemblies. CodeGeneratorManager.GenerateAndCacheCodeForAllAssemblies(); // (no more assemblies should be loaded into memory, so now is a good time to log all types registered with the serialization manager) SerializationManager.LogRegisteredTypes(); // 3. We scan types in memory for GrainTypeData objects that describe grain classes and their corresponding grain state classes. InitializeGrainClassData(loader, strict); // 4. We scan types in memory for grain method invoker objects. InitializeInvokerMap(loader, strict); InitializeInterfaceMap(); }