2015-03-15 25 views
5

Tôi đang tạo/xây dựng từ mã một tùy chỉnh Net quản lý tập tin tài nguyên (một Resx tập tin)Kết hợp tệp ResX khi đang chạy?

Trong C# hoặc VB.Net, làm thế nào tôi có thể thiết kế một phương pháp có khả năng sáp nhập, tham gia hoặc embbed của tôi tùy chỉnh .resx tập tin vào một .net lắp ráp (nhiều hơn hoặc ít hơn trong cùng một cách mà VS trình biên dịch không theo mặc định)?

Vì vậy, trong một bàn tay tôi có một Application.exe (đã được biên soạn), và mặt khác tôi có một resources.resx, mục đích của tôi là để "hợp nhất" các resx vào hội đồng biên soạn.

Bất kỳ loại thông tin nào sẽ được biết ơn, bởi vì tôi không tìm thấy gì về nó.

PS: Điều kiện tiên quyết duy nhất không sử dụng các công cụ của bên thứ 3 như ILMerge.

+1

Bạn không thể sử dụng một DLL cho các tài nguyên? Nó không được biên dịch vào EXE nhưng sẽ cho phép các bản cập nhật độc lập với EXE – Plutonix

+0

@Plutonix ý của bạn là gì? Tôi đã không hiểu đúng, Nếu bạn đang hỏi tôi liệu tôi có thể thêm một dll vào bảng resx? Sau đó, nếu bạn hỏi tôi liệu tôi có thể sử dụng dll thay vì một .resx không ?: thì không vì tôi sẽ không loại bỏ tất cả công việc mà tôi đã bỏ ra 1.000 dòng mã để quản lý tệp .ResX theo nhiều cách khác nhau (một lớp trợ giúp để thêm/đọc/xóa tài nguyên và loại điều đó). cảm ơn cho bình luận – ElektroStudios

+0

Đây là nguồn nếu bạn thấy một cách tiếp cận về vấn đề này: http://pastebin.com/qYccnJVh – ElektroStudios

Trả lời

3

cuối cùng tôi giải quyết thông qua một cách tiếp cận hơi khác, sau khi tôi tạo ra file resx những gì tôi làm là biên dịch một .net lắp ráp tại thời gian chạy và asigning rằng tập tin ResX như một nguồn tài nguyên nhúng của hội đồng được biên dịch, do đó, kết quả là một dll .net biên dịch có thể được sáp nhập hoặc bất cứ điều gì tôi muốn và tôi có thể trích xuất các tập tin ResX bất cứ lúc nào từ dll đó , tốt đẹp!.

Nếu ai đó biết a/thay thế dễ dàng đơn giản hơn thế này, cảm thấy tự do để gửi một câu trả lời (để được giúp đỡ hoặc chỉ cho tiền thưởng còn lại)

Đây là đoạn mã ví dụ:

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 

tôi đã thực hiện một số giúp đỡ để làm điều này từ đây:

Generating DLL assembly dynamically at run time

Read embedded file from assembly

6

Bạn sẽ không thể hợp nhất tài nguyên vào tệp đã được biên dịch mà không có công cụ bên ngoài (được cuộn bằng tay hoặc đã tồn tại). Đó có thể là lý do tại sao bạn không tìm thấy bất kỳ thông tin nào về nó. Đó là possible để hợp nhất tệp bằng tay nhưng tôi muốn giới thiệu một cách tiếp cận khác.

Nếu có thể, bạn có thể thử generating your resource filetrước khi việc biên dịch diễn ra, ví dụ bằng cách sử dụng text template trong Visual Studio. Sau đó, khi biên dịch hành vi thông thường sẽ được áp dụng cho tệp resx được tạo sẽ được dỡ bỏ trong assembly.

Nếu tạo ra các tập tin tài nguyên trước khi biên dịch là không thể, bạn sẽ phải sử dụng một công cụ bên ngoài

+0

Cảm ơn bạn đã trả lời, bạn nói về các công cụ bên ngoài nhưng tôi đã thử IlMerge, ILMergeGUI, .Net Shrink và SmartAssembly, không có công cụ nào hợp nhất resx (chúng không nhận ra loại đó .resx tập tin, và thay đổi phần mở rộng để .dll sẽ không hoạt động), sau đó bạn nói sáp nhập là không thể, welll, và những gì sẽ xảy ra về tham gia hoặc nhúng? – ElektroStudios

+1

Việc hợp nhất ngụ ý hai phần tử biên dịch (ví dụ: code.dll và resources.dll). Nếu bạn nhìn vào liên kết trong câu trả lời của tôi, bạn sẽ thấy các ví dụ về việc tham gia/nhúng có thể giúp bạn – samy

+0

cảm ơn nhưng tôi không tìm thấy cách thực hiện thông qua liên kết mà bạn đã cung cấp – ElektroStudios

Các vấn đề liên quan