Add assert when dllmap is disabled and fix support build in netcore mode
[mono-project.git] / mono / tests / pinvoke11.cs
blob776dbc4035f204896db1594f755dd594147715bb
1 using System;
2 using System.Runtime.InteropServices;
4 [StructLayout(LayoutKind.Sequential)]
5 public struct ss
7 public int i1;
10 [StructLayout(LayoutKind.Explicit)]
11 public struct su
13 [FieldOffset(0)] public int i1;
14 [FieldOffset(0)] public int i2;
17 [StructLayout(LayoutKind.Sequential)]
18 public struct cs
20 public bool b1;
21 public int i1;
22 public su u1;
25 /* various small structs for testing struct-by-value where they are handled specially
26 on some platforms.
28 [StructLayout(LayoutKind.Sequential)]
29 public struct sc1
31 public byte c0;
34 [StructLayout(LayoutKind.Sequential)]
35 public struct sc3
37 public byte c0;
38 public byte c1;
39 public byte c2;
42 [StructLayout(LayoutKind.Sequential)]
43 public struct sc5
45 public byte c0;
46 public byte c1;
47 public byte c2;
48 public byte c3;
49 public byte c4;
52 public struct FI {
53 public float f1;
54 public float f2;
55 public float f3;
58 public struct NestedFloat {
59 public FI fi;
60 public float f4;
63 [Serializable]
64 [StructLayout(LayoutKind.Sequential)]
65 public struct Rectangle
67 public int X;
68 public int Y;
69 public int Width;
70 public int Height;
72 public Rectangle(int x, int y, int width, int height)
74 X = x;
75 Y = y;
76 Width = width;
77 Height = height;
81 [Serializable]
82 public struct Scalar4 {
83 public double Val0;
84 public double Val1;
85 public double Val2;
86 public double Val3;
88 public Scalar4 (double v0, double v1, double v2, double v3) {
89 Val0 = v0;
90 Val1 = v1;
91 Val2 = v2;
92 Val3 = v3;
96 public class Test
98 [DllImport ("libtest")]
99 public static extern int mono_union_test_1 (cs a);
101 [DllImport ("libtest")]
102 public static extern int mono_return_int (int a);
104 [DllImport ("libtest", EntryPoint="mono_return_int_ss")]
105 public static extern int mono_return_int_ss (ss a);
107 [DllImport ("libtest", EntryPoint="mono_return_ss")]
108 public static extern ss mono_return_ss (ss a);
110 [DllImport ("libtest", EntryPoint="mono_return_sc1")]
111 public static extern sc1 mono_return_sc1 (sc1 a);
113 [DllImport ("libtest", EntryPoint="mono_return_sc3")]
114 public static extern sc3 mono_return_sc3 (sc3 a);
116 [DllImport ("libtest", EntryPoint="mono_return_sc5")]
117 public static extern sc5 mono_return_sc5 (sc5 a);
119 [DllImport ("libtest", EntryPoint="mono_return_int_su")]
120 public static extern int mono_return_int_su (su a);
122 [DllImport ("libtest", EntryPoint="mono_return_nested_float")]
123 public static extern NestedFloat mono_return_nested_float ();
125 [DllImport("libtest", EntryPoint="mono_return_struct_4_double")]
126 [return: MarshalAs(UnmanagedType.LPStr)]
127 public static extern string mono_return_struct_4_double (IntPtr ptr, Rectangle rect, Scalar4 sc4, int a, int b, int c);
129 static int Main()
131 if (mono_return_int (5) != 5)
132 return 1;
134 ss s1;
135 s1.i1 = 4;
136 if (mono_return_int_ss (s1) != 4)
137 return 2;
139 s1 = mono_return_ss (s1);
140 if (s1.i1 != 5)
141 return 3;
143 su s2;
144 s2.i1 = 2;
145 s2.i2 = 3;
146 if (mono_return_int_su (s2) != 3)
147 return 4;
149 s2.i1 = 2;
150 if (mono_return_int_su (s2) != 2)
151 return 5;
154 cs s3;
155 s3.b1 = false;
156 s3.i1 = 12;
157 s3.u1.i1 = 2;
158 s3.u1.i2 = 1;
160 if (mono_union_test_1 (s3) != 13)
161 return 6;
163 s3.u1.i1 = 2;
164 if (mono_union_test_1 (s3) != 14)
165 return 7;
167 s3.b1 = true;
168 if (mono_union_test_1 (s3) != 15)
169 return 8;
171 sc1 s4;
172 s4.c0 = 3;
173 s4 = mono_return_sc1(s4);
174 if (s4.c0 != 4)
175 return 9;
177 sc3 s5;
178 s5.c0 = 4;
179 s5.c1 = 5;
180 s5.c2 = 6;
181 s5 = mono_return_sc3(s5);
182 if (s5.c0 != 5 || s5.c1 != 7 || s5.c2 != 9)
183 return 10;
185 sc5 s6;
186 s6.c0 = 4;
187 s6.c1 = 5;
188 s6.c2 = 6;
189 s6.c3 = 7;
190 s6.c4 = 8;
191 s6 = mono_return_sc5(s6);
192 if (s6.c0 != 5 || s6.c1 != 7 || s6.c2 != 9 || s6.c3 != 11 || s6.c4 != 13)
193 return 11;
195 var f = mono_return_nested_float ();
196 if (f.fi.f1 != 1.0)
197 return 12;
199 Rectangle rect = new Rectangle (10, 10, 100, 20);
200 Scalar4 sc4 = new Scalar4 (32, 64, 128, 256);
201 var sc4_ret = mono_return_struct_4_double (IntPtr.Zero, rect, sc4, 0x1337, 0x1234, 0x9876);
202 if (sc4_ret != "sc4 = {32.0, 64.0, 128.0, 256.0 }, a=1337, b=1234, c=9876\n") {
203 Console.WriteLine ("sc4_ret = " + sc4_ret);
204 return 13;
207 return 0;