2013-02-05 13 views
10

Wenn ich eine Datei als 'eingebettete Ressource' baue, gibt Visual Studio diesem einen Namen in der Assembly, abhängig von seinem Pfad im Projekt. Z.B. Meine Datei unter cases/2013.1/colours.xml erhält einen Ressourcennamen mit sporadischen Unterstrichen wie cases._2013._1.colours.xml.Wie wird .NET meine eingebetteten Ressourcen umbenennen?

Meine Frage ist - wie wird dieser Name bestimmt? Sind die Regeln dokumentiert? Wo ist die Methode, die Visual Studio verwendet?

Edit: Ich frage, weil ich mit einer großen Anzahl dieser Dinge arbeite und es wäre hilfreich, in der Lage zu sein, den Ressourcennamen aus dem Dateipfad abzuleiten.

+2

_ wird verwendet, da ein Bezeichner nicht mit einer Ziffer beginnen kann (zumindest in C#). – leppie

+3

[Related] (http://Stackoverflow.com/q/3605514/21567), können Sie nur den Namen nach Ihren Wünschen ändern. –

+0

Siehe auch http://StackOverflow.com/a/10714391/1354426 – Stipo

Antwort

13

Wie der Artikel MSDN Library dokumentiert, verwendet Resgen.exe die von der StronglyTypedResourceBuilder.VerifyResourceName() method implementierten Regeln. Ich werde nur kopieren, was die MSDN-Bibliothek sagt:

Wenn der Schlüsselparameter eine leere Zeichenfolge ("") ist, wird eine Zeichenfolge zurückgegeben, die aus einem einzelnen Unterstrich (_) besteht. Wenn der Schlüsselparameter keine leere Zeichenfolge ist, vergleicht die VerifyResourceName-Methode jedes Zeichen in der Zeichenfolge mit einer Gruppe ungültiger Token, die auf der Sprache basieren, die durch den Provider-Parameter angegeben wird. Jedes ungültige Zeichen in der Zeichenfolge wird durch einen Unterstrich ersetzt. Die Zeichen, die durch einen Unterstrich ersetzt werden, lauten wie folgt:

'' (Leerzeichen), U + 00A0 (nicht schließendes Leerzeichen), '.' (Zeitraum), ',' (Komma), ';' (Semikolon), '|', '~', '@', '#', '%', '^', '&', '*', '+', '-', '/', '\ ',' < ','> ','? ',' [','] ',' (',') ',' {','} ',' '' (Zitat), '' '(Apostroph), ‚:‘ ‚!‘.., und

Hinweis
stark typisierte Ressourcen (wie wenn, für, usw.) als Ressource Schlüsselnamen nicht die Verwendung von Sprache Schlüsselwörter erlauben jedoch Das Entwurfsmuster System.CodeDom ermöglicht die Verwendung von Sprachschlüsseln, indem dem Schlüsselwort der Unterstrich vorangestellt wird.Die Methode VerifyResourceName ruft die CreateValidIdentifier-Methode auf, um diesen Entwurf zu erzwingen, beispielsweise wenn Sie einen Ressourcennamen verwenden, der mit einem Sprachschlüsselwort übereinstimmt Wie für, erscheint der Name als _for in der generierten stark typisierten Ressourcenklasse.

Mit Blick auf den Quellcode für die StronglyTypedResourceBuilder-Klasse ist die Dokumentation korrekt.

+0

Großartig! Was soll ich für den zweiten Parameter angeben? –

+1

Ein CodeDomProvider, klicken Sie einfach auf den Link der MSDN-Bibliothek. Sie würden CSharpCodeProvider verwenden, da Sie Ihre Frage [C#] markiert haben. Dies ist, wie die Methode über Schlüsselwörter in einer Sprache weiß, der in der Anmerkung erläuterte Teil. –

+2

Interessanterweise erhalte ich andere Ergebnisse als der Name in meiner Assembly, wenn ich StronglyTypedResourceBuilder.VerifyResourceName manuell aufruft. Wenn beispielsweise bundle.config zu bundle_config wird, aber der Name in der Assembly lautet bundle.config –

1

Mir ist keine Dokumentation darüber bekannt, wie Visual Studio selbst die Namen generiert, aber ich gehe normalerweise davon aus, dass es mit dem von resgen.exe für eigenständige Builds verwendeten Algorithmus kompatibel ist, der dokumentiert ist here. Der beschriebene Algorithmus funktioniert jedoch nicht für Ihr Beispiel (es sei denn, ich interpretiere es falsch, es würde einen Klassennamen von cases._013._.colours erzeugen), also implementiert entweder VS es falsch, oder die resgen-Dokumentation ist für den speziellen Fall, den Sie beschreiben, ungenau.

0

die einfachen Regeln, die Sie Ihr Beispiel anwenden können, sind ...

cases/2013.1/colours.xml 

1) ersetzen "/" mit ""

cases.2013.1.colours.xml 

2) für jedes Element in dem Punkt getrennten Zeichenfolge, wenn das Element mit einer Ziffer beginnt, einen Unterstrich, um es voranstellen.

cases => cases 
2013 => _2013 
1 => _1 
colours => colours 
xml => xml 

3) Zusammenbau der Zeichenfolge, abgegrenzt mit einem Punkt.

cases._2013._1.colours.xml 
+0

Der Grund dafür ist, dass der Name der Ressource mit Codesymbolen kompatibel sein muss - also müssen Zahlen ein alphabetisches Zeichen oder einen Unterstrich als Präfix haben um sie zu gültigen Symbolen zu machen (Variablennamen). Der beste Ansatz besteht darin, Namen zu verwenden, die nicht geändert werden müssen, z. "Jahr2012" statt "2012". Auf diese Weise werden die Namen auf sehr einfache Weise übersetzt (Schrägstriche durch Punkte ersetzt). –

Verwandte Themen