public DynamicAssembly Build(string instrumentedAssemblySavePath)
        {
            resolvePass  = new List <Block>();
            metadataPass = new List <Block>();
            ilPass       = new List <Block>();

            string dir = null, file = null;

            if (instrumentedAssemblySavePath != null)
            {
                dir  = Path.GetDirectoryName(instrumentedAssemblySavePath);
                file = Path.GetFileName(instrumentedAssemblySavePath);
            }

            BuildAssembly(AppDomain.CurrentDomain, dir, file);

            // Do processing that depends on all types being declared.
            foreach (Block block in resolvePass)
            {
                block();
            }

            // Do processing that depends on all types being structurally complete
            // but possibly missing some metadata.
            foreach (Block block in metadataPass)
            {
                block();
            }

            // Do processing to initialize method IL.
            foreach (Block block in ilPass)
            {
                block();
            }

            // Create types.
            dynamicAssembly.CreateAllTypes();

            return(dynamicAssembly);
        }