在运行时合并ResX文件?

时间:2015-03-15 23:52:56

标签: c# vb.net winforms visual-studio resx

我从代码生成/构建自定义.Net托管资源文件( .resx 文件)

C# VB.Net 中,我如何设计一个能够将自定义.resx文件合并,加入或嵌入到.net程序集中的方法(更多或与VS编译器默认情况下的方式相同?)

所以,一方面我有 Application.exe (已编译),另一方面我有一个 resources.resx ,我的意图是& #34;合并"将resx转换为已编译的程序集。

任何形式的信息都会感激不尽,因为我对此一无所知。

PS:唯一的必要条件是不使用第三方工具,例如 ILMerge

2 个答案:

答案 0 :(得分:6)

如果没有外部工具(手动或已经存在),您将无法将资源合并到已编译的文件中。这可能就是为什么你没有找到任何关于它的信息。 <{3}}手动合并文件,但我建议采用另一种方法。

如果可能,您可以在编译之前尝试possible ,例如在Visual Studio中使用generating your resource file。然后,在编译时,通常的行为将应用于生成的resx文件,该文件将在程序集中解除。

如果无法在编译之前生成资源文件,则必须使用外部工具

答案 1 :(得分:3)

我最后通过一个不同的方法解决了,在我创建ResX文件后,我所做的是在运行时编译.net程序集并将该ResX文件作为要编译的程序集的嵌入资源,因此,结果是一个编译好的.net dll,可以合并或者我想要的任何东西,我可以随时从该dll中提取ResX文件,很好!

如果有人知道比这更简单/更容易的替代方案,请随时发布答案(寻求帮助或只留下剩余的赏金)

以下是示例代码:

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