2012-05-02 31 views
16

Trong ứng dụng của tôi, tôi biên soạn một chương trình khác từ tập tin source.cs sử dụng CodeDom.Compiler và tôi nhúng một số tài nguyên (exe và các tập tin dll) tại thời gian biên dịch sử dụng:Làm thế nào để đọc một tài nguyên nhúng dưới dạng mảng byte mà không cần ghi nó vào đĩa?

// .... rest of code 

if (provider.Supports(GeneratorSupport.Resources)) 
{ 
    cp.EmbeddedResources.Add("MyFile.exe"); 
} 
if (provider.Supports(GeneratorSupport.Resources)) 
{ 
    cp.EmbeddedResources.Add("New.dll"); 
} 
// ....rest of code 

Trong tập tin biên soạn, tôi cần phải đọc tài nguyên được nhúng dưới dạng mảng byte. Bây giờ tôi đang làm điều đó bằng cách chiết xuất các nguồn lực vào đĩa bằng cách sử dụng chức năng dưới đây và việc sử dụng

File.ReadAllBytes("extractedfile.exe"); 
File.ReadAllBytes("extracteddll.dll"); 

Tôi làm điều này sau khi giải nén hai file vào đĩa sử dụng chức năng này:

public static void ExtractSaveResource(String filename, String location) 
{ 
    // Assembly assembly = Assembly.GetExecutingAssembly(); 
    System.Reflection.Assembly a = System.Reflection.Assembly.GetExecutingAssembly(); 
    // Stream stream = assembly.GetManifestResourceStream("Installer.Properties.mydll.dll"); // or whatever 
    // string my_namespace = a.GetName().Name.ToString(); 
    Stream resFilestream = a.GetManifestResourceStream(filename); 
    if (resFilestream != null) 
    { 
     BinaryReader br = new BinaryReader(resFilestream); 
     FileStream fs = new FileStream(location, FileMode.Create); // say 
     BinaryWriter bw = new BinaryWriter(fs); 
     byte[] ba = new byte[resFilestream.Length]; 
     resFilestream.Read(ba, 0, ba.Length); 
     bw.Write(ba); 
     br.Close(); 
     bw.Close(); 
     resFilestream.Close(); 
    } 
    // this.Close(); 
} 

Làm thế nào tôi có thể làm điều tương tự (Lấy tài nguyên nhúng dưới dạng mảng byte) nhưng không ghi bất kỳ thứ gì vào đĩa cứng?

Trả lời

23

Bạn thực sự đã đọc luồng tới một mảng byte, tại sao không chỉ dừng ở đó?

public static byte[] ExtractResource(String filename) 
{ 
    System.Reflection.Assembly a = System.Reflection.Assembly.GetExecutingAssembly(); 
    using (Stream resFilestream = a.GetManifestResourceStream(filename)) 
    { 
     if (resFilestream == null) return null; 
     byte[] ba = new byte[resFilestream.Length]; 
     resFilestream.Read(ba, 0, ba.Length); 
     return ba; 
    } 
} 

chỉnh sửa: Xem nhận xét cho mẫu đọc thích hợp hơn.

+1

Cập nhật câu trả lời của tôi, không cần dòng bộ nhớ khi bạn đã đọc luồng tới một mảng byte. – Rotem

+2

Điều này có thể không hoạt động chính xác, vì 'Stream.Read()' có thể không trả về tất cả dữ liệu trong một 'Đọc()'. Tôi không chắc chắn về cách mà 'Stream' cụ thể này hoạt động, nhưng ở bên an toàn, tôi sẽ sử dụng' MemoryStream', 'CopyTo()' và sau đó sử dụng 'ToArray()'. – svick

+0

@svick: Bạn nói đúng. Ngoài ra, người ta có thể sử dụng mô hình đọc được mô tả trong ví dụ trên trang này: http://msdn.microsoft.com/en-us/library/system.io.stream.read.aspx – Rotem

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