2012-10-12 48 views
7

Estoy acostumbrado a incorporar recursos en C# y me gusta la forma en que agrega automáticamente espacios de nombres a los recursos incrustados. Eso me permite hacer cosas como esta:Agrega espacio de nombres automáticamente en función de la ruta a los recursos incrustados de VB.NET

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

Por desgracia, si se intenta la misma en un proyecto VB.NET que obtendrá errores de compilación, ya que trata de poner todos los recursos incrustados en el espacio de nombres raíz. Para evitar esto puedo editar manualmente el archivo .vbproj así:

<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> 

Aunque esto funciona, es manual, lento y propenso a errores, por lo que mi pregunta es la siguiente: Puede una tarea de construcción o construir caso escribirse qué esto automáticamente?

Respuesta

2

Esto es un efecto secundario de cómo Visual Basic no utiliza rutas de carpeta para crear espacios de nombres de forma predeterminada.

Personalmente, aparte del caso específico, de sus conversaciones prefiero que no tenga todas las rutas de carpetas adicionales en el nombre. Espero que MS agregue otra propiedad a los recursos de archivos para permitir que un espacio de nombres se establezca específicamente en el futuro, pero hasta entonces ...

La solución es bastante simple.

Cree un dll de solo recursos en C# y lea sus recursos desde allí. Como desarrollador de VB, no lo pensaría dos veces antes de hacerlo para satisfacer ese propósito específico.

EDIT. O ... puede usar un archivo vbs como un evento de preconstrucción para copiar archivos a un nuevo directorio de recursos en el formato necesario para crear el espacio de nombres simulado.

dim fSys 
set fsys=createobject("Scripting.FileSystemObject") 
dim root : root= "c:\temp" 
dim out : out="c:\temp\DynResource" 

dim rFo: set rFo=fsys.getfolder(root) 
dim outPath 

for each sf in rFo.SubFolders 
    if instr(1, sf.name, "Version")>=1 then 'valid resource folder 
     for each f in sf.Files 
      outpath = out & "\" & sf.name & "." & f.name 
      if fsys.FileExists(output) then 
       dim tf:set tf=fsys.getfile(output) 
       if tf.length<>f.length or tf.DateLastModified<>f.DateLastModified then 
        f.copy outPath,true 
       else 
        'same file, no update required. 
       end if 
      else 
       f.copy outPath,true 
      end if 
     next 
    end if 
next 

El álbum de salida ya debe existir (y obviamente no puede tener "Versión" en el nombre de la carpeta).

+0

Supongo que simple depende de cómo se mire. Agregar un proyecto completamente diferente solo para lograr esto es fácil, sí, pero no lo llamaría simple. Sin mencionar el hecho de que tendría que distribuir otro dll o combinarlos después de la compilación. Votaré esto como una alternativa, pero no puedo aceptarlo como la respuesta ya que estoy buscando una tarea de compilación o un evento de compilación que pueda lograr esto dentro del mismo proyecto. –

+0

En verdad, no me gusta agregar demasiadas DLL. ¿Qué pasa con mantener todos sus archivos en un formato similar al que tiene? pero luego solo escriba un script VBS corto que pueda recorrer las carpetas "Versión ..." y anexarlas juntas en un directorio de salida. Simplemente agregue un cheque para ver que el archivo haya cambiado primero para que no vuelva a escribir cada archivo cada vez. Una vez que haya marcado todos esos archivos, los recursos incrustados que los sobrescriban no lo restablecerán. De nuevo, es más una tirita y luego una forma adecuada de hacerlo, pero al menos podrías quitar la parte manual. – DarrenMB

Cuestiones relacionadas