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();
}
을 어떻게 할 수 하드 디스크에 아무 것도 쓰지 않고 동일한 작업을 수행하십시오 (임베디드 리소스를 바이트 배열로 가져 오기)?
바이트 배열로 스트림을 이미 읽었을 때 메모리 응답이 필요하지 않습니다. 내 대답이 업데이트되었습니다. – Rotem
'Stream.Read()'가'Read()'의 모든 데이터를 반환하지 않을 수 있기 때문에 이것은 올바르게 작동하지 않을 수 있습니다. 나는이 특정'Stream'이 어떻게 동작하는지 모르겠지만 안전한면에'MemoryStream','CopyTo()'를 사용하고 ToArray()를 사용합니다. – svick
@svick : 네 말이 맞아. 또는이 페이지의 예제에 설명 된 읽기 패턴을 사용할 수도 있습니다. http://msdn.microsoft.com/en-us/library/system.io.stream.read.aspx – Rotem