2011-12-26 15 views
14

Scenario: Voglio creare assembly satellite che sono assembly di risorse. Questo assembly ha solo risorse compilate (ResourceWriter). L'obiettivo è quello di creare gruppi di risorse al di fuori di VS e aggiungerli alla domanda e questo nel mio C# applicazioneCostruire assembly di risorse con AssemblyBuilder

Atm sto usando AssemblyBuilder per creare l'assembly. Funziona ma non ci sono informazioni sull'assembly memorizzato. Nessuna cultura, chiave o altro. L'app non viene presa dall'app con un'eccezione di risorsa Manfifest mancante. :(

Se possibile voglio stare con AssemblyBuilder o utilizzando CodeDomProvider

Domanda:. Ciò che è necessario essere in grado di aggiungere nuovo gruppo satellitare per la mia app E 'sufficiente avere una cartella con il? la cultura (en-US) e un assieme con le risorse it-it in là

Question2:? e 'possibile dare qualche meta informazioni come versione, cultura all'assemblea

? Domanda3: è sufficiente aggiungere le risorse all'assembly?

Codice:

AssemblyBuilder builder = AppDomain.CurrentDomain.DefineDynamicAssembly(
         assemblyName, AssemblyBuilderAccess.RunAndSave, resourceFolder); 

builder.AddResourceFile(name, assemblyFileName); 
builder.Save(assemblyName.Name); 

Per qualsiasi tipo di aiuto sarei grato. Grazie in anticipo

risposta

4

trovato la soluzione.

Fonte: http://www.dotnet247.com/247reference/msgs/58/290731.aspx

Spiegazione: In primo luogo sembra che l'AssemblyBuilder collegare solo la risorsa al gruppo, la sua non è incorporato. In secondo luogo, la risorsa deve essere in Modulo per essere visto dall'assemblea principale. (non mi piace qui crea la risorsa all'interno del modulo, ma sembra che ci sia alcun modo per incorporato risorsa già esistente)

Codice:

 string myAsmName = "WriteSatelliteAssembly.resources"; 
     string myAsmFileName = myAsmName + ".dll"; 
     string resourceName = "WriteSatelliteAssembly.MyResource2.fr.resources"; 
     string path; 

     path = AppDomain.CurrentDomain.BaseDirectory + "fr-FR"; 
     AppDomain appDomain = Thread.GetDomain(); 
     AssemblyName asmName = new AssemblyName(); 
     asmName.Name = myAsmName; 
     asmName.CodeBase = path; 
     asmName.CultureInfo = new CultureInfo("fr"); 

     AssemblyBuilder myAsmBuilder = appDomain.DefineDynamicAssembly(
      asmName, 
      AssemblyBuilderAccess.RunAndSave, path); 

     **ModuleBuilder** myModuleBuilder = 
      myAsmBuilder.DefineDynamicModule(myAsmFileName, 
      myAsmFileName); 
     **IResourceWriter** rw = 
      myModuleBuilder.DefineResource(resourceName, 
      "My Description",ResourceAttributes.Public); 

     rw.AddResource("resName","My (dynamic) resource value."); 
     rw.AddResource("resName2","My (dynamic) second resource value."); 

     myAsmBuilder.Save(myAsmFileName); 

shortend Dimostrazione:

risorsa collegata in assemblaggio

.file nometadata 'TestProjectResourceManager.Properties.Resources.en-US.resources' 
    .hash = (57 DD 82 37 9E B3 BA 8A 27 D0 69 90 37 67 22 23 // W..7....'.i.7g"# 
      A0 1C F7 47)          // ...G 
.mresource public TestProjectResourceManager.Properties.Resources 
{ 
    .file 'TestProjectResourceManager.Properties.Resources.en-US.resources' at 0x00000000 
} 

incorporato risorsa in assemblea

.mresource public 'TestProjectResourceManager.Properties.Resources.en-US.resources' 
{ 
    // Offset: 0x00000000 Length: 0x000000EE 
} 
.module TestProjectResourceManager_2.resources.dll 

Buon divertimento

+0

Lo controllerò nel tempo libero, hai aumentato i tuoi sforzi per condividere;) –

+0

Inoltre puoi accettare la tua risposta anche se pensi che questo sia ciò che stavi veramente cercando. –

2

Per creare gli assiemi sono necessari i seguenti strumenti.

  1. Resgen.exe
  2. Al.exe
  3. ildasm.exe

Al.exe è il programma che incorpora le risorse in un assembly satellite. Ma al.exe accetterà solo risorse in formato binario .resources. Ma i nostri input sono in genere file di risorse di solo testo o file di risorse basati su XML in formato .resx. resgen.exe viene utilizzato per convertire queste forme alternative di risorse nel formato binario .resources palatable in al.exe.

ildasm.exe: se si ricorda che cosa fa l'IDE di Visual Studio, si noterà che esiste una traduzione del nome tra la struttura della directory del file di risorse e il modo in cui tale file di risorse è noto all'interno dell'assieme. Becaue utilizza l'IDE di Visual Studio per generare le risorse predefinite e il processo di estenalizzazione per generare gli assembly satellite, entrambi i meccanismi devono produrre assembly con lo stesso tipo di gerarchia di denominazione per i file di risorse.

Quindi usiamo ildasm per esaminare le DLL generate da Visual Studio IDE per scoprire quale sia la struttura e utilizzare lo stesso meccanismo per generare gli assembly satellite. Puoi anche esaminare gli assembly satellite usando ildasm per assicurarti di avere i nomi giusti. Ciò sarà utile per il debug degli errori dal gestore delle risorse che ti dice che non è in grado di localizzare una risorsa.

Ora che gli strumenti sono delineati, come si converte un file di risorse esterne in un assieme satellite? Come indicato di seguito, questo è un processo a tre (davvero, due) passaggi.

Fase 0: Impostare i percorsi per resgen e Al.exe:

@set path=%path%; 
    "C:\Program Files\Microsoft Visual Studio .NET\FrameworkSDK\Bin"; 
    c:\winnt\microsoft.NET\framework\v1.0.3705 

Fase 1: Usare resgen per creare un file resources da un file .resx.

Resgen MyText.resx 

Il comando precedente creerà un file chiamato:

MyText.resources 

Fase 2: Utilizzare Al.exe per creare l'assembly satellite:

Al.exe 
    /t:lib 
    /embed:MyText.en-gb.Resources,MyApplication.MyText.en-gb.Resources 
    /culture:hi-gb 
    /out:MyApplication.resources.dll 

ci sono un paio di cose vale la pena notando qui:

/t:lib: Says you are interested in a .dll. 

/embed:MyText.en-gb.Resources,MyApplication.MyText.en-gb.Resources : Embeds and renames the resource to a target name to match the Visual Studio IDE naming structure. 

/culture:hi-gb : Identifies the culture in which you are interested. 

/out:MyApplication.resources.dll : Name of the DLL in which you are interested. 

Il file .dll generato deve avere quella convenzione di denominazione per .NET per trovarlo. Si noti inoltre che è necessario specificare l'impostazione cultura, anche se la cultura è disponibile nel nome dei file di risorse. Quindi deve essere menzionato in entrambi i posti.

Collocare il gruppo satellite nel appropriato Directory Una volta creato l'assembly satellite, fisicamente copiare il dll alla directory seguente:

\MyApplication\bin\en-gb\MyApplication.Resources.DLL 

In caso di più file di risorse:

\MyApplication\resources\files\CommonResources.resx 
\MyApplication\resources\files\Module1Resources.resx 
\MyApplication\resources\files\Module2Resources.resx 

E è possibile definire le chiavi per queste risorse in una gerarchia separata, come segue:

\MyApplication\resources\keys\CommonKeys.cs 
\MyApplication\resources\keysModule1Keys.cs 
\MyApplication\resources\keys\Module2Keys.cs 

Per uno script programma batch, si prega di fare riferimento al mio blog http://samithenerd.blogspot.com/2011/12/batch-program-for-creating-satellite.html

+0

boah thx u molto studierò ur risposta, ma ad essere sinceri io voglio farlo nel mio programma (codice) – Orri

+0

Ok, fammi vedere ad esso e ritorno. – CodeMad

+0

Ho trovato la ** fonte ** dei tuoi annunci an co. http://ondotnet.com/pub/a/dotnet/2002/10/14/local2.htm?page=1 – Orri