private static void TestStruct() { Console.WriteLine("Testing Structs"); SequentialStruct ss = new SequentialStruct(); ss.f0 = 100; ss.f1 = 1; ss.f2 = 10.0f; ss.f3 = "Hello"; ThrowIfNotEquals(true, StructTest(ss), "Struct marshalling scenario1 failed."); StructTest_ByRef(ref ss); ThrowIfNotEquals(true, ss.f1 == 2 && ss.f2 == 11.0 && ss.f3.Equals("Ifmmp"), "Struct marshalling scenario2 failed."); SequentialStruct ss2 = new SequentialStruct(); StructTest_ByOut(out ss2); ThrowIfNotEquals(true, ss2.f0 == 1 && ss2.f1 == 1.0 && ss2.f2 == 1.0 && ss2.f3.Equals("0123456"), "Struct marshalling scenario3 failed."); ExplicitStruct es = new ExplicitStruct(); es.f1 = 100; es.f2 = 100.0f; es.f3 = "Hello"; ThrowIfNotEquals(true, StructTest_Explicit(es), "Struct marshalling scenario4 failed."); NestedStruct ns = new NestedStruct(); ns.f1 = 100; ns.f2 = es; ThrowIfNotEquals(true, StructTest_Nested(ns), "Struct marshalling scenario5 failed."); // RhpThrowEx is not implemented in CPPCodeGen #if !CODEGEN_CPP bool pass = false; AutoStruct autoStruct = new AutoStruct(); try { // passing struct with Auto layout should throw exception. StructTest_Auto(autoStruct); } catch (Exception) { pass = true; } ThrowIfNotEquals(true, pass, "Struct marshalling scenario6 failed."); #endif }
private static void TestStruct() { Console.WriteLine("Testing Structs"); SequentialStruct ss = new SequentialStruct(); ss.f0 = 100; ss.f1 = 1; ss.f2 = 10.0f; ss.f3 = "Hello"; ThrowIfNotEquals(true, StructTest(ss), "Struct marshalling scenario1 failed."); StructTest_ByRef(ref ss); ThrowIfNotEquals(true, ss.f1 == 2 && ss.f2 == 11.0 && ss.f3.Equals("Ifmmp"), "Struct marshalling scenario2 failed."); SequentialStruct ss2 = new SequentialStruct(); StructTest_ByOut(out ss2); ThrowIfNotEquals(true, ss2.f0 == 1 && ss2.f1 == 1.0 && ss2.f2 == 1.0 && ss2.f3.Equals("0123456"), "Struct marshalling scenario3 failed."); NesterOfSequentialStruct.SequentialStruct ss3 = new NesterOfSequentialStruct.SequentialStruct(); ss3.f1 = 10.0f; ss3.f2 = 123; ThrowIfNotEquals(true, StructTest_Sequential2(ss3), "Struct marshalling scenario1 failed."); ExplicitStruct es = new ExplicitStruct(); es.f1 = 100; es.f2 = 100.0f; es.f3 = "Hello"; ThrowIfNotEquals(true, StructTest_Explicit(es), "Struct marshalling scenario4 failed."); NestedStruct ns = new NestedStruct(); ns.f1 = 100; ns.f2 = es; ThrowIfNotEquals(true, StructTest_Nested(ns), "Struct marshalling scenario5 failed."); SequentialStruct[] ssa = null; ThrowIfNotEquals(true, IsNULL(ssa), "Non-blittable array null check failed"); ssa = new SequentialStruct[3]; for (int i = 0; i < 3; i++) { ssa[i].f1 = 0; ssa[i].f1 = i; ssa[i].f2 = i * i; ssa[i].f3 = i.LowLevelToString(); } ThrowIfNotEquals(true, StructTest_Array(ssa, ssa.Length), "Array of struct marshalling failed"); InlineString ils = new InlineString(); InlineStringTest(ref ils); ThrowIfNotEquals("Hello World!", ils.name, "Inline string marshalling failed"); InlineArrayStruct ias = new InlineArrayStruct(); ias.inlineArray = new short[128]; for (short i = 0; i < 128; i++) { ias.inlineArray[i] = i; } ias.inlineString = "Hello"; InlineUnicodeStruct ius = new InlineUnicodeStruct(); ius.inlineString = "Hello World"; ThrowIfNotEquals(true, InlineArrayTest(ref ias, ref ius), "inline array marshalling failed"); bool pass = true; for (short i = 0; i < 128; i++) { if (ias.inlineArray[i] != i + 1) { pass = false; } } ThrowIfNotEquals(true, pass, "inline array marshalling failed"); ThrowIfNotEquals("Hello World", ias.inlineString, "Inline ByValTStr Ansi marshalling failed"); ThrowIfNotEquals("Hello World", ius.inlineString, "Inline ByValTStr Unicode marshalling failed"); pass = false; AutoStruct autoStruct = new AutoStruct(); try { // passing struct with Auto layout should throw exception. StructTest_Auto(autoStruct); } catch (Exception) { pass = true; } ThrowIfNotEquals(true, pass, "Struct marshalling scenario6 failed."); Callbacks callbacks = new Callbacks(); callbacks.callback0 = new Callback0(callbackFunc0); callbacks.callback1 = new Callback1(callbackFunc1); callbacks.callback2 = new Callback2(callbackFunc2); ThrowIfNotEquals(true, RegisterCallbacks(ref callbacks), "Scenario 7: Struct with delegate marshalling failed"); }
static extern bool StructTest_Auto(AutoStruct ss);
private static void TestStruct() { #if !CODEGEN_CPP Console.WriteLine("Testing Structs"); SequentialStruct ss = new SequentialStruct(); ss.f0 = 100; ss.f1 = 1; ss.f2 = 10.0f; ss.f3 = "Hello"; ThrowIfNotEquals(true, StructTest(ss), "Struct marshalling scenario1 failed."); StructTest_ByRef(ref ss); ThrowIfNotEquals(true, ss.f1 == 2 && ss.f2 == 11.0 && ss.f3.Equals("Ifmmp"), "Struct marshalling scenario2 failed."); SequentialStruct ss2 = new SequentialStruct(); StructTest_ByOut(out ss2); ThrowIfNotEquals(true, ss2.f0 == 1 && ss2.f1 == 1.0 && ss2.f2 == 1.0 && ss2.f3.Equals("0123456"), "Struct marshalling scenario3 failed."); NesterOfSequentialStruct.SequentialStruct ss3 = new NesterOfSequentialStruct.SequentialStruct(); ss3.f1 = 10.0f; ss3.f2 = 123; ThrowIfNotEquals(true, StructTest_Sequential2(ss3), "Struct marshalling scenario1 failed."); ExplicitStruct es = new ExplicitStruct(); es.f1 = 100; es.f2 = 100.0f; es.f3 = "Hello"; ThrowIfNotEquals(true, StructTest_Explicit(es), "Struct marshalling scenario4 failed."); NestedStruct ns = new NestedStruct(); ns.f1 = 100; ns.f2 = es; ThrowIfNotEquals(true, StructTest_Nested(ns), "Struct marshalling scenario5 failed."); SequentialStruct[] ssa = null; ThrowIfNotEquals(true, IsNULL(ssa), "Non-blittable array null check failed"); ssa = new SequentialStruct[3]; for (int i = 0; i < 3; i++) { ssa[i].f1 = 0; ssa[i].f1 = i; ssa[i].f2 = i * i; ssa[i].f3 = i.LowLevelToString(); } ThrowIfNotEquals(true, StructTest_Array(ssa, ssa.Length), "Array of struct marshalling failed"); InlineString ils = new InlineString(); InlineStringTest(ref ils); ThrowIfNotEquals("Hello World!", ils.name, "Inline string marshalling failed"); InlineArrayStruct ias = new InlineArrayStruct(); ias.inlineArray = new short[128]; for (short i = 0; i < 128; i++) { ias.inlineArray[i] = i; } ias.inlineString = "Hello"; InlineUnicodeStruct ius = new InlineUnicodeStruct(); ius.inlineString = "Hello World"; TestStruct2 ts = new TestStruct2() { f1 = 100, f2 = true }; int size = Marshal.SizeOf <TestStruct2>(ts); IntPtr memory = Marshal.AllocHGlobal(size); try { Marshal.StructureToPtr <TestStruct2>(ts, memory, false); TestStruct2 ts2 = Marshal.PtrToStructure <TestStruct2>(memory); ThrowIfNotEquals(true, ts2.f1 == 100 && ts2.f2 == true, "Struct marshalling Marshal API failed"); IntPtr offset = Marshal.OffsetOf <TestStruct2>("f2"); ThrowIfNotEquals(new IntPtr(8), offset, "Struct marshalling OffsetOf failed."); } finally { Marshal.FreeHGlobal(memory); } ThrowIfNotEquals(true, InlineArrayTest(ref ias, ref ius), "inline array marshalling failed"); bool pass = true; for (short i = 0; i < 128; i++) { if (ias.inlineArray[i] != i + 1) { pass = false; } } ThrowIfNotEquals(true, pass, "inline array marshalling failed"); ThrowIfNotEquals("Hello World", ias.inlineString, "Inline ByValTStr Ansi marshalling failed"); ThrowIfNotEquals("Hello World", ius.inlineString, "Inline ByValTStr Unicode marshalling failed"); // RhpThrowEx is not implemented in CPPCodeGen pass = false; AutoStruct autoStruct = new AutoStruct(); try { // passing struct with Auto layout should throw exception. StructTest_Auto(autoStruct); } catch (Exception) { pass = true; } ThrowIfNotEquals(true, pass, "Struct marshalling scenario6 failed."); Callbacks callbacks = new Callbacks(); callbacks.callback0 = new Callback0(callbackFunc0); callbacks.callback1 = new Callback1(callbackFunc1); callbacks.callback2 = new Callback2(callbackFunc2); ThrowIfNotEquals(true, RegisterCallbacks(ref callbacks), "Scenario 7: Struct with delegate marshalling failed"); #endif }
private static void TestStruct() { Console.WriteLine("Testing Structs"); SequentialStruct ss = new SequentialStruct(); ss.f0 = 100; ss.f1 = 1; ss.f2 = 10.0f; ss.f3 = "Hello"; ThrowIfNotEquals(true, StructTest(ss), "Struct marshalling scenario1 failed."); StructTest_ByRef(ref ss); ThrowIfNotEquals(true, ss.f1 == 2 && ss.f2 == 11.0 && ss.f3.Equals("Ifmmp"), "Struct marshalling scenario2 failed."); SequentialStruct ss2 = new SequentialStruct(); StructTest_ByOut(out ss2); ThrowIfNotEquals(true, ss2.f0 == 1 && ss2.f1 == 1.0 && ss2.f2 == 1.0 && ss2.f3.Equals("0123456"), "Struct marshalling scenario3 failed."); ExplicitStruct es = new ExplicitStruct(); es.f1 = 100; es.f2 = 100.0f; es.f3 = "Hello"; ThrowIfNotEquals(true, StructTest_Explicit(es), "Struct marshalling scenario4 failed."); NestedStruct ns = new NestedStruct(); ns.f1 = 100; ns.f2 = es; ThrowIfNotEquals(true, StructTest_Nested(ns), "Struct marshalling scenario5 failed."); SequentialStruct[] ssa = new SequentialStruct[3]; for (int i = 0; i < 3; i++) { ssa[i].f1 = 0; ssa[i].f1 = i; ssa[i].f2 = i * i; ssa[i].f3 = i.ToString(); } ThrowIfNotEquals(true, StructTest_Array(ssa, ssa.Length), "Array of struct marshalling failed"); InlineArrayStruct ias = new InlineArrayStruct(); ias.inlineArray = new short[128]; for (short i = 0; i < 128; i++) { ias.inlineArray[i] = i; } ias.inlineString = "Hello"; InlineUnicodeStruct ius = new InlineUnicodeStruct(); ius.inlineString = "Hello World"; #if !CODEGEN_CPP ThrowIfNotEquals(true, InlineArrayTest(ref ias, ref ius), "inline array marshalling failed"); bool pass = true; for (short i = 0; i < 128; i++) { if (ias.inlineArray[i] != i + 1) { pass = false; } } ThrowIfNotEquals(true, pass, "inline array marshalling failed"); ThrowIfNotEquals("Hello World", ias.inlineString, "Inline ByValTStr Ansi marshalling failed"); ThrowIfNotEquals("Hello World", ius.inlineString, "Inline ByValTStr Unicode marshalling failed"); // RhpThrowEx is not implemented in CPPCodeGen pass = false; AutoStruct autoStruct = new AutoStruct(); try { // passing struct with Auto layout should throw exception. StructTest_Auto(autoStruct); } catch (Exception) { pass = true; } ThrowIfNotEquals(true, pass, "Struct marshalling scenario6 failed."); #endif }
private static extern void Invalid(AutoStruct s);