wir-sin.org Blogs

Just another blogs.wir-sin.org weblog

Flower

Freundliche Assemblies und geheime Klassen

Kürzlich hatte ich die Anforderung eine Klasse mit einigen Members nur gewissen Assemblies zugänglich zu machen. Nach kurzem Nachdenken und einer schnellen Suche stellte sich heraus das dieses Unterfangen am einfachsten mit Friendly Assemblies zu bewerkstelligen ist.

Bloß wie definiert man Friendly Assemblies und wie Verwendet man selbige? Genau das werde ich hier nun erklären.

Ich starte mit einer Blank Solution um alle Schritte so genau wie Möglich zu beschreiben.

Erstellen einer Empty Solution

Erstellen einer Empty Solution

In dieser Solution legen wir nun 2 Projekte an zum einen das Assembly mit den geheimen Klassen und Membern und zum anderen das Assembly welches auf diese geheimen Klassen und Member zugreifen soll.

Erstellen einer Class Library

Erstellen einer Class Library

Erstellen einer Console Application

Erstellen einer Console Application

Als nächstes generiere ich ein KeyPair zum Signieren der Assemblies.

Dazu öffne ich einen Visual Studio 2008 Command Prompt und führe folgende Schritte aus.

Erstellen eines KeyPair zum Signieren von Assemblies

Erstellen eines KeyPair zum Signieren von Assemblies

sn -k MeinName.snk
sn -p MeinName.snk MeinName.Public.snk
sn -tp MeinName.Public.snk > publickey.txt

Nun da ich ein KeyPair und einen daraus resultierenden Public Key habe kann ich beide Assemblies Signieren.

Wenn dies geschehen ist kann ich mich dem Implementieren einer geheimen Klasse zuwenden.

using System;

namespace SecretDemo
{
    internal class SecretDog
    {
        internal SecretDog()
        {
            Console.WriteLine("SecretDog created.");
        }

        internal void Bark()
        {
            Console.WriteLine("Bark...");
        }
    }
}

Nun muss ich in meinem Assembly noch definieren wer seine Freunde sind. Dies geschieht über eine Direktive in der Datei AssemblyInfo.cs. Die Direktive lautet:

[assembly: InternalsVisibleTo("UserDemo, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e34a70830f261f8133ec72c3b49047f2a41970d2750b92aed7bb94daabe9883f88a736b1bef5ad7c4462776a9780e8a927a61c329249f0e0973463f134dc54cb1048e000d5a1ace7a9d97bd9e5cf5a3ced78edae726b5656b61ce4340214ceee2936838b73183909657bc7a56e17a8559b1869cd6d9497dbb7e6b12f4d96dcc7")]

Diese Direktive folgt dem Schema „AssemblyName, PublicKey=PublicKey“. Den PublicKey entnimmt man der Textdatei welche im Zuge der Erstellung des KeyPairs entstanden ist. Da Dies nun geschehen ist kann ich diese Klasse in meiner UserDemo Assembly verwenden. Dazu füge ich eine Referenz auf das SecretDemo Projekt in das UserDemo Projekt ein und erstelle den Code der die Geheime Klasse verwendet.

using System;
using SecretDemo;

namespace UserDemo
{
    static class Program
    {
        static void Main(string[] args)
        {
            SecretDog dog = new SecretDog();
            dog.Bark();
            Console.ReadLine();
        }
    }
}

Wenn alles gutgegangen ist sollte eine lauffähige Applikation entstanden sein welche den SecretDog verwenden kann. Und das Ergebnis sollte wie folgt aussehen.

Laufende Demo Applikation welche die geheime Klasse SecretDog verwendet.

Laufende Demo Applikation welche die geheime Klasse SecretDog verwendet.

Tags: , ,

Leave a Reply