Entwickler-Ecke

C# - Die Sprache - Metadaten eigener Assemblies


FrEEzE2046 - Mi 26.05.10 20:44
Titel: Metadaten eigener Assemblies
Hallo,

ich benutze das Visual Studio 2010 Premium und möchte gerne Metadaten von meinen eigenen Assemblies erhalten. Es geht mir dabei immer explizit um die Assembly in der der Code dann auch ausgeführt würde.

Ich brauche die Anzahl an inneren Namespace, Klassen und Methoden (global). Ist dies irgendwie möglich?



EDIt: Okay, die Klasse Assembly scheint mir ja alles zu liefern, was ich brauche. Kann man eigentlich den Namespace der durch die Assembly nach außen gegeben wird, mit einem Attribut verändern?


Kha - Mi 26.05.10 22:34

user profile iconFrEEzE2046 hat folgendes geschrieben Zum zitierten Posting springen:
den Namespace der durch die Assembly nach außen gegeben wird
Was genau meinst du damit? Ein Namespace ist eigentlich nur ein Präfix eines Typnamens, weder die Assembly noch die CLR weiß etwas davon.


FrEEzE2046 - Do 27.05.10 13:13

Das mit dem Namespace hat sich mittlerweile erledigt. Es ist folgendermaßen:

Ich habe eine kleine Bibliothek, die aus mehreren Class Library Projects und damit Assemblies besteht. Die oberste Ebene - die von allen anderen referenziert wird - soll eine Methode erhalten, die die Versionsnummer anhand gewisser Assembly-Informationen bildet:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
internal class LibraryHelper
{
    static string CurrentVersion
    {
        get;
        set;
    }
}



Diese Methode soll allen anderen Class Library Projects ebenfalls zur Verfügung stehen, aber natürlich letztendlich nicht dem Benutzer dieser Bibliothek.

Ist das irgendwie zu bewerkstelligen? Falls nicht, würde es mir auch reichen eine Art Makro zu haben ...


Kha - Do 27.05.10 13:19

Japp, das funktioniert genau so mit InternalsVisibleToAttribute.


FrEEzE2046 - Do 27.05.10 16:01

Hi, danke für deine Antwort. Ich hätte noch eine Frage.

Ich wollte meine Summarys in externe Dateien auslagern. Dies soll ja per <include> möglich sein. Ich habe original das Beispiel von MSDN [http://msdn.microsoft.com/de-de/library/9h8dy30z.aspx] benutzt ... aber ohne Erfolg.

Er kompiliert zwar ohne Warnung (mit /doc), aber das IntelliSense zeigt mir meine Summarys nicht an. Woran kann das liegen? Ich benutze das VS 2010 Premium.


PS:
Wegen der Versionierung:

So habe ich die Klasse die die Version bildet umgesetzt. Leider kann ich sie aber nicht setzen:


C#-Quelltext
1:
[assembly: AssemblyVersion(LibraryHelper.CurrentVersion)]                    


Quelltext
1:
An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type    35                    



C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
internal static class LibraryHelper
{
    internal static int MajorVersion = 1;
    internal const string CurrentVersion = _BuildVersionNUmber();


    private static string _BuildVersionNUmber()
    {
        int modules, classes, methods = 0;

        Assembly thisAssembly = Assembly.GetExecutingAssembly();

        modules = thisAssembly.GetModules().Length;

        Type[] exportedTypes = thisAssembly.GetExportedTypes();
        classes = exportedTypes.Length;

        foreach (Type type in exportedTypes)
        {
            methods += type.GetMethods().Length;
        }

        return string.Format("{0}.{1}.{2}.{3}", MajorVersion, modules, classes, methods);
    }


    static LibraryHelper()
    {

    }
}


Kha - Do 27.05.10 17:00

user profile iconFrEEzE2046 hat folgendes geschrieben Zum zitierten Posting springen:
Ich wollte meine Summarys in externe Dateien auslagern. Dies soll ja per <include> möglich sein.
Da das genau genommen nicht mehr unter Assembly-Metadaten fällt, sollten wir das lieber in einem neuen Thread besprechen :) . Aber wenn die erstellte XML-Datei stimmt, liegt es schon einmal nicht an <include>.

user profile iconFrEEzE2046 hat folgendes geschrieben Zum zitierten Posting springen:
Leider kann ich sie aber nicht setzen:
Ja, so geht das leider nicht (müsste ja Code zur Kompilierzeit ausgeführt werden). Warum willst du denn so einen komplizierten Buildstring haben, der nicht einmal Einzigartigkeit garantiert?