Friend Assemblies und C#
In der Uni schreibe ich gerade an einem Projekt, in dem sehr viele private und interne Funktionen und Klassen verwendet werden. Da ich einen Editor für das Projekt schreibe muss ich teilweise auf diese internen Daten zugreifen können. Leider kann man in C# keine Klassen sondern nur Assemblies als Friend deklarieren.
Das geht dann allerdings relativ einfach. In Visual Studio stellt man in den Projekteigenschaften die Signierung ein.
Visual Studio generiert dabei einen Key, alternativ kann man auch einen schon vorhandenen verwenden. Als nächstes braucht man den öffentlichen Teil des Keys. Den bekommt man mit dem Tool sn.
sn -p PrivaterSchluessel.snk OeffentlicherSchluessel.snk
sn -tp OeffentlicherSchluessel.snk
Den ausgegebenen String muss man dann nur noch der referenzierten Assembly bekannt machen. Dazu trägt man typischerweise in die Datei Properties\AssemblyInfo.cs den offentlichen Teil als Attribut ein.
Das kann dann etwa so aussehen:
[assembly: InternalsVisibleTo("DialogEditor,
PublicKey="0024000004800000940000000602000000240000525341"
+ "310004000001000100fd68e58b1cc537008f6bbb6c202d33ad29c9"
+ "6b67ec3ef0ec6983b602dbcdf42d68a7d9b1384b89a22b3f253916"
+ "e4c452b498b95c6d2162aa1508340cdba44c7c21fe75c2034aa63a"
+ "33e3db4648184bb8033dcbbb7a836fa566b5c78ef0413c119bed99"
+ "6f784f54abb0439fac1332966bb76d3f66ad52f0eedb5e175fddbd"
+ "0c91")]
Dann kann man aus der referenzierenden Assembly alles interne benutzen. Wenn man das InternalsVisibleTo-Attribut nur auf Klassen oder Methoden anwenden will, kann man das natürlich auch tun.
Als Nachteil muss man leider anführen, daß eine signierte Assembly nur signierte Assemblies referenzieren kann. Wenn man eine nichtsignierte Assembly referenzieren möchte gibt es eine Fehlermeldung.
