2012-05-02 8 views
16

나는 CodeDom.Compiler 사용 source.cs 파일에서 다른 프로그램을 컴파일하고 난 사용하여 컴파일시에 어떤 자원 (EXE 및 DLL 파일)을 포함 : 컴파일 된 파일에서 임베디드 리소스를 디스크에 쓰지 않고 바이트 배열로 읽는 방법? 내 응용 프로그램에서

// .... 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 

, 내가 읽을 필요 임베디드 리소스를 바이트 배열로 반환합니다. 지금은 아래의 기능과 사용을 사용하여 디스크에 자원을 추출하여 해당하고 있어요

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

나는이 기능을 사용하여 디스크에 두 개의 파일을 압축 해제 한 후이 작업을 수행 :

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(); 
} 

을 어떻게 할 수 하드 디스크에 아무 것도 쓰지 않고 동일한 작업을 수행하십시오 (임베디드 리소스를 바이트 배열로 가져 오기)?

답변

23

실제로 바이트 배열로 스트림을 읽는 중입니다. 그저 멈추지 않는 이유는 무엇입니까?

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; 
    } 
} 

편집 : 선호하는 독서 패턴에 대한 의견을 참조하십시오.

+1

바이트 배열로 스트림을 이미 읽었을 때 메모리 응답이 필요하지 않습니다. 내 대답이 업데이트되었습니다. – Rotem

+2

'Stream.Read()'가'Read()'의 모든 데이터를 반환하지 않을 수 있기 때문에 이것은 올바르게 작동하지 않을 수 있습니다. 나는이 특정'Stream'이 어떻게 동작하는지 모르겠지만 안전한면에'MemoryStream','CopyTo()'를 사용하고 ToArray()를 사용합니다. – svick

+0

@svick : 네 말이 맞아. 또는이 페이지의 예제에 설명 된 읽기 패턴을 사용할 수도 있습니다. http://msdn.microsoft.com/en-us/library/system.io.stream.read.aspx – Rotem