2009-07-29 3 views
0

Erstens, ich weiß, Silverlight-Projekt kann nicht auf nicht-Silverlight-basierte Projekt wie Windows-Klassenbibliothek oder Asp.net MVC-Projekt verweisen. Aber ich muss meine Projekte erstellen, die beide Silverlight-basierte Projekt & Asp.net MVC-Projekt unterstützen können.Ist es möglich, Silverlight 3-Klassenbibliothek von .NET 3.5-basierten Projekt in VS.net 2008 verweisen?

Also, ich erstellte Silverlight-basierte Projekt für meine Freigabe Quellcode. Es funktioniert gut auf VS.net 2008 &. NET 3.5 SP1. Allerdings habe ich einen Fehler gefunden, wenn ich versuche, eine Methode des Silverlight-basierten Projekts von .Net-basierten Projekten wie dem folgenden Code zu verwenden.

Silver-basierte Methode

public static void InitializeInstance(object obj) 
{ 
    // Initialize Field Value 
    foreach (FieldInfo fi in obj.GetType().GetFields()) 
    { 
     foreach (Attribute attr in fi.GetCustomAttributes(true)) 
     { 
      if (attr is DefaultValueAttribute) 
      { 
       DefaultValueAttribute dv = (DefaultValueAttribute)attr; 
       fi.SetValue(obj, dv.Value); 
      } 
     } 
    } 

    // Initialize Property Value 
    foreach (PropertyInfo pi in obj.GetType().GetProperties()) 
    { 
     foreach (Attribute attr in pi.GetCustomAttributes(true)) 
     { 
      if (attr is DefaultValueAttribute) 
      { 
       DefaultValueAttribute dv = (DefaultValueAttribute)attr; 

       if (pi.CanWrite) 
       { 
        pi.SetValue(obj, dv.Value, null); 
       } 
      } 
     } 
    } 
} 

.NET-basierte Methode

private void Form1_Load(object sender, EventArgs e) 
{ 
    InitializeInstance(this); 
} 

Fehlerdetails

System.IO.FileNotFoundException : Konnte Datei oder Assembly nicht laden 'System, Version = 2.0.5.0, Kultur = neutral, PublicKeyToken = 7cec85d7bea7798e' oder eine seiner Abhängigkeiten. Das System kann die angegebene Datei nicht finden. Datei Name: 'System, Version = 2.0.5.0, Culture = neutral, PublicKeyToken = 7cec85d7bea7798e' bei InitializeInstance (Object obj)

Schließlich habe ich versuchen, dieses Problem zu lösen, indem das Kopieren system.dll von Silverlight, um das Verzeichnis auszugeben und darauf zu verweisen. Es zeigt immer noch den gleichen Fehler. Also, ich denke, dass dieser Fehler eine Beschränkung beider .Net & Silverlight-Plattform sein kann. Haben Sie eine Idee, dieses Problem zu vermeiden?

PS. Ich weiß, dass ich this technique für einige Freigabecodes verwenden kann. Aber das ist unmöglich für meine Projekte. Weil es sehr kompliziert ist, & sehr komplex mehr als direkt Silverlight-basierte oder .Net-basierte Klassenbibliothek zu erstellen.

Danke,

+0

Ich versuche, dieses Probelm zu lösen, indem alle Klassen zu entfernen, die in System.dll enthalten ist. Es funktioniert gut. Aber ich verstehe es nicht. Warum verursacht eine Klasse (die in System.Core.dll enthalten ist) keinen Fehler wie System.dll? –

+0

Ich empfehle auf jeden Fall die Verwendung der Datei-Links, auch wenn Sie es nicht möchten. Welche Art von Code oder komplexe Objekte möchten Sie mithilfe der Dateiverknüpfungsmethode einfügen, die für Sie nicht funktioniert? –

Antwort

1

Das Problem hier ist, dass diese Arten eine Baugruppe mit einem anderen starken Namen teilen: System.Windows in Silverlight, PresentationFramework oder PresentationCore auf dem Desktop CLR.

So zur Laufzeit kann der beabsichtigte Typ nicht geladen werden, und es gibt keine Art Weiterleitungen für die Silverlight-to-Desktop-Typen.

Meine empfohlene Lösung Betrachten Datei-Links verwenden, anstatt wirklich die gleiche aufgebauten binären zu verweisen versucht.

Auf diese Weise können Sie eine Quellstruktur für Ihr Projekt haben, die wie folgt aussehen:

MyApp\ 
    Silverlight\ 
    Page.xaml 
    Page.xaml.cs 
    (link) ..\AspMvc\MySharedDataFile.cs 
    AspMvc\ 
    MySharedDataFile.cs 
    MyApp.cs 

Auf diese Weise wird die Quelle mit den beiden Projekten neu kompiliert werden.Wir verwenden diese auf dem Silverlight-Toolkit viele Kontrollen zu bauen, einschließlich des Charting und Visualisierung von Daten steuern, sowohl für WPF und Silverlight. Dies geschieht durch Neuaufbau für jede Plattform, anstatt auf die Binärdateien von beiden zu verweisen.

Um einen Link in Visual Studio einsetzen, nur die rechte Maustaste auf Ihrem Projekt oder einen seines Ordners, Vorhandenes Element hinzufügen, dann im Explorer Dialog geöffnete Datei finden. Anstatt nur auf die Schaltfläche zu klicken, klicken Sie auf die Dropdown-Schaltfläche mit dem kleinen Abwärtspfeil auf der Schaltfläche Datei hinzufügen und wählen Sie die Option "Als Verknüpfung hinzufügen".

Dann baut sie einfach die Datei von einem anderen Ort, aber es ist keine Kopie, so dass Sie es an einem Ort und den Einsatz in beide halten können.

Eine verrückte Lösung Sie .NET Reflexion von Ihrem Desktop-Anwendung, die tatsächlich eine neue App-Domain zu erstellen, ist von einem viel höheren Vertrauen verwenden können, Haken an der Montage Auflösung Ereignis auf, und sehen, was das tut. Sie können den Typ möglicherweise stattdessen von der Desktop-CLR zurückgeben oder diese Warnungen einfach ignorieren.

Keine Ahnung, ob es funktioniert.

+0

Ich weiß. Ich kann dir Dateien zum Erstellen von Quellcode verlinken. Wie verwendet man Typ & Methode in der System-Assemblierung eines .Net-Frameworks, das nicht im Silverlight-Framework ist? –

Verwandte Themen