Muster einer C#-Schnittstelle

C# ist eine speziell für das WINDOWS NET Framework optimierte Programmiersprache

 

 

/************************************************************************/

/*                     Muster einer  C# -Schnittstelle                  */

/*     zu einigen Funktionen der 32 Bit Dynamic Link Library GeoDLL     */

/*      Sie muss bei Bedarf um andere Funktionen erweitert werden.      */

/* Die Schnittstelle kann direkt in den C# -Quellcode eingebaut werden  */

/*                oder als Header-Datei abgelegt werden                 */

/*                                                                      */

/*                  Autor: Killet GeoSoftware Ing.-GbR                  */

/*             und Dr. M. Reichert, ARCADIS Consult Freiberg            */

/*                                                                      */

/*   Im Aufrufverzeichnis von GeoDLL müssen die Dateien geodll32.dll    */

/*                    und geodllbn.bin vorhanden sein.                  */

/*                                                                      */

/* Es sind zahlreiche Änderungen durchgeführt worden. Leider hatten wir */

/* nicht die Möglichkeit zu kompilieren. Bei eventuell noch enthaltenen */

/*              Syntaxfehlern bittet der Autor um Mitteilung!           */

/************************************************************************/

 

 

#########################################################################

###########  Klasse class_kootrans zur Kapselung der geoDLL #############

#########################################################################

 

using System;

using System.Runtime.InteropServices;

 

namespace beispielprojekt

{

 

 

  public class class_kootrans

  {

    public class_kootrans()

    {

      

    }

 

    // Beispiel zur Einbindung der GeoDLL in ein .NET-Projekt unter

    // Verwendung der Programmiersprache C#

    // Programmiert von Dr. M. Reichert, ARCADIS Consult Freiberg 

    // (www.fg.arcadis.de)

    // August 2003

    // Koordinatentransformationen unter Verwendung der DLL GeoDLL von

    // Killet GeoSoftware Ing.-GbR, Kempen, Germany (www.killetsoft.de)

 

    // Das Vorhandensein der Dateien geodll32.dll und geodllbn.bin wird

    // in einem Verzeichnis vorausgesetzt, auf welches in der $PATH-

    // Umgebungsvariable verwiesen wird, im einfachsten Falle also das

    // Systemverzeichnis

 

    // Import der GeoDLL mit Platform Invoke. Damit wird diese DLL mit

    // der Klasse class_kootrans gekapselt.

    // Jede benötigte DLL-Funktion muss separat importiert werden.

    // Um Code-Übereinstimmung mit der GeoDLL zu erzielen, muss.

    // CharSet=CharSet.Ansi eingestellt sein!

 

    [DllImport("geodll32.dll", EntryPoint="setunlockcode", 

    ExactSpelling=false, CharSet=CharSet.Ansi, SetLastError=true)] 

    private static extern bool setunlockcode(string pszFreischaltcode,

    string pszLizenznehmer);

 

    [DllImport("geodll32.dll", EntryPoint="setcoordarea",

    ExactSpelling=false, CharSet=CharSet.Ansi, SetLastError=true)] 

    private static extern bool setcoordarea(int nSchalter);

 

    [DllImport("geodll32.dll", EntryPoint="coordtrans",

    ExactSpelling=false, CharSet=CharSet.Ansi, SetLastError=true)] 

    private static extern bool coordtrans(double nCoordXQ, double nCoordYQ,

    string pszKoordQ, int nCoordSysQ, int nRefSysQ, out double nCoordXZ,

    out double nCoordYZ, out string pszKoordZ, int nCoordSysZ,

    int nRefSysZ, int nStripZ);

 

 

    internal string freischalten()

    {

      // gibt die Funktion setunlockcode nach außen

      if(setunlockcode("108151234-123454321","Winzigweich GmbH")

      && setunlockcode("123455678-471187656","Winzigweich GmbH")) return "ok";

      else return "nicht frei geschaltet";

    }

    // Die Freischaltschluessel stimmen natürlich nicht!

    // Sie müssen bei Killet GeoSoftware Ing.-GbR erworben werden!

    // Vollversion: Der Freischaltschluessel muss bei der 1. Eingabe stimmen!

    // Testversion: Die Funktion darf nicht aufgerufen werden!

    // Die Testversion funktioniert pro Programmlauf kurze Zeit ohne

    // Freischaltung!

 

    internal string gausskrueger3GradZuGeografisch(double rechts,

    double hoch, out double laenge, out double breite)

    {

      // gibt die DLL-Funktion coordtrans in einer bestimmten, auf den

      // jeweiligen Einsatzzweck abgestimmten, Parameterkonfiguration nach

      // außen

 

      // Rechnet die übergebenen Rechts- und Hochwerte des

      // Koordinatensystems 3° Gauss-Krueger, Bezugssystem DHDN

      // in geografische Koordinaten der Formatierung gggmm (Grad, Minute),

      // Bezugssystem WGS84, um.

 

      string ergebnis;

      string outstring;

      // Dimensionierung der out-Parameter, da nicht im Funktionsaufruf

      // vorhanden, weil sie hier eigentlich nicht gebraucht werden.

 

      laenge=breite=0;

      // out-Werte zuweisen, falls es wegen Dateneingabefehler nicht zu

      // einer Berechnung kommt.

 

      // Eigene Koordinatenprüfung

      if(rechts>9999999 || rechts<0) 

      {

        return ergebnis="Fehler in Rechtswerteingabe";

      }

      if(hoch>9999999 || hoch<-9999999) 

      {

        return ergebnis="Fehler in Hochwerteingabe";

      }

 

      setcoordarea(1);

      // Koordinatenüberprüfung der DLL einschalten.

 

      if(coordtrans(rechts,hoch,"",2,0,out laenge, out breite,

      out outstring,32,0,0)) ergebnis="ok";

      else ergebnis="Fehler bei der Berechnung";

 

      return ergebnis;

    }

 

    internal string geografischZuGausskrueger3Grad(double laenge, double

    breite, int zielStreifen, out double rechts, out double hoch)

    {

      // gibt die DLL-Funktion coordtrans in einer bestimmten, auf den

      // jeweiligen Einsatzzweck abgestimmten, Parameterkonfiguration nach

      // außen.

 

      // Rechnet die übergebenen geografischen Längen- und Breitenangaben

      // der Formatierung gggmm (Grad, Minute) , Bezugssystem WGS84

      // in Koordinaten des Koordinatensystems 3° Gauss-Krueger,

      // Bezugssystem DHDN, um.

 

      // Der Parameter zielStreifen bestimmt den Streifen, für welchen die

      // Ergebniskoordinaten errechnet werden sollen.

 

      string ergebnis;

      string outstring;

      // Dimensionierung des out-Parameters, da nicht im Funktionsaufruf

      // vorhanden, weil er hier eigentlich nicht gebraucht wird.

 

      rechts=hoch=0;

      // out-Werte zuweisen, falls es wegen Dateneingabefehler nicht zu

      // einer Berechnung kommt.

 

      //eigene Koordinatenprüfung

      if(laenge>18000 || laenge<-18000 

      || ((laenge/100)-Math.Floor(laenge/100))*100>59.99999) 

      {

        return ergebnis="Fehler in Längeneingabe";

      }

      if(breite>9000 || breite<-9000 

      || ((breite/100)-Math.Floor(breite/100))*100>59.99999) 

      {

        return ergebnis="Fehler in Breiteneingabe";

      }

      if(zielStreifen<0 || zielStreifen>120)

      {

        return ergebnis="Fehler in Meridianstreifeneingabe";

      }

 

      setcoordarea(1);

      // Koordinatenüberprüfung der DLL einschalten.

 

      if(coordtrans(laenge,breite,"",32,0,out rechts, out hoch,

      out outstring,2,0,zielStreifen)) ergebnis="ok";

      else ergebnis="Fehler bei der Berechnung";

 

      return ergebnis;

    }

  }

}

#########################################################################

 

 

 

#########################################################################

###########  Aufruf von Funktionen der Klasse class_kootrans ############

#########################################################################

 

private void button3_Click(object sender, System.EventArgs e)

{

  class_kootrans koordinatentransformation = new class_kootrans();

  // Instanzierung der eigenen Klasse class_kootrans, welche die

  // GeoDLL kapselt.

 

  double laenge, breite, rechts, hoch; 

  // Dimensionierung der Rückgabevariablen.

  string ergebnis;

 

  // Freischalten der DLL.

  ergebnis=koordinatentransformation.freischalten();

  MessageBox.Show(ergebnis);

 

  // Funktionsaufruf der eigenen Klasse: Umrechnung GK-Koordinaten in

  // Geografische Koordinaten.

  ergebnis=koordinatentransformation.gausskrueger3GradZuGeografisch(

  4492252.29,6011118.28,out laenge, out breite);

  MessageBox.Show("Ergebnis: " + ergebnis + "    B: " + breite.ToString()

  + "   L: " + laenge.ToString() );

 

  // Funktionsaufruf der eigenen Klasse: Umrechnung von Geografische

  // Koordinaten in GK-Koordinaten, Projektion auf 3. Meridianstreifen.

  ergebnis=koordinatentransformation.geografischZuGausskrueger3Grad(

  1152.87,5413.91,3,out rechts, out hoch);

  MessageBox.Show("Ergebnis: " + ergebnis + "   MS: 3   RW: " + rechts

  + "     HW: " + hoch);

 

  // Funktionsaufruf der eigenen Klasse: Umrechnung von Geografische

  // Koordinaten in GK-Koordinaten, Projektion auf 4. Meridianstreifen.

  ergebnis=koordinatentransformation.geografischZuGausskrueger3Grad(

  1152.87,5413.91,4,out rechts, out hoch);

  MessageBox.Show("Ergebnis: " + ergebnis + "   MS: 4   RW: " + rechts

  + "     HW: " + hoch);

 

  // Funktionsaufruf der eigenen Klasse: Umrechnung von Geografische

  // Koordinaten in GK-Koordinaten, Projektion auf 5. Meridianstreifen.

  ergebnis=koordinatentransformation.geografischZuGausskrueger3Grad(

  1152.87,5413.91,5,out rechts, out hoch);

  MessageBox.Show("Ergebnis: " + ergebnis + "   MS: 5   RW: " + rechts 

  + "     HW: " + hoch);

}

#########################################################################