2009-05-17 3 views
19

나는 C# 소스 파일을 동적으로로드하고 플러그인으로 실행하는 응용 프로그램이 있습니다. 디버그 모드에서 메인 애플리케이션을 실행할 때 동적 어셈블리로 디버그 할 수 있습니까? 소스가 원래 프로젝트의 일부가 아니기 때문에 명확하게 중단 점을 설정하는 것은 문제가되지만 코드에 대한 예외를 밟을 수 있어야합니까?코딩 된 컴파일 된 코드에서 디버그/중단하는 방법

이 코드 또는 뭔가에 대한 PDB를 생성하는 코드 꼴을 얻을 수있는 방법이 있습니까?

다음은 동적 합병증에 사용하는 코드입니다.

CSharpCodeProvider codeProvider = new CSharpCodeProvider(new Dictionary<string, string>() { { "CompilerVersion", "v3.5" } }); 
//codeProvider. 
ICodeCompiler icc = codeProvider.CreateCompiler(); 

CompilerParameters parameters = new CompilerParameters(); 
parameters.GenerateExecutable = false; 
parameters.GenerateInMemory = true; 
parameters.CompilerOptions = string.Format("/lib:\"{0}\"", Application.StartupPath); 
parameters.ReferencedAssemblies.Add("System.dll"); 
parameters.ReferencedAssemblies.Add("System.Core.dll"); 


CompilerResults results = icc.CompileAssemblyFromSource(parameters, Source); 
DLL.CreateInstance(t.FullName, false, BindingFlags.Default, null, new object[] { engine }, null, null); 
+0

호기심에서 벗어난 (SystemDiagnostics.Debugger.Break()를 넣으 려한다면 어떻게 될까요?) 코드 어딘가에? 그걸 밟으시겠습니까? – BFree

+0

이 작업이 가능하지만 허용 된 답변의 옵션 만 사용하십시오. –

+0

나는 실수로이 질문을 반복했다. (코드 롬은 내가 찾던 핵심이 아니었다.) http://stackoverflow.com/questions/1593920/debugging-a-generated-net-assembly-from-within-the-application-that-generated-it/1594910#1594910. 인터페이스가 포함 된 솔루션을 추가했습니다. 희망이 도움이 ... – jdehaan

답변

31

다음 옵션을 시도해보십시오

parameters.GenerateInMemory = false; //default 
parameters.TempFiles = new TempFileCollection(Environment.GetEnvironmentVariable("TEMP"), true); 
parameters.IncludeDebugInformation = true; 

나는이 사건에서 확인을 작동하는 경우에 확실하지 않다, 그러나 않는 경우 덤프 있도록, 당신이 조건부 컴파일 지시문이 매개 변수를 둘러싸고 있습니다 생성 된 어셈블리는 디버그 모드에서만 사용할 수 있습니다.

+2

그것은 2.42 년 후이지만, 당신은 선생님, 굉장합니다! – Philip

+0

그것은 문제를 찾기 위해 내 시간을 절약했습니다 :) – superachu

7

answer by @bbmud이 맞지만 하나의 버그 수정이 누락되었습니다. CSharpCodeGenerator (.NET의 클래스 인 IL에 컴파일하는 C# 코드)는 컴파일 된 후 즉시 pdb 파일을 제거하도록 설정되어 있습니다. /debug:pdbonly을 CompilerOptions 문자열에 추가하지 않는 한. 그러나 이렇게하면 IncludeDebugInformation 플래그가 무시되고 컴파일러에서 디버깅하기 어려운 최적화 된 코드를 생성합니다. 이를 피하려면 코드 생성기에 모든 파일을 보관하도록 명시 적으로 알려야합니다.

다음
parameters.GenerateInMemory = false; //default 
parameters.TempFiles = new TempFileCollection(Environment.GetEnvironmentVariable("TEMP"), true); 
parameters.IncludeDebugInformation = true; 
parameters.TempFiles.KeepFiles = true 

이 CSharpCodeGenerator의 코드의 원인의 일부입니다 :

string fileExtension = "pdb"; 
    if ((options.CompilerOptions != null) && (CultureInfo.InvariantCulture.CompareInfo.IndexOf(options.CompilerOptions, "/debug:pdbonly", CompareOptions.IgnoreCase) != -1)) 
    { 
     results.TempFiles.AddExtension(fileExtension, true); 
    } 
    else 
    { 
     results.TempFiles.AddExtension(fileExtension); 
    } 

TempFiles.AddExtension(fileExtension, true)가 PDB 파일을 유지하기 위해 컴파일을 알려줍니다

여기에 전체 조리법이다. else 옵션은 results.TempFiles.AddExtension(fileExtension);으로 pdb를 모든 임시 파일로 취급하도록 지시합니다.이 임시 파일은 기본적으로 삭제합니다.

+0

'KeepFiles "라는 이름의'TempFileCollection'의 두 번째 인수는 이미'KeepFiles' 속성을 true로 설정합니다. (적어도 .NET 4.0에서는 그렇게합니다) –