2012-10-12 8 views
7

Ich bin es gewohnt, Ressourcen in C# einzubetten, und ich mag die Art, wie Namespaces automatisch den eingebetteten Ressourcen hinzugefügt werden. Das ermöglicht es mir, solche Dinge zu tun:Automatisches Hinzufügen von Namespaces basierend auf dem Pfad zu eingebetteten VB.NET-Ressourcen

files\version1\config.xml 
files\version2\config.xml 
files\version2\config.xml 

Leider, wenn Sie das gleiche in einem VB.NET-Projekt versuchen, werden Sie Fehler kompilieren lassen, da sie alle eingebetteten Ressourcen in den Stammnamespace zu setzen versucht. Um dies zu umgehen kann ich manuell bearbeiten Sie die .vbproj Datei wie folgt:

<EmbeddedResource Include="files\version1\config.xml"> 
    <LogicalName>$(RootNamespace).files.version1.config.xml</LogicalName> 
</EmbeddedResource> 
<EmbeddedResource Include="files\version2\config.xml"> 
    <LogicalName>$(RootNamespace).files.version2.config.xml</LogicalName> 
</EmbeddedResource> 
<EmbeddedResource Include="files\version3\config.xml"> 
    <LogicalName>$(RootNamespace).files.version3.config.xml</LogicalName> 
</EmbeddedResource> 

Das funktioniert zwar, ist es manuelle, zeitaufwendig und fehleranfällig, so meine Frage ist: Kann ein Build-Task oder Buildereignis geschrieben werden kann das automatisch?

Antwort

2

Dies ist ein Nebeneffekt davon, wie Visual Basic keine Ordnerpfade verwendet, um Namespaces standardmäßig zu erstellen.

Persönlich, anders als der spezifische Fall, sprechen Sie über ich bevorzuge es nicht alle zusätzlichen Ordnerpfade im Namen. Ich hoffe, dass MS den Dateiressourcen eine weitere Eigenschaft hinzufügt, um zu ermöglichen, dass ein Namespace in Zukunft spezifisch festgelegt wird, aber bis dahin ....

Die Lösung ist jedoch ziemlich einfach.

Erstellen Sie eine Ressource-nur DLL in C# und lesen Sie Ihre Ressourcen von dort. Als VB-Entwickler würde ich nicht zweimal darüber nachdenken, dies zu tun, um diesen speziellen Zweck zu erfüllen.

BEARBEITEN. OR ... kann eine vbs-Datei als Prebuild-Ereignis verwenden, um Dateien in ein neues Ressourcenverzeichnis in dem Format zu kopieren, das zum Erstellen des simulierten Namespace erforderlich ist.

Ausgabefordere muss bereits existieren (und darf natürlich nicht "Version" im Ordnernamen haben).

+0

Ich nehme an, einfach hängt davon ab, wie Sie es betrachten. Ein ganz anderes Projekt hinzuzufügen, um das zu erreichen, ist einfach, aber ich würde es nicht einfach nennen. Ganz zu schweigen von der Tatsache, dass ich entweder eine andere DLL verteilen oder sie nach dem Build kombinieren müsste. Ich stimme das als Alternative ab, aber ich kann es nicht als Antwort akzeptieren, da ich nach einer Build-Aufgabe oder einem Build-Ereignis suche, das dies innerhalb desselben Projekts erreichen kann. –

+0

True enough, ich mag es auch nicht, zu viele DLLs hinzuzufügen. Wie wäre es damit, alle Ihre Dateien in einem ähnlichen Format wie Sie zu haben? Schreiben Sie dann ein kurzes VBS-Skript, das die Ordner "Version ..." durchläuft und sie in einem Ausgabeverzeichnis zusammenfügt. Fügen Sie einfach einen Haken hinzu, um zu sehen, dass die Datei zuerst geändert wurde, so dass nicht jede Datei jedes Mal neu geschrieben wird. Sobald Sie alle diese Dateien als eingebettete Ressourcen markiert haben, werden sie durch das Überschreiben nicht zurückgesetzt. Wieder ist es eher ein Bandaid als ein richtiger Weg, aber man könnte zumindest den manuellen Teil entfernen. – DarrenMB

Verwandte Themen