Browse Source
git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@6112 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61pull/1/head
4 changed files with 98 additions and 8 deletions
@ -0,0 +1,90 @@ |
|||||||
|
// <file>
|
||||||
|
// <copyright see="prj:///doc/copyright.txt"/>
|
||||||
|
// <license see="prj:///doc/license.txt"/>
|
||||||
|
// <owner name="David Srbecký" email="dsrbecky@gmail.com"/>
|
||||||
|
// <version>$Revision$</version>
|
||||||
|
// </file>
|
||||||
|
|
||||||
|
using System; |
||||||
|
using System.Diagnostics; |
||||||
|
using System.Diagnostics.SymbolStore; |
||||||
|
using System.IO; |
||||||
|
using System.Reflection; |
||||||
|
using System.Reflection.Emit; |
||||||
|
|
||||||
|
namespace Debugger.Tests |
||||||
|
{ |
||||||
|
public class DynamicCode |
||||||
|
{ |
||||||
|
public static void Main() |
||||||
|
{ |
||||||
|
AssemblyName assemblyName = new AssemblyName(); |
||||||
|
assemblyName.Name = "DynamicllyGeneratedAssembly"; |
||||||
|
AssemblyBuilder assemblyBuilder = System.Threading.Thread.GetDomain().DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave); |
||||||
|
|
||||||
|
ConstructorInfo daCtor = typeof(DebuggableAttribute).GetConstructor(new Type[] { typeof(DebuggableAttribute.DebuggingModes) }); |
||||||
|
CustomAttributeBuilder daBuilder = new CustomAttributeBuilder(daCtor, new object[] { DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.Default }); |
||||||
|
assemblyBuilder.SetCustomAttribute(daBuilder); |
||||||
|
|
||||||
|
ModuleBuilder module = assemblyBuilder.DefineDynamicModule("DynamicllyGeneratedModule.exe", true); |
||||||
|
|
||||||
|
ISymbolDocumentWriter doc = module.DefineDocument(@"Source.txt", Guid.Empty, Guid.Empty, Guid.Empty); |
||||||
|
TypeBuilder typeBuilder = module.DefineType("DynamicllyGeneratedType", TypeAttributes.Public | TypeAttributes.Class); |
||||||
|
MethodBuilder methodbuilder = typeBuilder.DefineMethod("Main", MethodAttributes.HideBySig | MethodAttributes.Static | MethodAttributes.Public, typeof(void), new Type[] { typeof(string[]) }); |
||||||
|
ILGenerator ilGenerator = methodbuilder.GetILGenerator(); |
||||||
|
|
||||||
|
ilGenerator.MarkSequencePoint(doc, 1, 1, 1, 100); |
||||||
|
ilGenerator.Emit(OpCodes.Ldstr, "Hello world!"); |
||||||
|
MethodInfo infoWriteLine = typeof(System.Console).GetMethod("WriteLine", new Type[] { typeof(string) }); |
||||||
|
ilGenerator.EmitCall(OpCodes.Call, infoWriteLine, null); |
||||||
|
|
||||||
|
ilGenerator.MarkSequencePoint(doc, 2, 1, 2, 100); |
||||||
|
ilGenerator.Emit(OpCodes.Ret); |
||||||
|
|
||||||
|
Type helloWorldType = typeBuilder.CreateType(); |
||||||
|
|
||||||
|
System.Diagnostics.Debugger.Break(); |
||||||
|
helloWorldType.GetMethod("Main").Invoke(null, new string[] { null }); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
#if TEST_CODE
|
||||||
|
namespace Debugger.Tests { |
||||||
|
using NUnit.Framework; |
||||||
|
|
||||||
|
public partial class DebuggerTests |
||||||
|
{ |
||||||
|
[NUnit.Framework.Test] |
||||||
|
public void DynamicCode() |
||||||
|
{ |
||||||
|
StartTest(); |
||||||
|
|
||||||
|
process.SelectedStackFrame.StepOver(); |
||||||
|
process.SelectedStackFrame.StepInto(); |
||||||
|
Assert.AreEqual("Source.txt", process.SelectedStackFrame.NextStatement.Filename); |
||||||
|
|
||||||
|
EndTest(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
#endif
|
||||||
|
|
||||||
|
#if EXPECTED_OUTPUT
|
||||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||||
|
<DebuggerTests> |
||||||
|
<Test |
||||||
|
name="DynamicCode.cs"> |
||||||
|
<ProcessStarted /> |
||||||
|
<ModuleLoaded>mscorlib.dll (No symbols)</ModuleLoaded> |
||||||
|
<ModuleLoaded>DynamicCode.exe (Has symbols)</ModuleLoaded> |
||||||
|
<ModuleLoaded>DynamicllyGeneratedAssembly (No symbols)</ModuleLoaded> |
||||||
|
<ModuleLoaded>ISymWrapper.dll (No symbols)</ModuleLoaded> |
||||||
|
<ModuleLoaded>System.dll (No symbols)</ModuleLoaded> |
||||||
|
<DebuggingPaused>Break DynamicCode.cs:46,4-46,40</DebuggingPaused> |
||||||
|
<DebuggingPaused>StepComplete DynamicCode.cs:47,4-47,73</DebuggingPaused> |
||||||
|
<DebuggingPaused>StepComplete Source.txt:1,1-1,100</DebuggingPaused> |
||||||
|
<ProcessExited /> |
||||||
|
</Test> |
||||||
|
</DebuggerTests> |
||||||
|
#endif // EXPECTED_OUTPUT
|
Loading…
Reference in new issue