2015-03-15 2 views
5

Я генерация/построение из кода пользовательского .Net управляемого файл ресурсов (а .resx файл)Файл слияния ResX во время выполнения?

В C# или VB.Net, как я мог бы разработать метод, способный объединить, присоединяться или вставлять мой файл .resx в сборку .net (более или менее точно так же, как по умолчанию компилятор VS)?

Так, в одной руке у меня есть application.exe (уже скомпилированные), а в другой руке у меня есть Resources.resx, мое намерение состоит в том, чтобы «слить» в Resx в скомпилированной сборки.

Любая информация будет благодарна, потому что я ничего не нашел об этом.

PS: Единственное обязательное условие не используется сторонние инструменты, такие как ILMerge.

+1

Не могли бы вы использовать DLL для ресурсов? Его не скомпилировали в EXE, но разрешили бы обновления, не зависящие от EXE – Plutonix

+0

@Plutonix, что вы имеете в виду? Я не понял правильно, если вы спрашиваете меня, могу ли я добавить dll в таблицу resx? то да, если вы спрашиваете меня, могу ли я использовать dll вместо .resx ?: then no, потому что я не буду отбрасывать всю работу, которую я потратил, написание +1000 строк кода для управления файлом .ResX различными способами (вспомогательный класс для добавления/чтения/удаления ресурсов и т. д.). спасибо за комментарий – ElektroStudios

+0

Вот источник, если поможет вам увидеть подход по этой проблеме: http://pastebin.com/qYccnJVh – ElektroStudios

ответ

3

я, наконец, решил через немного другой подход, после того, как я создал файл ResX, что я делаю, это скомпилировать .net сборку во время выполнения и присвоение файла ResX как встроенного ресурса сборки, который должен быть скомпилирован, поэтому результатом является скомпилированная dll dll, которая может быть объединена или что-то, что я хочу, и я могу извлечь файл ResX в любой момент из этой DLL , хороший!.

Если кто-то знает более простой/легкий вариант, чем это, не стесняйтесь отправлять ответ (за помощью или просто для остальных Баунти)

Вот пример кода:

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 

Я ве принимать помощь, чтобы сделать это здесь:

Generating DLL assembly dynamically at run time

Read embedded file from assembly

6

Вы не сможете объединить ресурсы в уже скомпилированный файл без внешних инструментов (ручных или уже существующих). Возможно, поэтому вы не нашли никакой информации об этом. Это possible, чтобы объединить файл вручную, но я бы рекомендовал другой подход.

Если возможно, вы могли бы попробовать generating your resource fileдо того происходит компиляция, например, с помощью text template в Visual Studio. Затем при компиляции обычное поведение будет применено к сгенерированному файлу resx, который будет снят в сборке.

Если генерации файла ресурсов до компиляции не представляется возможным, вам придется использовать внешний инструмент

+0

Спасибо за ответ, вы говорите о внешних инструментах, но я пробовал IlMerge, ILMergeGUI, .Net Shrink и SmartAssembly, ни один из них не работает для слияния resx (они не распознавали такой вид .resx и изменение расширения на .dll не будет работать), то вы говорите, что слияние невозможно, хорошо, и что происходит с присоединением или встраиванием? – ElektroStudios

+1

Слияние подразумевает два скомпилированных элемента (например: code.dll и resources.dll). Если вы посмотрите на ссылку в моем ответе, вы увидите примеры присоединения/внедрения, которые могут помочь вам – samy

+0

спасибо, но я не нашел, как это сделать по ссылке, которую вы предоставили – ElektroStudios

Смежные вопросы