silverlight 4, xap Module dynamisch laden

Ich weiß, dass es möglich ist, XAP-Module mithilfe von Prism oder MEF-Framework dynamisch zu laden. Ich möchte diese Frameworks jedoch nicht verwenden. Laden Sie stattdessen meine XAP-Dateien manuell. Also habe ich die folgende Klasse erstellt (angepasst aus dem Internet):

public class XapLoader
{
    public event XapLoadedEventHandler Completed;

    private string _xapName;

    public XapLoader(string xapName)
    {
        if (string.IsNullOrWhiteSpace(xapName))
            throw new ArgumentException("Invalid module name!");
        else
            _xapName = xapName;
    }

    public void Begin()
    {
        Uri uri = new Uri(_xapName, UriKind.Relative);
        if (uri != null)
        {
            WebClient wc = new WebClient();
            wc.OpenReadCompleted += onXapLoadingResponse;
            wc.OpenReadAsync(uri);
        }
    }

    private void onXapLoadingResponse(object sender, OpenReadCompletedEventArgs e)
    {
        if ((e.Error == null) && (e.Cancelled == false))
            initXap(e.Result);

        if (Completed != null)
        {
            XapLoadedEventArgs args = new XapLoadedEventArgs();
            args.Error = e.Error;
            args.Cancelled = e.Cancelled;
            Completed(this, args);
        }
    }

    private void initXap(Stream stream)
    {
        string appManifest = new StreamReader(Application.GetResourceStream(
        new StreamResourceInfo(stream, null), new Uri("AppManifest.xaml",
                                       UriKind.Relative)).Stream).ReadToEnd();

        XElement deploy = XDocument.Parse(appManifest).Root;

        List<XElement> parts = (from assemblyParts in deploy.Elements().Elements()
                                select assemblyParts).ToList();

        foreach (XElement xe in parts)
        {
            string source = xe.Attribute("Source").Value;
            AssemblyPart asmPart = new AssemblyPart();
            StreamResourceInfo streamInfo = Application.GetResourceStream(
                 new StreamResourceInfo(stream, "application/binary"), 
                 new Uri(source, UriKind.Relative));
            asmPart.Load(streamInfo.Stream);
        }
    }
}

public delegate void XapLoadedEventHandler(object sender, XapLoadedEventArgs e);

public class XapLoadedEventArgs : EventArgs
{
    public Exception Error { get; set; }

    public bool Cancelled { get; set; }
}

Der obige Code funktioniert einwandfrei; Ich kann jedes xap folgendermaßen laden:

XapLoader xapLoader = new XapLoader("Sales.xap");
xapLoader.Completed += new XapLoadedEventHandler(xapLoader_Completed);
xapLoader.Begin();

Nun habe ich ein UserControl namens InvoiceView im Sales.xap-Projekt, daher möchte ich die Klasse instanziieren. Im aktuellen Projekt (Main.xap) habe ich einen Verweis auf das Sales.xap-Projekt hinzugefügt, da ich es jedoch manuell geladen habe, habe ich "Copy Local = False" gesetzt. Bei der Ausführung löst der folgende Code jedoch eine TypeLoadException aus:

Sales.InvoiceView view = new Sales.InvoiceView();

Anscheinend kann der Code die InvoiceView-Klasse nicht finden. Ich habe jedoch überprüft, ob die initXap () -Methode von XapLoader erfolgreich ausgeführt wurde. Warum kann der Code die InvoiceView-Klasse nicht finden? Kann mir jemand bei diesem Problem helfen?

Antworten auf die Frage(8)

Ihre Antwort auf die Frage