Möchte man sich den IL-Code eines .NET Assemblies anschauen, so nutzt man dafür Tools wie NET.Reflector oder ILSpy. Für den Reflector gibt es dabei ein nettes AddIn welches auf den Namen „Reflector.FileDisassembler“ hört. Mit diesem ist es möglich ganze Assemblies in Visual Studio Projekt zu übersetzen. Zu finden ist das AddIn dabei unter http://www.denisbauer.com/NETTools/FileDisassembler.aspx.
Named Pipes zur Interprozesskommunikation
Interprozesskommunikation unter .NET ist so eine Sache. Da gibt es unter anderem das relativ mächtige Remoting Framework. Leider schlägt sich die Mächtigkeit auch in der Komplexität nieder. Wesentlich einfach wird das ganze mittels Named Pipes welche sich auch zur Interprozesskommunikation eignen. Dazu benötigt man einen Server und einen Client. Der Server könnte dabei unter .NET so aussehen:
Task.Factory.StartNew(() =>
{
NamedPipeServerStream server=new NamedPipeServerStream("halfPipe");
server.WaitForConnection();
StreamReader reader=new StreamReader(server);
StreamWriter writer=new StreamWriter(server);
while(true)
{
string line=reader.ReadLine();
if(line=="HELLO")
{
writer.WriteLine("Hi");
writer.Flush();
}
else
{
writer.WriteLine("Unknown command.");
writer.Flush();
}
}
});
Auf der Clientseite sieht die Kommunikation fast genauso aus:
NamedPipeClientStream pipeStream=new NamedPipeClientStream("halfPipe");
pipeStream.Connect();
StreamReader reader=new StreamReader(pipeStream);
StreamWriterwriter=new StreamWriter(pipeStream);
writer.WriteLine("HELLO");
writer.Flush();
string ret=reader.ReadLine();
Damit ist die Kommunikation zwischen den Prozessen eingerichtet. Natürlich kann man nicht nur Strings sondern auch andere Datentypen über die „Named Pipes“ verschicken.
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.
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.
