Public Key Token eines Assemblies ermitteln

Wenn man ein .NET Assembly mit einem Strong Name versehen hat, möchte man manchmal den „PublicKeyToken“ dieses Assemblies aus einem anderen Assembly ermitteln. Im ersten Schritt wird dazu das Assembly benötigt. Wenn es bereits eingebunden ist, kann mittels:

Assembly[] assemblies=AppDomain.CurrentDomain.GetAssemblies();

das richtige Assembly gesucht werden. Alternativ ist es auch möglich ein Assembly mittels:

Assembly assembly=Assembly.LoadFile(path);

von der Festplatte zu laden. Danach geht es an die Ermittlung des Public Key Tokens:

string[] parts=assembly.FullName.Split(new char[]{','}, StringSplitOptions.RemoveEmptyEntries);
string publicKeyToken=parts[parts.Length-1].Trim().Replace("PublicKeyToken=", "");

Dieses könnte dann in der Applikation mit einem bestehenden Schlüssel verglichen werden um die Integrität des geladenen Assemblies zu verifizieren.

Unterschiedliche Assemblies je nach Konfiguration einbinden

Manchmal ist es nötig je nach Konfiguration ein anderes Assembly in ein .NET/Mono Projekt einzubauen. Direkt im Visual Studio funktioniert das leider nicht. Allerdings kann man die Einstellung mit einem Texteditor in der Projektdatei vornehmen:

<Reference Include="libInterval" Condition="'$(Configuration)'=='Debug'">
  <HintPath>libInterval\x32-debug\libInterval.dll</HintPath>
</Reference>
<Reference Include="libInterval" Condition="'$(Configuration)'=='Release'">
  <HintPath>libInterval\x32-release\libInterval.dll</HintPath>
</Reference>

Wichtig ist dabei der „Condition“-Teil welcher festlegt das die eine DLL nur bei der jeweiligen Konfiguration genutzt wird. Durch diesen landet das richtige Assembly später im entsprechenden Buildordner.

GPS getaggte Bilder auf einer Karte anzeigen

Über das Wochenende hatte ich einige GPS getagte Bilder geschossen und wollte diese auf einer Karte darstellen. Eine kurze Suche im Netz ergab, das so etwas in dieser Form nicht existierte (wobei hier natürlich ein Irrtum vorliegen kann). Also wurde das ganze auf Basis von Leaflet implementiert.

Die Webapplikation in Aktion

Die Webapplikation in Aktion

Leaflet ist ein Framework mit welchem man schnell Kartenapplikationen im Web realisieren kann. Um den „Gps Tagged Image Viewer“ zu benutzen, müssen die Dateien auf einem Webserver kopiert werden. Die Bilder werden dabei in den Ordner „images“ kopiert. Anschließend wird das PHP Skript „parseimages.php“ aus dem „utils“ Ordner ausgeführt. Dieses ließt die EXIF Daten aus den Bildern aus und erzeugt die entsprechenden Marker in einer Javascript Datei. Danach kann das ganze genutzt werden.

Die Karte ist dabei mit drei Kartenebenen versehen, einmal Bing Luftbilder (für welche ein API-Key registriert werden muss), sowie OpenStreetMap in zwei unterschiedlichen Renderings. Der Quelltext ist unter GPLv3 verfügbar und kann auf GitHub bezogen werden.

GPS EXIF Koordinaten in dezimale Gradkoordinaten umrechnen

Wenn man sich einmal die Mühe macht und in EXIF Daten hineinschaut um die GPS Daten zu ermitteln, so wird man feststellen, das die Daten nicht einfach in Dezimalgrad angegeben sind, sondern in Form von rationalen Zahlen, aufgeteilt in Grad, Minuten und Sekunden. Möchte man diese Angaben nun in Dezimalgrad umrechnen ist etwas Mathematik gefragt. Nehmen wir folgende Arrays für Latitude und Longitude an:

Latitude ( [0] => 53 [1] => 1 ) Array ( [0] => 29 [1] => 1 ) Array ( [0] => 5065 [1] => 100 )
Longitude ( [0] => 13 [1] => 1 ) Array ( [0] => 18 [1] => 1 ) Array ( [0] => 1928 [1] => 100 )

Daraus ergibt sich dann folgender Rechnenweg welcher hier exemplarisch für die Latitude gezeigt sei:

latitudeGrad=53/1
latitudeMinuten=29/1
latitudeSekunden=5065/100

Wenn die Werte der rationalen Zahlen korrekt sind kann die Umwandlung in Dezimalgrad nach folgender Formel beginnen:

Dezimalgrad=Grad+(Minuten*60+Sekunden)/3600

Im obigen Beispiel müssten hierbei in etwa (je nach Genauigkeit) die Koordinaten 53.497222 und 13.305278 in Dezimalgrad herauskommen.

Managed Assembly-Architektur unter .NET ermitteln

Manchmal ist es nötig zu ermitteln für welche Plattform ein Assembly konfiguriert wurde. Dies kann man dabei unkompliziert über die „GetAssemblyName“ Funktion welche sich im Namespace „System.Reflection“ befindet ermitteln:

System.Reflection.AssemblyName.GetAssemblyName(@"C:\Temp\CSCL.dll");

Aus der Ausgabe:

{CSCL, Version=1.4.1.3, Culture=neutral, PublicKeyToken=null}
    CodeBase: "file:///C:/Temp/CSCL.dll"
    ContentType: Default
    CultureInfo: {}
    CultureName: ""
    EscapedCodeBase: "file:///C:/Temp/CSCL.dll"
    Flags: PublicKey
    FullName: "CSCL, Version=1.4.1.3, Culture=neutral, PublicKeyToken=null"
    HashAlgorithm: SHA1
    KeyPair: null
    m_siInfo: null
    Name: "CSCL"
    ProcessorArchitecture: X86
    Version: {1.4.1.3}
    VersionCompatibility: SameMachine

ist dann unter „ProcessorArchitecture“ auch die entsprechende Architektur ersichtlich.