public CatalogCache(Type stubType, ICachedComposablePartCatalogSite cachedCatalogSite)
            {
                Assumes.NotNull(stubType);

                cachedCatalogSite       = cachedCatalogSite ?? new EmptyCachedComposablePartCatalogSite();
                this._stubType          = stubType;
                this._cachedCatalogSite = cachedCatalogSite;

                // Get catalog index
                MethodInfo getIndexMethod = ComposablePartCatalogAssemblyCacheReader.GetCacheTypeMethod(this._stubType, CacheStructureConstants.CachingStubGetCatalogIndexMethodName, BindingFlags.Public | BindingFlags.Static);
                Func <IDictionary <string, IEnumerable <IntPtr> > > getIndex = (Func <IDictionary <string, IEnumerable <IntPtr> > >)Delegate.CreateDelegate(typeof(Func <IDictionary <string, IEnumerable <IntPtr> > >), getIndexMethod);

                this._catalogIndex = getIndex.Invoke();

                // Get part factory
                MethodInfo getPartFactoryMethod = ComposablePartCatalogAssemblyCacheReader.GetCacheTypeMethod(this._stubType, CacheStructureConstants.CachingStubGetPartFactoryMethodName, BindingFlags.Static | BindingFlags.Public);

                this._getPartFactory = (Func <IntPtr, ComposablePartDefinition>)Delegate.CreateDelegate(typeof(Func <IntPtr, ComposablePartDefinition>), getPartFactoryMethod);

                // get fields
                FieldInfo importDefinitionFactoryField = ComposablePartCatalogAssemblyCacheReader.GetCacheTypeField(this._stubType, CacheStructureConstants.CachingStubImportDefinitionFactoryFieldName, BindingFlags.Public | BindingFlags.Static);
                FieldInfo exportDefinitionFactoryField = ComposablePartCatalogAssemblyCacheReader.GetCacheTypeField(this._stubType, CacheStructureConstants.CachingStubExportDefinitionFactoryFieldName, BindingFlags.Public | BindingFlags.Static);
                FieldInfo partDefinitionFactoryField   = ComposablePartCatalogAssemblyCacheReader.GetCacheTypeField(this._stubType, CacheStructureConstants.CachingStubPartDefinitionFactoryFieldName, BindingFlags.Public | BindingFlags.Static);

                // initialize the cache fields with the factory methods
                importDefinitionFactoryField.SetValue(null, new Func <ComposablePartDefinition, IDictionary <string, object>, ImportDefinition>(this._cachedCatalogSite.CreateImportDefinitionFromCache));
                exportDefinitionFactoryField.SetValue(null, new Func <ComposablePartDefinition, IDictionary <string, object>, ExportDefinition>(this._cachedCatalogSite.CreateExportDefinitionFromCache));
                partDefinitionFactoryField.SetValue(null, new Func <IDictionary <string, object>, Func <ComposablePartDefinition, IEnumerable <ImportDefinition> >, Func <ComposablePartDefinition, IEnumerable <ExportDefinition> >, ComposablePartDefinition>(this.InternalCreatePartDefinitionFromCache));
            }
        public ComposablePartCatalogAssemblyCacheReader(Assembly cacheAssembly)
        {
            Requires.NotNull(cacheAssembly, "cacheAssembly");
            this._cacheAssembly = cacheAssembly;

            // read the entry point
            Type       entryPointType    = ComposablePartCatalogAssemblyCacheReader.GetCacheType(this._cacheAssembly, CacheStructureConstants.EntryPointTypeName);
            MethodInfo getRootStubMethod = ComposablePartCatalogAssemblyCacheReader.GetCacheTypeMethod(entryPointType, CacheStructureConstants.EntryPointGetRootStubMethodName, BindingFlags.Static | BindingFlags.Public);

            Func <string> getRootStub = (Func <string>)Delegate.CreateDelegate(typeof(Func <string>), getRootStubMethod);

            this._rootStubSuffix = getRootStub.Invoke();
        }
        public ComposablePartCatalogAssemblyCache(Type stubType, ComposablePartCatalogCacheReader reader)
        {
            Assumes.NotNull(stubType);
            Assumes.NotNull(reader);

            this._stubType = stubType;
            this._reader   = reader;

            // Get catalog metadata
            MethodInfo getCatalogMetadataMethod = ComposablePartCatalogAssemblyCacheReader.GetCacheTypeMethod(this._stubType, CacheStructureConstants.CachingStubGetCatalogMetadata, BindingFlags.Public | BindingFlags.Static);
            Func <IDictionary <string, object> > getCatalogMetadata = (Func <IDictionary <string, object> >)Delegate.CreateDelegate(typeof(Func <IDictionary <string, object> >), getCatalogMetadataMethod);

            this._metadata = getCatalogMetadata.Invoke();
        }