2015-03-15 14 views
5

Ich Erzeugung/von Code Konstruktion eines benutzerdefinierten verwalteten .Net-Ressource-Datei (eine .resx Datei)ResX-Datei zur Laufzeit zusammenführen?

In C# oder VB.Net, wie ich in der Lage zu verschmelzen, um eine Methode entwickeln könnte, Join oder eingebettet meine benutzerdefinierte RESX-Datei in eine. NET-Assembly (mehr oder weniger in der gleichen Weise wie VS Compiler standardmäßig)?

in einer Hand So habe ich ein Application.exe (bereits kompiliert), und in der anderen Hand habe ich eine Resources.resx, meine Absicht ist es, die resx in die kompilierte Assembly zu "verschmelzen".

Jede Art von Informationen wird dankbar sein, weil ich nichts darüber gefunden habe.

PS: Die einzige Voraussetzung ist nicht die Verwendung von Drittanbieter-Tools wie ILMerge.

+1

Können Sie nicht eine DLL für die Ressourcen verwenden? Es ist nicht in die EXE kompiliert, sondern würde Updates unabhängig von der EXE ermöglichen – Plutonix

+0

@Plutonix was meinst du? Ich habe es nicht richtig verstanden. Wenn du mich fragst, ob ich eine DLL in den ResX-Tisch einfügen kann? dann ja, wenn Sie mich fragen, ob ich eine dll anstelle einer .resx verwenden kann? dann nein, weil ich nicht die gesamte Arbeit verwerfe, die ich geschrieben habe, um mehrere tausend Zeilen Code zu verwalten, um eine .ResX-Datei zu verwalten (eine Hilfsklasse zum Hinzufügen/Lesen/Löschen von Ressourcen und dieser Art von Dingen). Danke für den Kommentar – ElektroStudios

+0

Hier ist die Quelle, wenn Sie einen Ansatz zu diesem Thema sehen können: http://pastebin.com/qYccnJVh – ElektroStudios

Antwort

3

ich endlich gelöst durch ein wenig anderen Ansatz verwenden müssen, nachdem ich die ResX Datei erstellt, was ich tun kompilieren ist eine .net Assembly zur Laufzeit und Zuweisung dieser ResX-Datei als eingebettete Ressource der Assembly, die kompiliert werden soll, so ist das Ergebnis eine kompilierte .net-DLL, die zusammengeführt werden kann oder was auch immer ich will und ich kann die ResX-Datei jederzeit aus dieser DLL extrahieren , nett!.

Wenn jemand eine einfachere/einfachere Alternative als das weiß, fühlen sich frei, eine Antwort (um Hilfe oder einfach nur für die restliche Prämie) zu schreiben

Hier ist der Beispielcode:

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 

I‘ habe etwas Hilfe genommen, dies zu tun von hier:

Generating DLL assembly dynamically at run time

Read embedded file from assembly

6

Sie können keine Ressourcen in eine bereits kompilierte Datei ohne externe Tools zusammenführen (entweder handgerollt oder bereits vorhanden). Vielleicht haben Sie deshalb keine Informationen darüber gefunden. Es ist possible, um die Datei von Hand zusammenzuführen, aber ich würde einen anderen Ansatz empfehlen.

Wenn möglich, könnten Sie versuchen generating your resource filevor die Kompilierung erfolgt, beispielsweise durch ein text template in Visual Studio. Dann würde beim Kompilieren das übliche Verhalten auf die generierte Resx-Datei angewendet, die in der Assembly aufgehoben würde.

Wenn die Erzeugung der Ressourcendatei vor der Kompilierung nicht möglich ist, werden Sie ein externes Tool

+0

Danke für die Antwort, Sie sprechen über externe Tools, aber ich habe versucht, IlMerge, ILMergeGUI, .Net Shrink und SmartAssembly, keiner von ihnen funktioniert, um ein Resx (sie nicht diese Art von zu erkennen .resx-Datei, und die Erweiterung zu .dll wird nicht funktionieren), dann sagen Sie, Merge ist nicht möglich, welll, und was passiert mit Beitritt oder Einbettung? – ElektroStudios

+1

Das Zusammenführen impliziert zwei kompilierte Elemente (zB: code.dll und resources.dll). Wenn Sie sich den Link in meiner Antwort ansehen, sollten Sie Beispiele für Join/Embedding sehen, die Ihnen helfen können. – samy

+0

danke, aber ich habe nicht gefunden, wie es über den von Ihnen bereitgestellten Link funktioniert – ElektroStudios