2009-07-10 28 views
7

Tôi có một bộ sưu tập .NET được biên dịch với một tệp tài nguyên cụ thể được nhúng (có tên 'Script.xml'). Tôi cần phải thay đổi nó theo cách khác.Tài nguyên nhúng theo lập trình trong một hội đồng .NET

Điều này có thể thực hiện mà không cần biên dịch lại từ nguồn không?

Hiện tại, tôi thực hiện tìm kiếm văn bản mà tôi biết có trong tệp và tệp hoạt động tốt. Nhưng tôi cần phải làm điều đó cho một dự án khác mà tôi không biết bất kỳ nội dung nào của tệp tài nguyên và tôi cần phải tìm một phương thức khác.

FileStream exe = new FileStream(currentexe, FileMode.Open); 

//find xml part of exefile 
string find = "<?xml version=\"1.0\"?>"; 
string lastchars = new string(' ', find.Length); 
while (exe.CanRead) { 
    lastchars = lastchars.Substring(1) + (char)exe.ReadByte(); 
    if (lastchars == find) { 
     exe.Seek(-find.Length, SeekOrigin.Current); 
     break; 
    } 
} 

//output serialized script 
int bytenum = 0; 
foreach (byte c in xml) { 
    if (c == 0) break; 
    exe.WriteByte(c); 
    bytenum++; 
} 

//clean out extra data 
while (bytenum++ < ScriptFileSize) { 
    exe.WriteByte(0x20); 
} 
exe.Close(); 

Trả lời

4

Bạn có thể sử dụng Cecil để mở lắp ráp và chèn tài nguyên (tôi làm). YMMV

+1

Nó không phá vỡ PDBs nếu bạn sử dụng Cecil để đọc và tạo lại các PDB một cách chính xác. –

+0

Tôi đã đoán đây là trường hợp, nhưng 1,5 năm trước tôi không thể tìm ra cách để làm điều đó. Bạn có một ví dụ? –

+0

Nó đã hoạt động trở lại rồi. Nhưng ngày nay với các API mới bạn muốn nó được chỉ ra ở đây: https://github.com/jbevain/cecil/wiki/Debug-symbols –

4

cơ chế hiện tại của bạn là rất mong manh - nó sẽ không làm việc cho assembly được ký (như băm sẽ thay đổi) hoặc nếu bạn cần phải thay thế một tài nguyên với một lớn hơn (như tất cả các offsets khác có thể di chuyển) . Nó cũng có vấn đề về mặt mã hóa ký tự và cơ chế chung để tìm đúng điểm trong tệp, nhưng những điều đó tương đối không quan trọng vì tôi không nghĩ cách tiếp cận này là phù hợp để bắt đầu.

Nếu bạn cần tài nguyên có thể thay thế, tôi sẽ đặt chúng vào một tệp khác hoàn toàn, không có định dạng tương đối tinh tế của hội đồng.

+0

Tệp tài nguyên có thể lớn hơn và nó vẫn hoạt động vì nó có thể được đệm bằng dấu cách (tối đa kích thước: 'ScriptFileSize'). Và tiếc là nó cần phải được chứa trong một tập tin duy nhất cho dự án này. –

+0

@Nick: Điều đó có hiệu quả nói rằng nó không thể lớn hơn tài nguyên hiện có, bởi vì tài nguyên hiện tại sẽ luôn là ScriptFileSize. Tôi thực sự, thực sự cố gắng thiết kế lại điều này. Nếu bạn hoàn toàn phải làm điều đó, hãy sử dụng một thư viện mà biết về định dạng tập tin lắp ráp (như Cecil - http://www.mono-project.com/Cecil) nhưng cố gắng tránh làm điều đó nếu có thể. –

+0

@Jon: Đúng, tôi quên đề cập đến việc lắp ráp ban đầu được biên dịch với một tấn padding đã có để phù hợp với const ScriptFileSize. Tôi cung cấp cho nhiều không gian và chưa bao giờ chạy ra khỏi nó và điều này hiện đang chạy trên hàng trăm máy tính thành công. Nhưng tôi thực sự, thực sự muốn thiết kế lại nó, đó là lý do tại sao tôi đăng bài ở đây. –

1

Có thể bạn đang tìm System.Runtime.Emit để tự động biên dịch một hội đồng.

1

Bạn có thể xây dựng động các Hội đồng sử dụng sự phản chiếu, cụ thể là lớp AssemblyBuilder và bao gồm các tài nguyên trong hội đồng được xây dựng động của bạn. Tôi không chắc chắn nó có thể tháo rời một hội đồng hiện có bằng cách sử dụng sự phản chiếu (mặc dù bây giờ tôi quan tâm).

Tôi sẽ sủa cây khác nếu có thể.

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