Laden...

Class über Remoting

Erstellt von thomas.at vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.048 Views
T
thomas.at Themenstarter:in
111 Beiträge seit 2005
vor 16 Jahren
Class über Remoting

Hallo

ich schreibe gerade eine Remoting-Anwendung. Bisher klappt alles recht gut. Nun stehe ich aber vor dem Problem, eine Klasse via Remoting zu übertragen. Hier die relevanten Teile (leicht gekürzt)

 

// Klasse, die übertragen werden soll
namespace Projektdaten
{
  [Serializable]
  public class Projektdaten
  {
    /// <summary>
    /// Projekt
    /// </summary>
    public string Titel
    {
      get { return _Titel; }
      set { _Titel = value; }
    }
    private string _Titel = String.Empty;
	}
}

// Server
using Projektdaten;

namespace RemotingObjects.Planung
{
  public class Planung : MarshalByRefObject
  {
    public Projektdaten Get_Projektdaten(string Projekt)
    {
      Projektdaten daten = new Projektdaten();
      daten.Titel = "Titel des Projekts";
      return (daten);
    }
	}
}

// Client
using Projektdaten;

namespace Planung.Stunden
{
  public partial class Stunden : Form
  {
    private void Set_Projektdaten(string Projekt)
    {
      Projektdaten dat = new Projektdaten();
      dat.Angebot = "Test";					// Das geht
      dat = _Excel.Get_Projektdaten1(Projekt);		 // hier Exception
    }
	}
}


Die Klasse "Projektdaten" ist natürlich am Server und am Client als Referenz (mit Copy local = true" mit eingebunden. Trotzdem bekomme ich immer folgende Fehlermeldung:

System.Runtime.Serialization.SerializationException was unhandled
Message="Die Assembly Projektdaten, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null kann nicht gefunden werden."
Source="mscorlib"......

Kann mir vielleicht jemand sagen, wo der Fehler liegt oder wo ich suchen muss? Ich habe schon diesen Beitrag - Remoting werte zurücklesen - gefunden, sehe aber keinen unterschied zu meinem Beispiel.

mfG Thomas

3.728 Beiträge seit 2005
vor 16 Jahren
Schnittstellen

Dieser Fehler tritt auf, wenn der Client eine andere Version der Assembly hat als der Server.

Hast Du die Klasse Projektdaten in einer separaten Assembly untergebracht? Datenübertragungsklassen sollten immer in separaten Assemblies liegen. Außerdem solltest Du Deine Geschäftslogikklasse Planung vom Client aus über eine Schnittstelle ansprechen, statt über die Implementierung. Diese Schnittstelle legst Du am besten mit der Datenübertragungsklasse in eine Contract-Assembly. Der Client benötigt dann nur diese Contract-Assembly und nicht mehr die Implementierung. Aufgerufen wird das Ganze dann z.B. über


IProjectPlanningService proxy=(IProjectPlanningService)Activator.GetObject(typeof(IProjectPlanningService),"tcp://server:9999/ProjectPlanningService");

P.S.: Generell ist es schlecht eine Klasse genauso wie einen Namensraum zu nennen. Mal ehrlich, Projectdaten.Projektdaten klingt doch irgendwie doppelt gemoppelt. ProjectManagement.Project würde sich da doch besser anhören, oder?

T
thomas.at Themenstarter:in
111 Beiträge seit 2005
vor 16 Jahren

Hallo Rainbird

danke, das war es. Ich hatte die Klasse in einer anderen Assembly mit untergebracht, nach dem trennen lief es einwandfrei. Das mit dem Interface werde ich auch mal umstellen.

mfG
Thomas