public static void CopyProperties <TSource>(TSource Source, object LinqDestination) { Type DestinationType = LinqDestination.GetType(); Type SourceType = typeof(TSource); System.Reflection.FieldInfo[] SourceFields = SourceType.GetFields(); foreach (System.Reflection.FieldInfo SourceField in SourceFields) { //bool DataIgnore = false; object[] attr = SourceField.GetCustomAttributes(typeof(DataIgnoreAttrib), true); if (attr.Length > 0) { continue; //DataIgnore = true; } string DestPropName = SourceField.Name; attr = SourceField.GetCustomAttributes(typeof(DataNameAttrib), true); if (attr.Length > 0) { DestPropName = ((DataNameAttrib)attr[0]).DataName; } System.Reflection.PropertyInfo DestProp = DestinationType.GetProperty(DestPropName); if (DestProp == null) { continue; } //if ((!DestProp.PropertyType.FullName.StartsWith("System.")) && DataIgnore) continue; object v = SourceField.GetValue(Source); if (v != null) { v = Convert.ChangeType(v, DestProp.PropertyType); } DestProp.SetValue(LinqDestination, v, null); } }
protected override void onCreate(Bundle savedInstanceState) { var activity = this; base.onCreate(savedInstanceState); var sv = new ScrollView(this); var ll = new LinearLayout(this); ll.setOrientation(LinearLayout.VERTICAL); sv.addView(ll); var t = typeof(MemoryFile); //var m = Activator.CreateInstance(t); //E/AndroidRuntime( 4217): Caused by: java.lang.InstantiationException: class android.os.MemoryFile has no zero argument constructor //E/AndroidRuntime( 4217): at java.lang.Class.newInstance(Class.java:1641) //E/AndroidRuntime( 4217): at ScriptCoreLibJava.BCLImplementation.System.__Activator.CreateInstance(__Activator.java:27) //E/AndroidRuntime( 4217): ... 14 more //E/AndroidRuntime( 4217): Caused by: java.lang.NoSuchMethodException: <init> [] //E/AndroidRuntime( 4217): at java.lang.Class.getConstructor(Class.java:531) //E/AndroidRuntime( 4217): at java.lang.Class.getDeclaredConstructor(Class.java:510) //E/AndroidRuntime( 4217): at java.lang.Class.newInstance(Class.java:1639) //E/AndroidRuntime( 4217): ... 15 more var m_descriptor = 0; var m_fd = default(java.io.FileDescriptor); var pid = android.os.Process.myPid(); var uid = android.os.Process.myUid(); //try { m = new MemoryFile(default(string), 0); } try { m = new MemoryFile("name1", 0x07); } catch { throw; } try { m.writeBytes( new byte[] { 7, 6, 5, 4, 3, 2, 1 }, 0, 0, 0x07 ); } catch { } var buffer = new byte[0x07]; try { m.readBytes(buffer, 0, 0, 0x07); } catch { } var buffer0 = buffer[0]; //new Button(this).AttachTo(ll).WithText(new { t, m, buffer0 }.ToString()); new Button(this).AttachTo(ll).WithText(new { buffer0 }.ToString()); #region fields var fields = t.GetFields( System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance ); new Button(this).AttachTo(ll).WithText("fields: " + new { fields.Length }.ToString()); fields.WithEach( SourceField => { //E/AndroidRuntime( 9919): Caused by: java.lang.IllegalAccessException: Cannot access field: java.io.FileDescriptor android.os.MemoryFile.mFD //E/AndroidRuntime( 9919): at java.lang.reflect.Field.get(Native Method) //E/AndroidRuntime( 9919): at java.lang.reflect.Field.get(Field.java:279) //E/AndroidRuntime( 9919): at ScriptCoreLibJava.BCLImplementation.System.Reflection.__FieldInfo.GetValue(__FieldInfo.java:46) var value = SourceField.GetValue(m); var xFileDescriptor = value as java.io.FileDescriptor; if (xFileDescriptor != null) { m_fd = xFileDescriptor; var xfields = typeof(java.io.FileDescriptor).GetFields( System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance ); xfields.WithEach( xFileDescriptor_SourceField => { var xvalue = xFileDescriptor_SourceField.GetValue(value); //if (xFileDescriptor_SourceField.FieldType == typeof(int)) if (xFileDescriptor_SourceField.Name == "descriptor") { m_descriptor = (int)xvalue; } new Button(this).AttachTo(ll).WithText(xFileDescriptor_SourceField + new { xvalue }.ToString()); } ); } else { new Button(this).AttachTo(ll).WithText(new { SourceField, value }.ToString()); } } ); #endregion //var pfd = default(android.os.ParcelFileDescriptor); //try //{ // pfd = android.os.ParcelFileDescriptor.dup( // m_fd // ); //} //catch //{ //} new Button(activity).WithText("Next \n " + new { pid, uid //, //pfd = pfd.getFd(), //size = pfd.getStatSize() }).AttachTo(ll).AtClick( delegate { Intent intent = new Intent(activity, typeof(SecondaryActivity).ToClass()); intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); // share scope intent.putExtra("m_descriptor", m_descriptor); intent.putExtra("pid", pid); //intent.putExtra("pfd", pfd); //intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); try { Console.WriteLine("new LocalServerSocket"); var ss = new LocalServerSocket("MemoryFileDescriptor0"); // cached backgroun process? // switching to another process.. easy... activity.startActivity(intent); Console.WriteLine("before LocalServerSocket accept"); // http://alvinalexander.com/java/jwarehouse/android/core/tests/coretests/src/android/net/LocalSocketTest.java.shtml var ls = ss.accept(); Console.WriteLine("after LocalServerSocket accept"); ls.setFileDescriptorsForSend(new[] { m_fd }); ls.getOutputStream().write(42); } catch { throw; } } ); this.setContentView(sv); // https://developer.android.com/training/run-background-service/create-service.html }
protected override void onCreate(Bundle savedInstanceState) { // http://unix.stackexchange.com/questions/10050/proc-pid-fd-x-link-number // http://stackoverflow.com/questions/21955273/sharing-shared-memory-file-descriptors-across-android-app-processes-using-binder // http://permalink.gmane.org/gmane.comp.handhelds.android.porting/10904 // http://www.mkyong.com/android/android-activity-from-one-screen-to-another-screen/ // https://groups.google.com/forum/#!topic/android-ndk/sjIiMsLkHCM base.onCreate(savedInstanceState); var sv = new ScrollView(this); var ll = new LinearLayout(this); ll.setOrientation(LinearLayout.VERTICAL); sv.addView(ll); var activity = this; // does it work for us? var fs = default(java.io.FileDescriptor); try { var ls = new LocalSocket(); ls.connect(new LocalSocketAddress("MemoryFileDescriptor0")); var i8 = ls.getInputStream().read(); fs = ls.getAncillaryFileDescriptors().FirstOrDefault(); new Button(this).AttachTo(ll).WithText(new { i8, fs }.ToString()); //var memory0 = new FileInputStream(ls_fd).read(); //new Button(this).AttachTo(ll).WithText(new { memory0 }.ToString()); } catch { } var m = default(MemoryFile); //try { m = new MemoryFile(default(string), 0); } try { m = new MemoryFile("name1", 0x07); } catch { throw; } var m_descriptor = this.getIntent().getIntExtra("m_descriptor", 0); var parentpid = this.getIntent().getIntExtra("pid", 0); //var pfd = (ParcelFileDescriptor)this.getIntent().getParcelableExtra("pfd"); ////var fs = new java.io.FileDescriptor { }; ////var xfields = typeof(java.io.FileDescriptor).GetFields( //// System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance ////); ////xfields.WithEach( //// xFileDescriptor_SourceField => //// { //// var xvalue = xFileDescriptor_SourceField.GetValue(fs); //// //if (xFileDescriptor_SourceField.FieldType == typeof(int)) //// if (xFileDescriptor_SourceField.Name == "descriptor") //// { //// xFileDescriptor_SourceField.SetValue(fs, m_descriptor); //// } //// } ////); // need to call native_mmap var t = typeof(MemoryFile); // internal static int native_mmap(java.io.FileDescriptor fd, int length, int mode); //var native_mmap = t.GetMethod("native_mmap", new[] { // typeof(java.io.FileDescriptor), // typeof(int), // typeof(int) // } //); //var methods = t.GetMethods( // System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static //); //var native_mmap = methods.FirstOrDefault(x => x.Name == "native_mmap"); //#region time to patch it? //#endregion //var available = 0; var buffer = new byte[0x07]; //X:\jsc.svn\examples\java\android\Test\TestNewByteArray7\TestNewByteArray7\Class1.cs //try { m.readBytes(buffer, 0, 0, 0x07); } //catch { } //try //{ // //buffer0 = new java.io.FileInputStream(fs).read(); // available = new java.io.FileInputStream(fs).available(); //} //catch //{ } //var parentpidfd = "/proc/" + parentpid + "/fd/" + m_descriptor; //var parentpidfdx = global::System.IO.File.Exists(parentpidfd); //var parentpidf = new java.io.File(parentpidfd); //new Button(this).AttachTo(ll).WithText(new { parentpidfdx }.ToString()); //new Button(this).AttachTo(ll).WithText(new { parentpidfd }.ToString()); //new Button(this).AttachTo(ll).WithText(new { size = parentpidf.length() }.ToString()); //var parentfd = ParcelFileDescriptor.open(parentpidf, ParcelFileDescriptor.MODE_READ_WRITE); var pid = android.os.Process.myPid(); var uid = android.os.Process.myUid(); this.setTitle( new { pid, uid //m_descriptor, //parentpid, ////pfg = pfd.getFd(), ////size = pfd.getStatSize() //parentpidfdx, //parentpidfd }.ToString() ); //new Button(this).AttachTo(ll).WithText("methods: " + new //{ // methods.Length // , // native_mmap //}.ToString()); //methods.WithEach( // SourceMethod => // { // new Button(this).AttachTo(ll).WithText(new { SourceMethod }.ToString()); // } //); Action patch = delegate { }; #region fields var fields = t.GetFields( System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance ); new Button(this).AttachTo(ll).WithText("fields: " + new { fields.Length }.ToString()); fields.WithEach( SourceField => { //E/AndroidRuntime( 9919): Caused by: java.lang.IllegalAccessException: Cannot access field: java.io.FileDescriptor android.os.MemoryFile.mFD //E/AndroidRuntime( 9919): at java.lang.reflect.Field.get(Native Method) //E/AndroidRuntime( 9919): at java.lang.reflect.Field.get(Field.java:279) //E/AndroidRuntime( 9919): at ScriptCoreLibJava.BCLImplementation.System.Reflection.__FieldInfo.GetValue(__FieldInfo.java:46) var value = SourceField.GetValue(m); var xFileDescriptor = value as java.io.FileDescriptor; if (xFileDescriptor != null) { var xfields = typeof(java.io.FileDescriptor).GetFields( System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance ); xfields.WithEach( xFileDescriptor_SourceField => { var xvalue = xFileDescriptor_SourceField.GetValue(value); //if (xFileDescriptor_SourceField.FieldType == typeof(int)) if (xFileDescriptor_SourceField.Name == "descriptor") { //m_descriptor = (int)xvalue; patch = delegate { Console.WriteLine("enter patch " + new { SourceField }); //mAddress = native_mmap(mFD, length, modeToProt(mode)); //mOwnsRegion = false; SourceField.SetValue(m, fs); //xFileDescriptor_SourceField.SetValue(value, m_descriptor); value = SourceField.GetValue(m); xvalue = xFileDescriptor_SourceField.GetValue(value); var field_mAddress = fields.FirstOrDefault(xx => xx.Name == "mAddress"); Console.WriteLine("enter patch " + new { xvalue } +" invoke mmap"); var PROT_READ = 0x1; //E/AndroidRuntime( 8047): Caused by: java.lang.IllegalAccessException: access to method denied //E/AndroidRuntime( 8047): at java.lang.reflect.Method.invokeNative(Native Method) //E/AndroidRuntime( 8047): at java.lang.reflect.Method.invoke(Method.java:507) //E/AndroidRuntime( 8047): at ScriptCoreLibJava.BCLImplementation.System.Reflection.__MethodInfo.InternalInvoke(__MethodInfo.java:93) //I/System.Console( 8648): 21c8:0001 enter patch { field_mAddress = int mAddress } invoke native_mmap //I/System.Console( 8936): 22e8:0001 GetFields { Length = 5, IsPublic = false, IsNonPublic = true, IsStatic = fal //I/System.Console( 8936): 22e8:0001 enter patch //I/System.Console( 8936): 22e8:0001 enter patch { field_mAddress = int mAddress, m_descriptor = 39 } invoke mmap //I/System.Console( 8936): 22e8:0001 lib: libs/armeabi_v7a/libTestNDKAsAsset.so //I/System.Console( 8936): 22e8:0001 loadLibrary: TestNDKAsAsset //I/System.Console( 8936): 22e8:0001 exit patch { mAddress = -1 } //var z = ScriptCoreLibNative.SystemHeaders.sys.mman_h.mmap( // null, // length, // PROT_READ | PROT_WRITE, // MAP_SHARED, // fd, // 0 // ); // I/System.Console( 8016): 1f50:0001 enter patch { SourceField = java.io.FileDescriptor mFD } //I/System.Console( 8016): 1f50:0001 enter patch { field_mAddress = long mAddress, xvalue = 32 } invoke mmap //I/System.Console( 8016): 1f50:0001 lib: libs/armeabi_v7a/libTestNDKAsAsset.so //I/System.Console( 8016): 1f50:0001 loadLibrary: TestNDKAsAsset //I/System.Console( 8016): 1f50:0001 exit patch { mAddress = -1 } //I/System.Console( 9792): 2640:0001 enter patch { SourceField = java.io.FileDescriptor mFD } //I/System.Console( 9792): 2640:0001 enter patch { xvalue = 32 } invoke mmap //I/xNativeActivity( 9792): x:\jsc.svn\examples\c\android\Test\TestNDKAsAsset\TestNDKAsAsset\Program.cs:139 mmap -1 errno: 13 Permission denied //I/System.Console( 9792): 2640:0001 exit patch { mAddress = -1 } //E/audit ( 5152): type=1400 msg=audit(1433328685.131:566): avc: denied { mmap_zero } for pid=9792 comm="Activities:foo1" scontext=u:r:untrusted_app:s0 tcontext=u:r:untrusted_app:s0 tclass=memprotect permissive=0 //E/audit ( 5152): SEPF_SM-G925F_5.0.2_0009 //E/audit ( 5152): type=1300 msg=audit(1433328685.131:566): arch=40000028 syscall=192 success=no exit=-13 a0=0 a1=7 a2=3 a3=10 items=0 ppid=2962 ppcomm=main pid=9792 auid=4294967295 uid=10315 gid=10315 euid=10315 suid=10315 fsuid=10315 egid=10315 sgid=10315 fsgid=10315 ses=4294967295 tty=(none) comm="Activities:foo1" exe="/system/bin/app_process32" subj=u:r:untrusted_app:s0 key=(null) //E/audit ( 5152): type=1320 msg=audit(1433328685.131:566): //D/SSRM:n ( 3468): SIOP:: AP = 290, PST = 300, CP = 395, CUR = 268 // https://github.com/realm/realm-java/issues/1037 var mAddress = (int) // ??? TestNDKAsAsset.xActivity.mmap( (int)xvalue, 0x07 ); // https://android.googlesource.com/platform/development/+/858086e/ndk/sources/android/libportable/arch-mips/mmap.c // https://groups.google.com/forum/#!msg/android-ndk/tNYpTsHNQEY/8S7VS2j8f_8J // jint result = (jint)mmap(NULL, length, prot, MAP_SHARED, fd, 0); //native_mmap.Invoke(null, // new object[] // { // value, // 0x07, // PROT_READ // } //); Console.WriteLine("exit patch " + new { mAddress }); field_mAddress.SetValue(m, mAddress); // http://stackoverflow.com/questions/8165216/what-is-the-use-of-memoryfile-in-android // http://osdir.com/ml/Android-Developers/2013-01/msg00793.html }; } new Button(this).AttachTo(ll).WithText(xFileDescriptor_SourceField + new { xvalue }.ToString()); } ); } else { new Button(this).AttachTo(ll).WithText(new { SourceField, value }.ToString()); } } ); #endregion new Button(activity).WithText("Patch n Read!").AttachTo(ll).AtClick( delegate { patch(); //return; //this.finish(); //E/AndroidRuntime( 7526): Caused by: java.lang.NoSuchMethodError: android.app.Activity.finishAndRemoveTask //E/AndroidRuntime( 7526): at TestMultiProcMemoryFile.Activities.SecondaryActivity._onCreate_b__0(SecondaryActivity.java:66) //this.finishAndRemoveTask(); //try { m.readBytes(buffer, 0, 0, 0x07); } //catch { } //var buffer0 = buffer[0]; //this.setTitle( // new { m_descriptor, buffer0 }.ToString() //); } ); this.setContentView(sv); }
static Program() { // https://sites.google.com/a/jsc-solutions.net/backlog/knowledge-base/2015/201503/20150328 Console.WriteLine(typeof(object) + " Program prep for " + typeof(SharedProgram) + new { Thread.CurrentThread.ManagedThreadId }); HopToCLR.VirtualOnCompleted = (Action continuation) => { Console.WriteLine(typeof(object) + " enter HopToCLR " + new { Thread.CurrentThread.ManagedThreadId }); //Task.Run(continuation); // we will never complete? // if we do, se have to jump? can we jump? // do we know how to pass forward our state? // continuation = {Method = {Void Run()}} //- ((System.Delegate)(continuation))._target {System.Runtime.CompilerServices.AsyncMethodBuilderCore.MoveNextRunner} object {System.Runtime.CompilerServices.AsyncMethodBuilderCore.MoveNextRunner} //+ m_context {System.Threading.ExecutionContext} System.Threading.ExecutionContext //- m_stateMachine {JVMCLRSwitchToCLRContextAsync.SharedProgram.Invoke} System.Runtime.CompilerServices.IAsyncStateMachine {JVMCLRSwitchToCLRContextAsync.SharedProgram.Invoke} //- [JVMCLRSwitchToCLRContextAsync.SharedProgram.Invoke] {JVMCLRSwitchToCLRContextAsync.SharedProgram.Invoke} JVMCLRSwitchToCLRContextAsync.SharedProgram.Invoke // e "hi" string Console.WriteLine(new { continuation }); Console.WriteLine(new { continuation.Method }); Console.WriteLine(new { continuation.Target }); // inspect target. can we reactivate it? //0001 0200000e JVMCLRSwitchToCLRContextAsync__i__d.jvm::JVMCLRSwitchToCLRContextAsync.SharedProgram+<Invoke>d__0 var f = continuation.Target.GetType().GetFields( System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance ); var AsyncStateMachineSource = default(IAsyncStateMachine); var AsyncStateMachineType = default(Type); var AsyncStateMachineFields = default(FieldInfo[]); var AsyncStateMachineStateField = default(FieldInfo); f.WithEach( SourceField => { var SourceField_value = SourceField.GetValue(continuation.Target); Console.WriteLine(new { SourceField, value = SourceField_value }); var m_stateMachine = SourceField_value as IAsyncStateMachine; if (m_stateMachine != null) { AsyncStateMachineSource = m_stateMachine; AsyncStateMachineType = m_stateMachine.GetType(); AsyncStateMachineFields = AsyncStateMachineType.GetFields( System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance ); AsyncStateMachineFields.WithEach( AsyncStateMachineSourceField => { var value = AsyncStateMachineSourceField.GetValue(m_stateMachine); if (AsyncStateMachineSourceField.Name.EndsWith("1__state")) { AsyncStateMachineStateField = AsyncStateMachineSourceField; } Console.WriteLine(new { AsyncStateMachineSourceField, value }); } ); } } ); // System.Object Program prep for JVMCLRSwitchToCLRContextAsync.SharedProgram{ ManagedThreadId = 1 } //System.Object CLRProgram prep for JVMCLRSwitchToCLRContextAsync.SharedProgram{ ManagedThreadId = 1 } //System.Object enter JVMCLRSwitchToCLRContextAsync.SharedProgram{ ManagedThreadId = 1 } //System.Object enter HopToCLR { ManagedThreadId = 1 } //{ continuation = System.Action } //{ Method = Void Run() } //{ Target = System.Runtime.CompilerServices.AsyncMethodBuilderCore+MoveNextRunner } //{ SourceField = System.Threading.ExecutionContext m_context, value = System.Threading.ExecutionContext } //{ SourceField = System.Runtime.CompilerServices.IAsyncStateMachine m_stateMachine, value = JVMCLRSwitchToCLRContextAsync.SharedProgram+<Invoke>d__0 } //{ AsyncStateMachineSourceField = Int32 <>1__state, value = 0 } //{ AsyncStateMachineSourceField = System.Runtime.CompilerServices.AsyncTaskMethodBuilder <>t__builder, value = System.Runtime.CompilerServices.AsyncTaskMethodBuilder } //{ AsyncStateMachineSourceField = System.String e, value = hi } //{ AsyncStateMachineSourceField = JVMCLRSwitchToCLRContextAsync.HopToCLR <>u__$awaiter1, value = JVMCLRSwitchToCLRContextAsync.HopToCLR } //{ AsyncStateMachineSourceField = System.Object <>t__stack, value = } //{ AsyncStateMachineSourceField = JVMCLRSwitchToCLRContextAsync.HopToThreadPoolAwaitable <>u__$awaiter2, value = JVMCLRSwitchToCLRContextAsync.HopToThreadPoolAwaitable } //System.Object CLRInvoke { ManagedThreadId = 1 } // System.Object Program prep for JVMCLRSwitchToCLRContextAsync.SharedProgram{ ManagedThreadId = 1 } //System.Object CLRProgram prep for JVMCLRSwitchToCLRContextAsync.SharedProgram{ ManagedThreadId = 1 } //System.Object enter JVMCLRSwitchToCLRContextAsync.SharedProgram{ ManagedThreadId = 1 } //System.Object enter HopToCLR { ManagedThreadId = 1 } //{ continuation = System.Action } //{ Method = Void Run() } //{ Target = System.Runtime.CompilerServices.AsyncMethodBuilderCore+MoveNextRunner } //{ SourceField = System.Threading.ExecutionContext m_context, value = System.Threading.ExecutionContext } //{ SourceField = System.Runtime.CompilerServices.IAsyncStateMachine m_stateMachine, value = JVMCLRSwitchToCLRContextAsync.SharedProgram+<Invoke>d__0 } //{ AsyncStateMachineSourceField = Int32 <>1__state, value = 0 } //{ AsyncStateMachineSourceField = System.Runtime.CompilerServices.AsyncTaskMethodBuilder <>t__builder, value = System.Runtime.CompilerServices.AsyncTaskMethodBuilder } //{ AsyncStateMachineSourceField = System.String e, value = hi } //{ AsyncStateMachineSourceField = JVMCLRSwitchToCLRContextAsync.HopToCLR <>u__1, value = JVMCLRSwitchToCLRContextAsync.HopToCLR } //{ AsyncStateMachineSourceField = JVMCLRSwitchToCLRContextAsync.HopToThreadPoolAwaitable <>u__2, value = JVMCLRSwitchToCLRContextAsync.HopToThreadPoolAwaitable } //System.Object CLRInvoke { ManagedThreadId = 1 } //-Activator.CreateInstance(AsyncStateMachineType) { JVMCLRSwitchToCLRContextAsync.SharedProgram.< Invoke > d__0} //object { JVMCLRSwitchToCLRContextAsync.SharedProgram.< Invoke > d__0} //e null string // how can we send the type ref over the wire? encypt it? //var NewStateMachine = Activator.CreateInstance(AsyncStateMachineType); //var NewStateMachineI = NewStateMachine as IAsyncStateMachine; // this will take step into next await. //NewStateMachineI.MoveNext(); //CLRProgram.CLRInvoke( var ShadowIAsyncStateMachine = Program.CLRInvoke( new ShadowIAsyncStateMachine { TypeName = AsyncStateMachineType.FullName, state = (int)AsyncStateMachineStateField.GetValue(AsyncStateMachineSource) } ); Console.WriteLine("can we skip a step? " + new { AsyncStateMachineStateField, ShadowIAsyncStateMachine.state, AsyncStateMachineSource }); //time to jump back? yes //{ continuation = System.Action } //{ Method = Void Run() } //{ Target = System.Runtime.CompilerServices.AsyncMethodBuilderCore+MoveNextRunner } //{ SourceField = System.Threading.ExecutionContext m_context, value = System.Threading.ExecutionContext } //{ SourceField = System.Runtime.CompilerServices.IAsyncStateMachine m_stateMachine, value = JVMCLRSwitchToCLRContextAsync.SharedProgram+<Invoke>d__0 } //{ AsyncStateMachineSourceField = Int32 <>1__state, value = 1 } //{ AsyncStateMachineSourceField = System.Runtime.CompilerServices.AsyncTaskMethodBuilder <>t__builder, value = System.Runtime.CompilerServices.AsyncTaskMethodBuilder } //{ AsyncStateMachineSourceField = System.String e, value = } //{ AsyncStateMachineSourceField = JVMCLRSwitchToCLRContextAsync.HopToCLR <>u__$awaiter1, value = JVMCLRSwitchToCLRContextAsync.HopToCLR } //{ AsyncStateMachineSourceField = System.Object <>t__stack, value = } //{ AsyncStateMachineSourceField = JVMCLRSwitchToCLRContextAsync.HopToJVM <>u__$awaiter2, value = JVMCLRSwitchToCLRContextAsync.HopToJVM } //time to jump back? { state = 1 } // time to jump back? { state = 1 } //can we skip a step? { AsyncStateMachineStateField = int __1__state, state = 1, AsyncStateMachineSource = JVMCLRSwitchToCLRContextAsync.SharedProgram__Invoke_d__0@4437c4 } // enter catch { mname = <01a8> ldloca.s.try } ClauseCatchLocal: //__AsyncTaskMethodBuilder.SetException { exception = } //enter catch { mname = <00a8> ldarg.0.try } ClauseCatchLocal: //__AsyncTaskMethodBuilder.SetException { exception = } //{ Message = System.Diagnostics.Debugger.Break, StackTrace = java.lang.RuntimeException: System.Diagnostics.Debugger.Break // at ScriptCoreLibJava.BCLImplementation.System.Diagnostics.__Debugger.Break(__Debugger.java:32) // at ScriptCoreLib.Shared.BCLImplementation.System.Runtime.CompilerServices.__AsyncTaskMethodBuilder.SetException(__AsyncTaskMethodBuilder.java:58) // at JVMCLRSwitchToCLRContextAsync.SharedProgram__Invoke_d__0__MoveNext_06000055._0214__stloc_1(SharedProgram__Invoke_d__0__MoveNext_06000055.java:253) // at JVMCLRSwitchToCLRContextAsync.SharedProgram__Invoke_d__0__MoveNext_06000055._00a8__ldarg_0(SharedProgram__Invoke_d__0__MoveNext_06000055.java:425) // at JVMCLRSwitchToCLRContextAsync.SharedProgram__Invoke_d__0__MoveNext_06000055.__workflow(SharedProgram__Invoke_d__0__MoveNext_06000055.java:81) // at JVMCLRSwitchToCLRContextAsync.SharedProgram__Invoke_d__0__MoveNext_06000055.__forwardref(SharedProgram__Invoke_d__0__MoveNext_06000055.java:49) // at JVMCLRSwitchToCLRContextAsync.SharedProgram__Invoke_d__0.MoveNext(SharedProgram__Invoke_d__0.java:34) // at JVMCLRSwitchToCLRContextAsync.SharedProgram__Invoke_d__0.System_Runtime_CompilerServices_IAsyncStateMachine_MoveNext(SharedProgram__Invoke_d__0.java:51) // at ScriptCoreLib.Shared.BCLImplementation.System.Runtime.CompilerServices.__AsyncTaskMethodBuilder.Start(__AsyncTaskMethodBuilder.java:43) // at JVMCLRSwitchToCLRContextAsync.SharedProgram.Invoke(SharedProgram.java:36) // at JVMCLRSwitchToCLRContextAsync.Program.main(Program.java:128) // } ////var NewStateMachine = Activator.CreateInstance(AsyncStateMachineType); ////var NewStateMachineI = NewStateMachine as IAsyncStateMachine; ////AsyncStateMachineStateField.SetValue(NewStateMachine, ShadowIAsyncStateMachine.state); //////this will take step into next await. ////NewStateMachineI.MoveNext(); AsyncStateMachineStateField.SetValue(AsyncStateMachineSource, ShadowIAsyncStateMachine.state); AsyncStateMachineSource.MoveNext(); // will it be the same in roslyn? // can we jump back in the future? //java.lang.Object Program prep for JVMCLRSwitchToCLRContextAsync.SharedProgram{ ManagedThreadId = 1 } //System.Object CLRProgram prep for JVMCLRSwitchToCLRContextAsync.SharedProgram{ ManagedThreadId = 3 } //java.lang.Object enter JVMCLRSwitchToCLRContextAsync.SharedProgram{ ManagedThreadId = 1 } //java.lang.Object enter HopToCLR { ManagedThreadId = 1 } //{ continuation = ScriptCoreLib.Shared.BCLImplementation.System.__Action@123ec81 } //{ Method = void _AwaitUnsafeOnCompleted_b__1() } //{ Target = ScriptCoreLib.Shared.BCLImplementation.System.Runtime.CompilerServices.__AsyncTaskMethodBuilder___c__DisplayClass2_2@f87f48 } //{ SourceField = ScriptCoreLib.Shared.BCLImplementation.System.Runtime.CompilerServices.__IAsyncStateMachine zstateMachine, value = JVMCLRSwitchToCLRContextAsync.SharedProgram__Invoke_d__0@1405ef7 } //{ AsyncStateMachineSourceField = java.lang.String e, value = hi } //{ AsyncStateMachineSourceField = ScriptCoreLib.Shared.BCLImplementation.System.Runtime.CompilerServices.__AsyncTaskMethodBuilder __t__builder, value = ScriptCoreLib.Shared.BCLImplementation.System.Runtime.CompilerServices.__AsyncTaskMethodBuilder@1bba400 } //{ AsyncStateMachineSourceField = int __1__state, value = 0 } //{ AsyncStateMachineSourceField = JVMCLRSwitchToCLRContextAsync.HopToCLR __u___awaiter1, value = JVMCLRSwitchToCLRContextAsync.HopToCLR@19d3b25 } //{ AsyncStateMachineSourceField = java.lang.Object __t__stack, value = } //{ AsyncStateMachineSourceField = JVMCLRSwitchToCLRContextAsync.HopToThreadPoolAwaitable __u___awaiter2, value = } //{ SourceField = ScriptCoreLib.Shared.BCLImplementation.System.__Action yield, value = ScriptCoreLib.Shared.BCLImplementation.System.__Action@14989ff } //java.lang.Object CLRProgram prep for JVMCLRSwitchToCLRContextAsync.SharedProgram{ ManagedThreadId = 1 } //java.lang.Object CLRInvoke { ManagedThreadId = 1 } // whats the _AwaitUnsafeOnCompleted_b__1 ? // both have __IAsyncStateMachine, but CLR has ExecutionContext, while others have .__Action yield // shall we test on roslyn, then inspect that __IAsyncStateMachine? //CLRProgram.CLRInvoke(); }; }
public static ShadowIAsyncStateMachine CLRInvoke( ShadowIAsyncStateMachine that ) { var xAsyncStateMachineTypeName = that.TypeName; Console.WriteLine(typeof(object) + " CLRInvoke " //+ typeof(SharedProgram) + new { Thread.CurrentThread.ManagedThreadId, that.TypeName, that.state }); // do we have the type mentioned loaded? //var NewStateMachine = Activator.CreateInstance(AsyncStateMachineType); //var NewStateMachineI = NewStateMachine as IAsyncStateMachine; //// this will take step into next await. ////NewStateMachineI.MoveNext(); //java.lang.Object Program prep for JVMCLRSwitchToCLRContextAsync.SharedProgram{ ManagedThreadId = 1 } //java.lang.Object enter JVMCLRSwitchToCLRContextAsync.SharedProgram{ ManagedThreadId = 1 } //java.lang.Object enter HopToCLR { ManagedThreadId = 1 } //{ continuation = ScriptCoreLib.Shared.BCLImplementation.System.__Action@123ec81 } //{ Method = void _AwaitUnsafeOnCompleted_b__1() } //{ Target = ScriptCoreLib.Shared.BCLImplementation.System.Runtime.CompilerServices.__AsyncTaskMethodBuilder___c__DisplayClass2_2@f87f48 } //{ SourceField = ScriptCoreLib.Shared.BCLImplementation.System.Runtime.CompilerServices.__IAsyncStateMachine zstateMachine, value = JVMCLRSwitchToCLRContextAsync.SharedProgram__Invoke_d__0@1405ef7 } //{ AsyncStateMachineSourceField = java.lang.String e, value = hi } //{ AsyncStateMachineSourceField = ScriptCoreLib.Shared.BCLImplementation.System.Runtime.CompilerServices.__AsyncTaskMethodBuilder __t__builder, value = ScriptCoreLib.Shared.BCLImplementation.System.Runtime.CompilerServices.__AsyncTaskMethodBuilder@1bba400 } //{ AsyncStateMachineSourceField = int __1__state, value = 0 } //{ AsyncStateMachineSourceField = JVMCLRSwitchToCLRContextAsync.HopToCLR __u___awaiter1, value = JVMCLRSwitchToCLRContextAsync.HopToCLR@19d3b25 } //{ AsyncStateMachineSourceField = java.lang.Object __t__stack, value = } //{ AsyncStateMachineSourceField = JVMCLRSwitchToCLRContextAsync.HopToThreadPoolAwaitable __u___awaiter2, value = } //{ SourceField = ScriptCoreLib.Shared.BCLImplementation.System.__Action yield, value = ScriptCoreLib.Shared.BCLImplementation.System.__Action@14989ff } //System.Object CLRInvoke { ManagedThreadId = 3, AsyncStateMachineTypeName = JVMCLRSwitchToCLRContextAsync.SharedProgram__Invoke_d__0 } //{ SourceField = System.Runtime.CompilerServices.IAsyncStateMachine m_stateMachine, value = JVMCLRSwitchToCLRContextAsync.SharedProgram+<Invoke>d__0 } // should java keep the actual type name as an attribute, like we have displayName Console.WriteLine("looking for the type..."); var xAsyncStateMachineType = typeof(CLRProgram).Assembly.GetTypes().FirstOrDefault( x => { //Console.WriteLine(new { x.FullName }); return(x.FullName.Replace("+", "_").Replace("<", "_").Replace(">", "_") == xAsyncStateMachineTypeName.Replace("+", "_").Replace("<", "_").Replace(">", "_")); } ); //looking for the type... //{ FullName = JVMCLRSwitchToCLRContextAsync.Program } //{ FullName = <module>.SHA12fc19b38aba0098236ba7fd654b62facbfa4969b@1331799119 } //{ FullName = ScriptCoreLib.Desktop.JVM.JVMLauncher } //{ FullName = <module>.SHA1e4eb4631b3cf3610d48914d2f4deba4581c74282@275784628$00000006 } //{ FullName = . } //{ FullName = . } //{ FullName = . } //{ FullName = ScriptCoreLib.Desktop.JVM.__JVMLauncherInvoke } //{ FullName = ScriptCoreLib.Desktop.JVM.__InternalGetEntryPoint } //{ FullName = ScriptCoreLib.Desktop.JVM.__InternalGetEntryPoint+ } //{ FullName = . } //{ FullName = . } //{ FullName = .? } //{ FullName = . } //{ FullName = . } //{ FullName = . } //{ FullName = . } //{ FullName = . } //{ FullName = . } //{ FullName = . } //{ FullName = .? } //{ FullName = . } //{ FullName = . } //{ FullName = JVMCLRSwitchToCLRContextAsync__i.<02000018>\\\\\\\+export } //{ FullName = <module>.SHA14908e43b60b15906983f15d5126d55d794b08a03@516876350$0000001e } //{ FullName = JVMCLRSwitchToCLRContextAsync.<02000006>\\\\\\\\\\\\\\\+<interfaceexport> } //{ FullName = JVMCLRSwitchToCLRContextAsync.CLRProgram } //{ FullName = JVMCLRSwitchToCLRContextAsync.CLRProgram+<>c__DisplayClass1 } //{ FullName = <>f__AnonymousType$34$$30$$29$$28$7`1 } //{ FullName = ScriptCoreLib.Desktop.AppDomainAssemblyResolve } //{ FullName = <module>.SHA1ece49800bcc87751341b0db5b5d43bab4e1973d0@1209331862$00000025 } //{ FullName = ScriptCoreLib.Library.StringConversions } //{ FullName = <module>.SHA17c927d0ef51414d5913d986a2a0ad52032747944@1023654678$00000027 } //{ FullName = ScriptCoreLib.Interop.IntPtrInfo } //{ FullName = <module>.SHA19ab5a45e1768fb14172603268fe7f44ab10839ae@1329949876$0000002a$0000002e$00000029 } //{ FullName = <>f__AnonymousType$42$$53$$67$$65$6`2 } //{ FullName = <>f__AnonymousType$45$$65$$70$$68$8`2 } //{ FullName = <module>.SHA111aec3ca07ebcd71f8efa6a7eb37c94e05d294eb@2139898218$00000047$00000030 } //{ FullName = <module>.SHA1d04c4f386a94a00ca9ac06112eefc7d4456dc8c4@30829592 } //{ FullName = <ExportDirectoryBridge> } Console.WriteLine(typeof(object) + " CLRInvoke " + new { Thread.CurrentThread.ManagedThreadId, xAsyncStateMachineType }); // how can we send the type ref over the wire? encypt it? var NewStateMachine = Activator.CreateInstance(xAsyncStateMachineType); var NewStateMachineI = NewStateMachine as IAsyncStateMachine; #region 1__state xAsyncStateMachineType.GetFields( System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance ).WithEach( AsyncStateMachineSourceField => { if (AsyncStateMachineSourceField.Name.EndsWith("1__state")) { AsyncStateMachineSourceField.SetValue( NewStateMachineI, that.state ); } } ); #endregion var ShadowIAsyncStateMachine = new ShadowIAsyncStateMachine(); var reset = new AutoResetEvent(false); HopToJVM.VirtualOnCompleted = (Action continuation) => { Console.WriteLine("time to jump back? yes"); Console.WriteLine(new { continuation }); Console.WriteLine(new { continuation.Method }); Console.WriteLine(new { continuation.Target }); // inspect target. can we reactivate it? //0001 0200000e JVMCLRSwitchToCLRContextAsync__i__d.jvm::JVMCLRSwitchToCLRContextAsync.SharedProgram+<Invoke>d__0 var f = continuation.Target.GetType().GetFields( System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance ); var AsyncStateMachineSource = default(IAsyncStateMachine); var AsyncStateMachineType = default(Type); var AsyncStateMachineFields = default(FieldInfo[]); // { AsyncStateMachineSourceField = Int32 <>1__state, value = 1 } f.WithEach( SourceField => { var SourceField_value = SourceField.GetValue(continuation.Target); Console.WriteLine(new { SourceField, value = SourceField_value }); var m_stateMachine = SourceField_value as IAsyncStateMachine; if (m_stateMachine != null) { AsyncStateMachineSource = m_stateMachine; AsyncStateMachineType = m_stateMachine.GetType(); AsyncStateMachineFields = AsyncStateMachineType.GetFields( System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance ); AsyncStateMachineFields.WithEach( AsyncStateMachineSourceField => { var value = AsyncStateMachineSourceField.GetValue(m_stateMachine); if (AsyncStateMachineSourceField.Name.EndsWith("1__state")) { ShadowIAsyncStateMachine.state = (int)value; } Console.WriteLine(new { AsyncStateMachineSourceField, value }); } ); } } ); reset.Set(); }; new Thread( delegate() { // this will take step into next await. NewStateMachineI.MoveNext(); } ).Start(); reset.WaitOne(); Console.WriteLine("time to jump back? " + new { ShadowIAsyncStateMachine.state }); return(ShadowIAsyncStateMachine); }