public IAsyncResult BeginLoad(Uri targetUri, Uri currentUri, AsyncCallback userCallback, object asyncState)
        {
            _defaultLoaderMode = false;
            ExtensionAsyncResult ear = new ExtensionAsyncResult(asyncState);

            int indexOfComponent = targetUri.OriginalString.IndexOf(";component/");

            if (indexOfComponent == -1)
            {
                _defaultLoaderMode = true;
                return(_defaultContentLoader.BeginLoad(targetUri, currentUri, userCallback, asyncState));
            }

            var assemblyName = targetUri.OriginalString.Substring(1, indexOfComponent - 1);

            if (!ExtensionManager.Current.Assemblies.ContainsKey(assemblyName))
            {
                foreach (var link in ExtensionManager.Current.ExtensionLinks)
                {
                    if (link.Package.Equals(assemblyName))
                    {
                        Action actionWhenExtensionLoaded =
                            () =>
                        {
                            CreatePageInstance(targetUri, indexOfComponent, assemblyName, userCallback, ear);
                        };
                        ExtensionManager.Current.CheckExtension(link, actionWhenExtensionLoaded);
                        break;
                    }
                }
            }
            else
            {
                CreatePageInstance(targetUri, indexOfComponent, assemblyName, userCallback, ear);
            }
            return(ear);
        }
        private void CreatePageInstance(Uri targetUri, int indexOfComponent, string assemblyName, AsyncCallback userCallback, ExtensionAsyncResult ear)
        {
            int           i2       = indexOfComponent + 11;
            int           i3       = targetUri.OriginalString.IndexOf(".xaml");
            StringBuilder sb       = new StringBuilder(assemblyName);
            var           assembly = ExtensionManager.Current.Assemblies[sb.ToString()];

            sb.Append('.');
            sb.Append(targetUri.OriginalString.Substring(i2, i3 - i2));
            sb.Replace('/', '.');
            sb.Append(", ");
            sb.Append(assembly.FullName);
            Type type = Type.GetType(sb.ToString(), true);

            ear.Result = Activator.CreateInstance(type);
            userCallback(ear);
            // ear.IsCompleted = true;
        }