실제 파일에 의존하기 때문에 .NET Framework 기본 기능을 사용하여이 작업을 수행 할 수 있다고 생각하지 않습니다. 그러나 Mono Cecil 라이브러리를 사용하는 솔루션에는 심볼 판독기의 파일 경로 대신 입력 스트림을 사용하는 오버로드가 있으므로이 솔루션이 있습니다.
using System;
using System.IO;
using Mono.Cecil;
using Mono.Cecil.Cil;
using Mono.Cecil.Pdb;
namespace TestPdb
{
class Program
{
static void Main(string[] args)
{
// we use a Stream for the assembly
AssemblyDefinition asm;
using (FileStream asmStream = new FileStream("testpdb.exe", FileMode.Open, FileAccess.Read, FileShare.Read))
{
asm = AssemblyDefinition.ReadAssembly(asmStream);
}
// we use a Stream for the PDB
using (FileStream symbolStream = new FileStream("testpdb.pdb", FileMode.Open, FileAccess.Read, FileShare.Read))
{
asm.MainModule.ReadSymbols(new PdbReaderProvider().GetSymbolReader(asm.MainModule, symbolStream));
}
TypeDefinition type = asm.MainModule.GetType("TestPdb.Program");
foreach (MethodDefinition method in type.Methods)
{
Console.WriteLine("Method:" + method.Name);
foreach (Instruction ins in method.Body.Instructions)
{
Console.WriteLine(" " + ins);
if (ins.SequencePoint != null)
{
Console.WriteLine(" Url:" + ins.SequencePoint.Document.Url);
// see http://blogs.msdn.com/b/jmstall/archive/2005/06/19/feefee-sequencepoints.aspx
if (ins.SequencePoint.StartLine != 0xFEEFEE)
{
Console.WriteLine(" StartLine:" + ins.SequencePoint.StartLine + " StartColumn:" + ins.SequencePoint.StartColumn);
Console.WriteLine(" EndLine:" + ins.SequencePoint.EndLine + " EndColumn:" + ins.SequencePoint.EndColumn);
}
// etc...
}
}
}
}
}
}
참고 : 여기에
은 PDB 정보를 포함, 콘솔에의 IL 코드를 덤프 "TestPdb"라는 이름의 콘솔 응용 프로그램의 예입니다 만 PDB의에서 읽을 필요가 있기 때문에, 당신은 다시 컴파일 일부 바이트를 저장하기 위해 READ_ONLY 조건부 기호를 정의하는 Cecil 라이브러리 .DLL 버전을 사용할 필요없이 어셈블리에 Cecil 소스 코드를 직접 포함시킬 수도 있습니다.
OpenScope을 호출하기 전에 자원을 디스크의 실제 파일로 출력 할 수 없습니까 (캐시 메커니즘이 있으므로 다음에 빠릅니다). –
@ Simon 답장을 보내 주셔서 감사합니다. 예, 저와 제 동료는 어셈블리와 pdb 파일을 주 어셈블리에 포함시키는 아이디어에 대해 논의했습니다. 그 후 우리는 필요할 때이 파일들의 복사본을 디스크에 저장할 수 있습니다. 그러나 우리는이 해결책이 조금 이상하다는 것에 동의했습니다. 또한 코드를 통해 독자가 왜 그렇게하는지 설명하기가 어려울 것입니다. 그래서 여기에 내 질문을 게시했습니다. –