在运行时合并 ResX 文件?
Merge ResX file at runtime?
我 generating/constructing 编写自定义 .Net 托管资源文件(.resx 文件)
在 C# 或 VB.Net 中,我如何设计一种能够合并、加入或嵌入我的自定义 . resx 文件转换为 .net 程序集(或多或少与 VS 编译器默认执行的方式相同)?
所以,一方面我有一个 Application.exe(已经编译),另一方面我有一个 resources.resx,我的意图是"merge"将resx编译成程序集。
任何类型的信息都将不胜感激,因为我什么也没找到。
PS:唯一的要求是不使用第 3 方工具,例如 ILMerge。
如果没有外部工具(手动工具或现有工具),您将无法将资源合并到已编译的文件中。这可能就是您没有找到任何相关信息的原因。手动合并文件是 possible,但我推荐另一种方法。
如果可能,您可以在 Visual Studio 中尝试 generating your resource file before the compilation occurs, for example by using a text template。然后在编译时,通常的行为将应用于生成的 resx 文件,该文件将在程序集中解除。
如果无法在编译前生成资源文件,则必须使用外部工具
我终于通过一些不同的方法解决了,在我创建 ResX 文件之后我所做的是在运行时编译一个 .net 程序集并将该 ResX 文件分配为要编译的程序集的嵌入资源,所以,结果是一个编译后的 .net dll,可以合并或任何我想要的,我可以随时从那个 dll 中提取 ResX 文件,太棒了!
如果有人知道 simpler/easier 替代方案,请随时 post 回答(寻求帮助或只为剩余的赏金)
示例代码如下:
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
我 generating/constructing 编写自定义 .Net 托管资源文件(.resx 文件)
在 C# 或 VB.Net 中,我如何设计一种能够合并、加入或嵌入我的自定义 . resx 文件转换为 .net 程序集(或多或少与 VS 编译器默认执行的方式相同)?
所以,一方面我有一个 Application.exe(已经编译),另一方面我有一个 resources.resx,我的意图是"merge"将resx编译成程序集。
任何类型的信息都将不胜感激,因为我什么也没找到。
PS:唯一的要求是不使用第 3 方工具,例如 ILMerge。
如果没有外部工具(手动工具或现有工具),您将无法将资源合并到已编译的文件中。这可能就是您没有找到任何相关信息的原因。手动合并文件是 possible,但我推荐另一种方法。
如果可能,您可以在 Visual Studio 中尝试 generating your resource file before the compilation occurs, for example by using a text template。然后在编译时,通常的行为将应用于生成的 resx 文件,该文件将在程序集中解除。
如果无法在编译前生成资源文件,则必须使用外部工具
我终于通过一些不同的方法解决了,在我创建 ResX 文件之后我所做的是在运行时编译一个 .net 程序集并将该 ResX 文件分配为要编译的程序集的嵌入资源,所以,结果是一个编译后的 .net dll,可以合并或任何我想要的,我可以随时从那个 dll 中提取 ResX 文件,太棒了!
如果有人知道 simpler/easier 替代方案,请随时 post 回答(寻求帮助或只为剩余的赏金)
示例代码如下:
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