Mono: .NET für alle Plattformen

1 Was ist .NET?

2 Bestandteile

3 Was sind Web-Services?

4 Umgebung für Web-Services

5 Beispiel Kranfernsteuerung

6 Quellen


1 Was ist .NET?

Implementierungen/Entwicklungsumgebungen für .NET:

2 Bestandteile

weiteres Zubehör:

3 Was sind Web-Services?

Bild 3-1: Komponenten von Web-Services

Bild 3-2: Web-Services-Protokollstack

Was wollen wir hier nicht unter "Web-Services" einordnen?

4 Umgebung für Web-Services

Bild 4-3

Beispiele für Web-Anwendungen und Web-Services:

$ mono /usr/bin/xsp.exe --port 8888 --nonstop &

Web-Service-Implementierung:

PrimService.asmx: 

<%@ WebService Language="c#" Codebehind="PrimService.asmx.cs" Class="WebServiceTests.PrimService" %>

using System;
using System.Web.Services;
using System.Web.Services.Protocols;

namespace WebServiceTests
{
  public class PrimService {
    [WebMethod]
    public int Prim (int imax) {
      int i,k,lastprime;
      int []iarray;
      iarray = new int[imax];
      for(i=0;i<imax;i++){
        iarray[i] = 1;
      }
      for(k=2;k<imax;k++) {
        if (iarray[k] == 0) continue;
        for (i=2*k;i<imax;i=i+k) iarray[i] = 0;
      }
      lastprime = 0;
      for(i=0;i<imax;i+=1){
        if (iarray[i] != 0) lastprime = i;
      }
      return lastprime;
    }
  }
}

Servicebeschreibung und Klienten-Stub:
Web-Service-Klient:

PrimServiceClient.cs: 

using System;
public class Primtest {
   public static void Main(string [] args) {
      int imax = int.Parse(args[0]);
      PrimService s = new PrimService ();
      int p = s.Prim(imax);
      Console.WriteLine(p);
   }
}

$ mcs PrimServiceStub.cs -r:System.Web.Services -target:library -out:PrimServiceStub.dll

mcs PrimServiceClient.cs -r PrimServiceStub

$ mono PrimServiceClient.exe 1000000

Beispiel mit Array-Parametern:

SumDiffService.asmx: 

<%@ WebService 
    Language="c#" 
    Codebehind="SumDiffService.asmx.cs" 
    Class="WebServiceTests.SumDiffService" 
%>

using System;
using System.Web.Services;
using System.Web.Services.Protocols;

namespace WebServiceTests
{
	public class SumDiffService : System.Web.Services.WebService
	{
		[WebMethod]
		public int [] AddSub (int a, int b)
		{
                        int []r = new int[2];
                        r[0] = a + b; r[1] =  a - b;
			return r;
		}
	}
}

Servicebeschreibung und Klienten-Stub:
Web-Service-Klient:

SumDiffServiceClient.cs: 

public class Test1
{
   public static void Main()
   {
      int []r = new int[2];
      SumDiffService s = new SumDiffService ();
      r = s.AddSub(7,5);
      System.Console.WriteLine(r[0]);
      System.Console.WriteLine(r[1]);
   }
}

$ mcs SumDiffService.cs -r:System.Web.Services -target:library -out:SumDiffService.dll 

$ mcs SumDiffServiceClient.cs -r:SumDiffService.dll

$ mono SumDiffServiceClient.exe


5 Beispiel Kranfernsteuerung

Das Thema

Das Archiv [hanoi_csharp-0.0.2.tgz] enthält die C# - Quelltexte für eine besondere Form des "Turm-von-Hanoi"-Spiels: Mit Hilfe von OpenGL-Sharp wird ein 3D-Modell eines Krans erzeugt:

Bild 5-4

Voraussetzungen

All das ist derzeit (1.12.2004) auf den URZ-ge-"manag"-ten Fedora-Core-1-Computern vorhanden.

Wichtig!

Leider stürzt das Programm auf ebenjenen URZ-ge-"manag"-ten Fedora-Core-1-Computern beim Schließen(!?) der Anwendung ab und "reißt" das gesamte X11 (graphischer Bildschirm) mit, sodass eine Neuanmeldung notwendig ist :-(

Die genaue Ursache ist unklar. Klar ist nur, dass der Absturz nach der Beendigung des Programms in der Funktion "nanosleep()" aus der Programmbibliothek "libpthread.so" erfolgt. Es hängt vermutlich mit:

  • dem Nvidia-3D-Beschleuniger,
  • und/oder einem speziell ge-"patch"-ten Kern,
  • und/oder Fehlern in der OpenGL-Sharp-Implementierung,
  • und/oder Fehlern in der C#-Thread-Implementierung

zusammen. Wer Genaueres herausfindet, sende bitte eine E-mail an

ja@informatik.tu-chemnitz.de

Übersetzung

Bei Standardinstallation:

	tar -xvzf hanoi_csharp-0.0.2.tgz 
	cd hanoi_csharp-0.0.2 
	./configure
	make

Hinweis 1: Es sind beim "make" zunächst 2 Fehler

 make[1]: *** Keine Regel vorhanden, um das Target »HanoiService.wsdl«,

zu beobachten. Das ist kein Grund zur Beunruhigung. Das wird später korrigiert.

Hinweis 2: Sollte sich ./configure mit einem Fehler

configure: error: cannot find sources in . or ...

beenden, so hat das möglicherweise mit einem AFS-Problem zu tun. Hier hilft es im Allgemeinen, die Gruppenleserechte zu vergeben:

$ chmod g+r *

Hinweis 3: Beim "./configure" keine relativen Pfade angeben!

Varianten:

  1. Wenn "mono" weder unter "/usr/lib/mono" noch unter "/usr/local/lib/mono" installiert ist:

        ./configure --with-mono-dir=<DIR>
        <DIR>  - Mono-Verzeichnis (das Verzeichnis, in dem 1.0/System.Web.Services.dll zu finden ist)
    

  2. Wenn gtk-sharp nicht direkt unterhalb von 1. installiert ist:

        ./configure --gtk-sharp-dir=<DIR>
        <DIR> - Gtk-Sharp-Verzeichnis (das Verzeichnis, in dem gtk-sharp/gdk-sharp.dll zu finden ist)
    

  3. Wenn csdGL.dll nicht unterhalb von 1./csDragons installiert ist:

        ./configure --with-opengl-sharp-dir=<DIR>
        <DIR>  - OpenGL-Sharp-Verzeichnis (das Verzeichnis, in dem csdGL.dll zu finden ist)
    

Benutzung des ge-'link'-ten Programms

Zunächst lässt sich nur die ge-"link"-te Variante zum Test benutzen:

   cd bin
   mono hanoi_dialog.exe

Am daraufhin erscheinenden Prompt (">>>") muss man zunächst "Init" eingeben. Daraufhin erscheint der virtuelle Kran.

Mit Hilfe des Kommandos "E" kann man den Magneten ein- und mit "A" wieder ausschalten.

Durch das Kommando "T <stapel>" kann man den Kran zu einem der 3 <stapel> 1, 2 oder 3 bewegen. Der Rückgabewert ist entweder "OK", "Schon da" oder "Wrong".

"Wrong" erscheint insbesondere dann, wenn man versucht, eine größere Scheibe auf eine kleinere Scheibe zu legen.

Durch "X <winkel>" kann man einen Kamerawinkel bezüglich der X-Achse und durch "Y <winkel>" bezüglich der Y-Achse einstellen.

Wichtig!

Je nach verwendeter Gtk-Installation kann es sein, dass die Internationalisierung sehr ernst genommen werden muss. Es kann sein, dass Fließkommawerte mit Komma eingegeben werden müssen : z. B. 12,56 statt wie vielleicht erwartet 12.56.

Mit "D <abst>" kann man den Kamera-Abstand einstellen.

Mit "V" wird ein Schnappschuss im File "alpha.png" erzeugt.

Mit "quit" wird das Programm wieder beendet (evtl. Segmentation fault).

Ziel

Das Ziel ist es, alle fünf Scheiben vom Stapel 1 auf den Stapel 3 zu transportieren.

Starten als WebService

  cd hanoi
  mono /usr/bin/xsp.exe  (evtl. mono /usr/lib/xsp.exe)
  			 (evtl. mono /usr/local/lib/xsp.exe)
  			 (evtl. mono /usr/local/bin/xsp.exe)

In beliebigem Browser

  http://localhost:8080/Hanoi.asmx

laden. Hier eventuell die Funktionen testen.

Dann Link nach "Service Description" verfolgen. Dort "Download" wählen und das Ergebnis als

  Client/HanoiService.wsdl

speichern.

Dann:

	cd Client
	make

Das sollte diesmal funktionieren!

Dann den Klienten starten:

    mono HanoiClient.exe

Die Benutzung ist zu der des ge-"link"-ten Programms identisch.

Starten als Gtk-Client

  cd hanoi
  mono /usr/bin/xsp.exe  (evtl. mono /usr/lib/xsp.exe)
  			 (evtl. mono /usr/local/lib/xsp.exe)
  			 (evtl. mono /usr/local/bin/xsp.exe)

In beliebigem Browser

  http://localhost:8080/Hanoi.asmx

laden. Hier eventuell die Funktionen testen.

Dann Link nach "Service Description" verfolgen. Dort "Download" wählen und das Ergebnis als

  GtkClient/HanoiService.wsdl

speichern.

Dann:

	cd GtkClient
	make

Dann den Klienten starten:

    mono GtkHanoiClient.exe

Die Bedienung sollte selbsterklärend sein.


6 Quellen


© Jörg Anders, Uwe Hübner, 17.12.2004