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; }