2015-03-15 1 views
5

Je génération/construire à partir du code d'un fichier de ressources géré sur mesure .Net (un .resx fichier)Fusionner le fichier ResX lors de l'exécution?

Dans C# ou VB.Net, comment je pourrais concevoir une méthode capable de fusionner, joindre ou incorporé mon fichier .resx personnalisé dans un assembly .net (plus ou moins de la même manière que le compilateur VS par défaut)?

Ainsi, d'une part j'ai une Application.exe (déjà compilé), et d'autre part, j'ai un Resources.resx, mon intention est de « fusionner » le resx dans l'ensemble compilé.

Toutes sortes d'informations seront reconnaissantes, car je n'ai rien trouvé à ce sujet. PS: La seule exigence est d'utiliser des outils tiers tels que ILMerge.

+1

Pourriez-vous utiliser une DLL pour les ressources? Ce n'est pas compilé dans le fichier EXE mais permettrait des mises à jour indépendantes de l'EXE – Plutonix

+0

@Plutonix ce que tu veux dire? Je n'ai pas bien compris, Si vous me demandez si je peux ajouter un DLL dans la table resx? alors oui, si vous me demandez si je peux utiliser un dll au lieu d'un .resx ?: alors non parce que je ne vais pas jeter tout le travail que j'ai passé à écrire +1,000 lignes de code pour gérer un fichier .ResX de différentes façons (une classe d'aide pour ajouter/lire/supprimer des ressources et ce genre de choses). merci pour le commentaire – ElektroStudios

+0

Voici la source si vous aide à voir une approche sur ce problème: http://pastebin.com/qYccnJVh – ElektroStudios

Répondre

3

J'ai finalement résolu par une approche un peu différente, après avoir créé le fichier ResX ce que je fais est de compiler un .net assembly à l'exécution et asigning ce fichier ResX comme une ressource incorporée de l'assembly à compiler, donc, le résultat est une DLL .net compilée qui peut être fusionnée ou ce que je veux et je peux extraire le fichier ResX à tout moment à partir de cette DLL , agréable!.

Si quelqu'un connaît un simple/alternative plus facile que cela, ne hésitez pas à poster une réponse (de l'aide ou juste pour la prime restant)

Voici l'exemple de code:

Imports System.CodeDom.Compiler 
Imports System.IO 
Imports System.Reflection 

Public Class Form1 

Private Sub Test() Handles MyBase.Shown 

    ' Create the ResX file. 
    Dim resX As New ResXManager(Path.Combine(Application.StartupPath, "C:\MyResources.resx")) 
    With resX 
     .Create(replace:=True) 
     .AddResource(Of String)("String Resource", "Hello World!", "String Comment") 
    End With 

    ' Compile an assembly.dll that contains the ResX file as an embedded resource. 
    Dim codeProvider As CodeDomProvider = CodeDomProvider.CreateProvider("VB") ' or New VBCodeProvider() 
    Dim parameters As CompilerParameters = New CompilerParameters() 
    With parameters 
     .GenerateExecutable = False 
     .OutputAssembly = "C:\Assembly.dll" 
     .EmbeddedResources.Add("C:\MyResources.resx") 
    End With 
    Dim results As CompilerResults = codeProvider.CompileAssemblyFromSource(parameters, "Public class ResourceClass : End Class") 

    ' Read the assembly. 
    Dim assembly As Assembly = assembly.LoadFile("c:\Assembly.dll") 

    ' Extract/read the ResX file from assembly. 
    Dim embeddedFileName As String = "MyResources.resx" 
    Dim targetFilePath As String = "C:\NewMyResources.resx" 
    Using s As Stream = assembly.GetManifestResourceStream(embeddedFileName) 
     Dim buffer As Byte() = New Byte(CInt(s.Length - 1)) {} 
     Dim read As Integer = s.Read(buffer, 0, CInt(s.Length)) 
     Using fs As New FileStream(targetFilePath, FileMode.Create) 
      fs.Write(buffer, 0, buffer.Length) 
     End Using 
    End Using 

End Sub 

End Class 

Je ai pris un peu d'aide pour ce faire d'ici:

Generating DLL assembly dynamically at run time

Read embedded file from assembly

6

Vous ne pourrez pas fusionner des ressources dans un fichier déjà compilé sans outils externes (roulés à la main ou déjà existants). C'est peut-être pourquoi vous n'avez trouvé aucune information à ce sujet. Il est possible de fusionner le fichier à la main, mais je recommanderais une autre approche.

Si possible, vous pouvez essayer generating your resource fileavant la compilation se produit, par exemple en utilisant un text template dans Visual Studio. Ensuite, lors de la compilation, le comportement habituel serait appliqué au fichier resx généré qui serait levé dans l'assemblage.

Si la génération du fichier de ressources avant la compilation n'est pas possible, vous devez utiliser un outil externe

+0

Merci pour la réponse, vous parlez d'outils externes, mais j'ai essayé IlMerge, ILMergeGUI, .Net Shrink et SmartAssembly, aucun d'entre eux fonctionne pour fusionner un resx (ils ne reconnaissaient pas ce genre de fichier .resx, et en changeant l'extension en .dll ne fonctionnera pas), alors vous dites que la fusion n'est pas possible, bien, et que se passe-t-il à propos de la jointure ou de l'incorporation? – ElektroStudios

+1

La fusion implique deux éléments compilés (par exemple: code.dll et resources.dll). Si vous jetez un coup d'oeil sur le lien dans ma réponse, vous devriez voir des exemples de joindre/incorporer qui peuvent vous aider – samy

+0

merci mais je n'ai pas trouvé comment le faire via le lien que vous avez fourni – ElektroStudios