4 // Tests for COM Interop related features
8 using System.Runtime.CompilerServices;
9 using System.Runtime.InteropServices;
15 [DllImport("libtest")]
16 public static extern int mono_test_marshal_bstr_in([MarshalAs(UnmanagedType.BStr)]string str);
18 [DllImport("libtest")]
19 public static extern int mono_test_marshal_bstr_out([MarshalAs(UnmanagedType.BStr)] out string str);
21 [DllImport("libtest")]
22 public static extern int mono_test_marshal_bstr_in_null([MarshalAs(UnmanagedType.BStr)]string str);
24 [DllImport("libtest")]
25 public static extern int mono_test_marshal_bstr_out_null([MarshalAs(UnmanagedType.BStr)] out string str);
27 [DllImport("libtest")]
28 public static extern int mono_test_marshal_variant_in_sbyte([MarshalAs(UnmanagedType.Struct)]object obj);
30 [DllImport("libtest")]
31 public static extern int mono_test_marshal_variant_in_byte([MarshalAs(UnmanagedType.Struct)]object obj);
33 [DllImport("libtest")]
34 public static extern int mono_test_marshal_variant_in_short([MarshalAs(UnmanagedType.Struct)]object obj);
36 [DllImport("libtest")]
37 public static extern int mono_test_marshal_variant_in_ushort([MarshalAs(UnmanagedType.Struct)]object obj);
39 [DllImport("libtest")]
40 public static extern int mono_test_marshal_variant_in_int([MarshalAs(UnmanagedType.Struct)]object obj);
42 [DllImport("libtest")]
43 public static extern int mono_test_marshal_variant_in_uint([MarshalAs(UnmanagedType.Struct)]object obj);
45 [DllImport("libtest")]
46 public static extern int mono_test_marshal_variant_in_long([MarshalAs(UnmanagedType.Struct)]object obj);
48 [DllImport("libtest")]
49 public static extern int mono_test_marshal_variant_in_ulong([MarshalAs(UnmanagedType.Struct)]object obj);
51 [DllImport("libtest")]
52 public static extern int mono_test_marshal_variant_in_float([MarshalAs(UnmanagedType.Struct)]object obj);
54 [DllImport("libtest")]
55 public static extern int mono_test_marshal_variant_in_double([MarshalAs(UnmanagedType.Struct)]object obj);
57 [DllImport("libtest")]
58 public static extern int mono_test_marshal_variant_in_bstr ([MarshalAs (UnmanagedType.Struct)]object obj);
60 [DllImport ("libtest")]
61 public static extern int mono_test_marshal_variant_in_bool_true ([MarshalAs (UnmanagedType.Struct)]object obj);
63 [DllImport ("libtest")]
64 public static extern int mono_test_marshal_variant_in_bool_false ([MarshalAs (UnmanagedType.Struct)]object obj);
66 [DllImport("libtest")]
67 public static extern int mono_test_marshal_variant_out_sbyte([MarshalAs(UnmanagedType.Struct)]out object obj);
69 [DllImport("libtest")]
70 public static extern int mono_test_marshal_variant_out_sbyte_byref([MarshalAs(UnmanagedType.Struct)]out object obj);
72 [DllImport("libtest")]
73 public static extern int mono_test_marshal_variant_out_byte([MarshalAs(UnmanagedType.Struct)]out object obj);
75 [DllImport("libtest")]
76 public static extern int mono_test_marshal_variant_out_byte_byref([MarshalAs(UnmanagedType.Struct)]out object obj);
78 [DllImport("libtest")]
79 public static extern int mono_test_marshal_variant_out_short([MarshalAs(UnmanagedType.Struct)]out object obj);
81 [DllImport("libtest")]
82 public static extern int mono_test_marshal_variant_out_short_byref([MarshalAs(UnmanagedType.Struct)]out object obj);
84 [DllImport("libtest")]
85 public static extern int mono_test_marshal_variant_out_ushort([MarshalAs(UnmanagedType.Struct)]out object obj);
87 [DllImport("libtest")]
88 public static extern int mono_test_marshal_variant_out_ushort_byref([MarshalAs(UnmanagedType.Struct)]out object obj);
90 [DllImport("libtest")]
91 public static extern int mono_test_marshal_variant_out_int([MarshalAs(UnmanagedType.Struct)]out object obj);
93 [DllImport("libtest")]
94 public static extern int mono_test_marshal_variant_out_int_byref([MarshalAs(UnmanagedType.Struct)]out object obj);
96 [DllImport("libtest")]
97 public static extern int mono_test_marshal_variant_out_uint([MarshalAs(UnmanagedType.Struct)]out object obj);
99 [DllImport("libtest")]
100 public static extern int mono_test_marshal_variant_out_uint_byref([MarshalAs(UnmanagedType.Struct)]out object obj);
102 [DllImport("libtest")]
103 public static extern int mono_test_marshal_variant_out_long([MarshalAs(UnmanagedType.Struct)]out object obj);
105 [DllImport("libtest")]
106 public static extern int mono_test_marshal_variant_out_long_byref([MarshalAs(UnmanagedType.Struct)]out object obj);
108 [DllImport("libtest")]
109 public static extern int mono_test_marshal_variant_out_ulong([MarshalAs(UnmanagedType.Struct)]out object obj);
111 [DllImport("libtest")]
112 public static extern int mono_test_marshal_variant_out_ulong_byref([MarshalAs(UnmanagedType.Struct)]out object obj);
114 [DllImport("libtest")]
115 public static extern int mono_test_marshal_variant_out_float([MarshalAs(UnmanagedType.Struct)]out object obj);
117 [DllImport("libtest")]
118 public static extern int mono_test_marshal_variant_out_float_byref([MarshalAs(UnmanagedType.Struct)]out object obj);
120 [DllImport("libtest")]
121 public static extern int mono_test_marshal_variant_out_double([MarshalAs(UnmanagedType.Struct)]out object obj);
123 [DllImport("libtest")]
124 public static extern int mono_test_marshal_variant_out_double_byref([MarshalAs(UnmanagedType.Struct)]out object obj);
126 [DllImport("libtest")]
127 public static extern int mono_test_marshal_variant_out_bstr ([MarshalAs (UnmanagedType.Struct)]out object obj);
129 [DllImport("libtest")]
130 public static extern int mono_test_marshal_variant_out_bstr_byref ([MarshalAs (UnmanagedType.Struct)]out object obj);
132 [DllImport("libtest")]
133 public static extern int mono_test_marshal_variant_out_bool_true ([MarshalAs (UnmanagedType.Struct)]out object obj);
135 [DllImport("libtest")]
136 public static extern int mono_test_marshal_variant_out_bool_true_byref ([MarshalAs (UnmanagedType.Struct)]out object obj);
138 [DllImport ("libtest")]
139 public static extern int mono_test_marshal_variant_out_bool_false ([MarshalAs (UnmanagedType.Struct)]out object obj);
141 [DllImport ("libtest")]
142 public static extern int mono_test_marshal_variant_out_bool_false_byref ([MarshalAs (UnmanagedType.Struct)]out object obj);
145 public delegate int VarFunc (VarEnum vt, [MarshalAs (UnmanagedType.Struct)] object obj);
147 public delegate int VarRefFunc (VarEnum vt, [MarshalAs (UnmanagedType.Struct)] ref object obj);
149 [DllImport ("libtest")]
150 public static extern int mono_test_marshal_variant_in_sbyte_unmanaged (VarFunc func);
152 [DllImport ("libtest")]
153 public static extern int mono_test_marshal_variant_in_byte_unmanaged (VarFunc func);
155 [DllImport ("libtest")]
156 public static extern int mono_test_marshal_variant_in_short_unmanaged (VarFunc func);
158 [DllImport ("libtest")]
159 public static extern int mono_test_marshal_variant_in_ushort_unmanaged (VarFunc func);
161 [DllImport ("libtest")]
162 public static extern int mono_test_marshal_variant_in_int_unmanaged (VarFunc func);
164 [DllImport ("libtest")]
165 public static extern int mono_test_marshal_variant_in_uint_unmanaged (VarFunc func);
167 [DllImport ("libtest")]
168 public static extern int mono_test_marshal_variant_in_long_unmanaged (VarFunc func);
170 [DllImport ("libtest")]
171 public static extern int mono_test_marshal_variant_in_ulong_unmanaged (VarFunc func);
173 [DllImport ("libtest")]
174 public static extern int mono_test_marshal_variant_in_float_unmanaged (VarFunc func);
176 [DllImport ("libtest")]
177 public static extern int mono_test_marshal_variant_in_double_unmanaged (VarFunc func);
179 [DllImport ("libtest")]
180 public static extern int mono_test_marshal_variant_in_bstr_unmanaged (VarFunc func);
182 [DllImport ("libtest")]
183 public static extern int mono_test_marshal_variant_in_bool_true_unmanaged (VarFunc func);
185 [DllImport ("libtest")]
186 public static extern int mono_test_marshal_variant_in_bool_false_unmanaged (VarFunc func);
188 [DllImport ("libtest")]
189 public static extern int mono_test_marshal_variant_out_sbyte_unmanaged (VarRefFunc func);
191 [DllImport ("libtest")]
192 public static extern int mono_test_marshal_variant_out_byte_unmanaged (VarRefFunc func);
194 [DllImport ("libtest")]
195 public static extern int mono_test_marshal_variant_out_short_unmanaged (VarRefFunc func);
197 [DllImport ("libtest")]
198 public static extern int mono_test_marshal_variant_out_ushort_unmanaged (VarRefFunc func);
200 [DllImport ("libtest")]
201 public static extern int mono_test_marshal_variant_out_int_unmanaged (VarRefFunc func);
203 [DllImport ("libtest")]
204 public static extern int mono_test_marshal_variant_out_uint_unmanaged (VarRefFunc func);
206 [DllImport ("libtest")]
207 public static extern int mono_test_marshal_variant_out_long_unmanaged (VarRefFunc func);
209 [DllImport ("libtest")]
210 public static extern int mono_test_marshal_variant_out_ulong_unmanaged (VarRefFunc func);
212 [DllImport ("libtest")]
213 public static extern int mono_test_marshal_variant_out_float_unmanaged (VarRefFunc func);
215 [DllImport ("libtest")]
216 public static extern int mono_test_marshal_variant_out_double_unmanaged (VarRefFunc func);
218 [DllImport ("libtest")]
219 public static extern int mono_test_marshal_variant_out_bstr_unmanaged (VarRefFunc func);
221 [DllImport ("libtest")]
222 public static extern int mono_test_marshal_variant_out_bool_true_unmanaged (VarRefFunc func);
224 [DllImport ("libtest")]
225 public static extern int mono_test_marshal_variant_out_bool_false_unmanaged (VarRefFunc func);
227 [DllImport ("libtest")]
228 public static extern int mono_test_marshal_com_object_create (out IntPtr pUnk);
230 [DllImport ("libtest")]
231 public static extern int mono_test_marshal_com_object_same (out IntPtr pUnk);
233 [DllImport ("libtest")]
234 public static extern int mono_test_marshal_com_object_destroy (IntPtr pUnk);
236 [DllImport ("libtest")]
237 public static extern int mono_test_marshal_com_object_ref_count (IntPtr pUnk);
239 [DllImport ("libtest")]
240 public static extern int mono_test_marshal_ccw_identity ([MarshalAs (UnmanagedType.Interface)]ITest itest);
242 [DllImport ("libtest")]
243 public static extern int mono_test_marshal_ccw_reflexive ([MarshalAs (UnmanagedType.Interface)]ITest itest);
245 [DllImport ("libtest")]
246 public static extern int mono_test_marshal_ccw_transitive ([MarshalAs (UnmanagedType.Interface)]ITest itest);
248 [DllImport ("libtest")]
249 public static extern int mono_test_marshal_ccw_itest ([MarshalAs (UnmanagedType.Interface)]ITest itest);
251 [DllImport ("libtest")]
252 public static extern int mono_test_marshal_ccw_itest ([MarshalAs (UnmanagedType.Interface)]ITestPresSig itest);
254 [DllImport("libtest")]
255 public static extern int mono_test_marshal_safearray_out_1dim_vt_bstr_empty ([MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)]out Array array);
257 [DllImport("libtest")]
258 public static extern int mono_test_marshal_safearray_out_1dim_vt_bstr ([MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)]out Array array);
260 [DllImport("libtest")]
261 public static extern int mono_test_marshal_safearray_out_2dim_vt_i4 ([MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)]out Array array);
263 [DllImport("libtest")]
264 public static extern int mono_test_marshal_safearray_out_4dim_vt_i4 ([MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)]out Array array);
266 [DllImport("libtest")]
267 public static extern int mono_test_marshal_safearray_in_byval_1dim_empty ([In, MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] Array array);
269 [DllImport("libtest")]
270 public static extern int mono_test_marshal_safearray_in_byval_1dim_vt_i4 ([In, MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] Array array);
272 [DllImport("libtest")]
273 public static extern int mono_test_marshal_safearray_in_byval_1dim_vt_mixed ([In, MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] Array array);
275 [DllImport("libtest")]
276 public static extern int mono_test_marshal_safearray_in_byval_2dim_vt_i4 ([In, MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] Array array);
278 [DllImport("libtest")]
279 public static extern int mono_test_marshal_safearray_in_byval_3dim_vt_bstr ([In, MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] Array array);
281 [DllImport("libtest")]
282 public static extern int mono_test_marshal_safearray_in_byref_3dim_vt_bstr ([In, MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] ref Array array);
284 [DllImport("libtest")]
285 public static extern int mono_test_marshal_safearray_in_out_byref_1dim_empty ([In, Out, MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] ref Array array);
287 [DllImport("libtest")]
288 public static extern int mono_test_marshal_safearray_in_out_byref_3dim_vt_bstr ([In, Out, MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] ref Array array);
290 [DllImport("libtest")]
291 public static extern int mono_test_marshal_safearray_in_out_byref_1dim_vt_i4 ([In, Out, MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] ref Array array);
293 [DllImport("libtest")]
294 public static extern int mono_test_marshal_safearray_in_out_byval_1dim_vt_i4 ([In, Out, MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] Array array);
296 [DllImport("libtest")]
297 public static extern int mono_test_marshal_safearray_in_out_byval_3dim_vt_bstr ([In, Out, MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] Array array);
299 [DllImport("libtest")]
300 public static extern int mono_test_marshal_safearray_mixed (
301 [In, Out, MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] Array array1,
302 [MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] out Array array2,
303 [In, MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] Array array3,
304 [In, Out, MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] ref Array array4);
306 [DllImport("libtest")]
307 public static extern bool mono_cominterop_is_supported ();
309 public static int Main ()
312 bool isWindows = !(((int)Environment.OSVersion.Platform == 4) ||
313 ((int)Environment.OSVersion.Platform == 128));
315 if (mono_cominterop_is_supported () || isWindows)
320 if (mono_test_marshal_bstr_in ("mono_test_marshal_bstr_in") != 0)
322 if (mono_test_marshal_bstr_out (out str) != 0 || str != "mono_test_marshal_bstr_out")
324 if (mono_test_marshal_bstr_in_null (null) != 0)
326 if (mono_test_marshal_bstr_out_null (out str) != 0 || str != null)
329 #endregion // BSTR Tests
331 #region VARIANT Tests
334 if (mono_test_marshal_variant_in_sbyte ((sbyte)100) != 0)
336 if (mono_test_marshal_variant_in_byte ((byte)100) != 0)
338 if (mono_test_marshal_variant_in_short ((short)314) != 0)
340 if (mono_test_marshal_variant_in_ushort ((ushort)314) != 0)
342 if (mono_test_marshal_variant_in_int ((int)314) != 0)
344 if (mono_test_marshal_variant_in_uint ((uint)314) != 0)
346 if (mono_test_marshal_variant_in_long ((long)314) != 0)
348 if (mono_test_marshal_variant_in_ulong ((ulong)314) != 0)
350 if (mono_test_marshal_variant_in_float ((float)3.14) != 0)
352 if (mono_test_marshal_variant_in_double ((double)3.14) != 0)
354 if (mono_test_marshal_variant_in_bstr ("PI") != 0)
356 if (mono_test_marshal_variant_out_sbyte (out obj) != 0 || (sbyte)obj != 100)
358 if (mono_test_marshal_variant_out_byte (out obj) != 0 || (byte)obj != 100)
360 if (mono_test_marshal_variant_out_short (out obj) != 0 || (short)obj != 314)
362 if (mono_test_marshal_variant_out_ushort (out obj) != 0 || (ushort)obj != 314)
364 if (mono_test_marshal_variant_out_int (out obj) != 0 || (int)obj != 314)
366 if (mono_test_marshal_variant_out_uint (out obj) != 0 || (uint)obj != 314)
368 if (mono_test_marshal_variant_out_long (out obj) != 0 || (long)obj != 314)
370 if (mono_test_marshal_variant_out_ulong (out obj) != 0 || (ulong)obj != 314)
372 if (mono_test_marshal_variant_out_float (out obj) != 0 || ((float)obj - 3.14) / 3.14 > .001)
374 if (mono_test_marshal_variant_out_double (out obj) != 0 || ((double)obj - 3.14) / 3.14 > .001)
376 if (mono_test_marshal_variant_out_bstr (out obj) != 0 || (string)obj != "PI")
379 VarFunc func = new VarFunc (mono_test_marshal_variant_in_callback);
380 if (mono_test_marshal_variant_in_sbyte_unmanaged (func) != 0)
382 if (mono_test_marshal_variant_in_byte_unmanaged (func) != 0)
384 if (mono_test_marshal_variant_in_short_unmanaged (func) != 0)
386 if (mono_test_marshal_variant_in_ushort_unmanaged (func) != 0)
388 if (mono_test_marshal_variant_in_int_unmanaged (func) != 0)
390 if (mono_test_marshal_variant_in_uint_unmanaged (func) != 0)
392 if (mono_test_marshal_variant_in_long_unmanaged (func) != 0)
394 if (mono_test_marshal_variant_in_ulong_unmanaged (func) != 0)
396 if (mono_test_marshal_variant_in_float_unmanaged (func) != 0)
398 if (mono_test_marshal_variant_in_double_unmanaged (func) != 0)
400 if (mono_test_marshal_variant_in_bstr_unmanaged (func) != 0)
402 if (mono_test_marshal_variant_in_bool_true_unmanaged (func) != 0)
405 VarRefFunc reffunc = new VarRefFunc (mono_test_marshal_variant_out_callback);
406 if (mono_test_marshal_variant_out_sbyte_unmanaged (reffunc) != 0)
408 if (mono_test_marshal_variant_out_byte_unmanaged (reffunc) != 0)
410 if (mono_test_marshal_variant_out_short_unmanaged (reffunc) != 0)
412 if (mono_test_marshal_variant_out_ushort_unmanaged (reffunc) != 0)
414 if (mono_test_marshal_variant_out_int_unmanaged (reffunc) != 0)
416 if (mono_test_marshal_variant_out_uint_unmanaged (reffunc) != 0)
418 if (mono_test_marshal_variant_out_long_unmanaged (reffunc) != 0)
420 if (mono_test_marshal_variant_out_ulong_unmanaged (reffunc) != 0)
422 if (mono_test_marshal_variant_out_float_unmanaged (reffunc) != 0)
424 if (mono_test_marshal_variant_out_double_unmanaged (reffunc) != 0)
426 if (mono_test_marshal_variant_out_bstr_unmanaged (reffunc) != 0)
428 if (mono_test_marshal_variant_out_bool_true_unmanaged (reffunc) != 0)
431 if (mono_test_marshal_variant_out_sbyte_byref (out obj) != 0 || (sbyte)obj != 100)
433 if (mono_test_marshal_variant_out_byte_byref (out obj) != 0 || (byte)obj != 100)
435 if (mono_test_marshal_variant_out_short_byref (out obj) != 0 || (short)obj != 314)
437 if (mono_test_marshal_variant_out_ushort_byref (out obj) != 0 || (ushort)obj != 314)
439 if (mono_test_marshal_variant_out_int_byref (out obj) != 0 || (int)obj != 314)
441 if (mono_test_marshal_variant_out_uint_byref (out obj) != 0 || (uint)obj != 314)
443 if (mono_test_marshal_variant_out_long_byref (out obj) != 0 || (long)obj != 314)
445 if (mono_test_marshal_variant_out_ulong_byref (out obj) != 0 || (ulong)obj != 314)
447 if (mono_test_marshal_variant_out_float_byref (out obj) != 0 || ((float)obj - 3.14) / 3.14 > .001)
449 if (mono_test_marshal_variant_out_double_byref (out obj) != 0 || ((double)obj - 3.14) / 3.14 > .001)
451 if (mono_test_marshal_variant_out_bstr_byref (out obj) != 0 || (string)obj != "PI")
454 #endregion // VARIANT Tests
456 #region Runtime Callable Wrapper Tests
461 if (mono_test_marshal_com_object_create (out pUnk) != 0)
464 if (mono_test_marshal_com_object_ref_count (pUnk) != 1)
467 if (Marshal.AddRef (pUnk) != 2)
470 if (mono_test_marshal_com_object_ref_count (pUnk) != 2)
473 if (Marshal.Release (pUnk) != 1)
476 if (mono_test_marshal_com_object_ref_count (pUnk) != 1)
479 object com_obj = Marshal.GetObjectForIUnknown (pUnk);
484 ITest itest = com_obj as ITest;
490 if (mono_test_marshal_com_object_same (out pUnk2) != 0)
493 object com_obj2 = Marshal.GetObjectForIUnknown (pUnk2);
495 if (com_obj != com_obj2)
498 if (!com_obj.Equals (com_obj2))
502 if (mono_test_marshal_com_object_create (out pUnk3) != 0)
505 object com_obj3 = Marshal.GetObjectForIUnknown (pUnk3);
506 if (com_obj == com_obj3)
509 if (com_obj.Equals (com_obj3))
512 // com_obj & com_obj2 share a RCW
513 if (Marshal.ReleaseComObject (com_obj2) != 1)
516 // com_obj3 should only have one RCW
517 if (Marshal.ReleaseComObject (com_obj3) != 0)
520 IntPtr iunknown = Marshal.GetIUnknownForObject (com_obj);
521 if (iunknown == IntPtr.Zero)
524 if (pUnk != iunknown)
527 if (TestITest (itest) != 0)
530 if (TestITestPresSig (itest as ITestPresSig) != 0)
533 if (TestITestDelegate (itest) != 0)
536 if (TestIfaceNoIcall (itest as ITestPresSig) != 0)
539 itest = new TestClass ();
541 if (TestITest (itest) != 0)
544 itest = (ITest)System.Activator.CreateInstance (typeof(TestActivatorClass));
546 if (TestITest (itest) != 0)
552 #endregion // Runtime Callable Wrapper Tests
554 #region COM Callable Wrapper Tests
556 ManagedTest test = new ManagedTest ();
558 mono_test_marshal_ccw_itest (test);
560 if (test.Status != 0)
563 ManagedTestPresSig test_pres_sig = new ManagedTestPresSig ();
565 mono_test_marshal_ccw_itest (test_pres_sig);
567 #endregion // COM Callable Wrapper Tests
569 #region SAFEARRAY tests
576 if ((mono_test_marshal_safearray_out_1dim_vt_bstr_empty (out array) != 0) || (array.Rank != 1) || (array.Length != 0))
579 if ((mono_test_marshal_safearray_out_1dim_vt_bstr (out array) != 0) || (array.Rank != 1) || (array.Length != 10))
581 for (int i = 0; i < 10; ++i) {
582 if (i != Convert.ToInt32 (array.GetValue (i)))
586 if ((mono_test_marshal_safearray_out_2dim_vt_i4 (out array) != 0) || (array.Rank != 2))
588 if ( (array.GetLowerBound (0) != 0) || (array.GetUpperBound (0) != 3)
589 || (array.GetLowerBound (1) != 0) || (array.GetUpperBound (1) != 2))
591 for (int i = array.GetLowerBound (0); i <= array.GetUpperBound (0); ++i)
593 for (int j = array.GetLowerBound (1); j <= array.GetUpperBound (1); ++j) {
594 if ((i + 1) * 10 + (j + 1) != (int)array.GetValue (new long[] { i, j }))
599 if ((mono_test_marshal_safearray_out_4dim_vt_i4 (out array) != 0) || (array.Rank != 4))
601 if ( (array.GetLowerBound (0) != 15) || (array.GetUpperBound (0) != 24)
602 || (array.GetLowerBound (1) != 20) || (array.GetUpperBound (1) != 22)
603 || (array.GetLowerBound (2) != 5) || (array.GetUpperBound (2) != 10)
604 || (array.GetLowerBound (3) != 12) || (array.GetUpperBound (3) != 18) )
608 for (int i = array.GetLowerBound (3); i <= array.GetUpperBound (3); ++i) {
609 for (int j = array.GetLowerBound (2); j <= array.GetUpperBound (2); ++j) {
610 for (int k = array.GetLowerBound (1); k <= array.GetUpperBound (1); ++k) {
611 for (int l = array.GetLowerBound (0); l <= array.GetUpperBound (0); ++l) {
612 if (index != (int)array.GetValue (new long[] { l, k, j, i }))
622 array = new object[] { };
623 if (mono_test_marshal_safearray_in_byval_1dim_empty (array) != 0)
626 array = new object[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
627 if (mono_test_marshal_safearray_in_byval_1dim_vt_i4 (array) != 0)
630 array = new object[] { 0, "1", 2, "3", 4, "5", 6, "7", 8, "9", 10, "11", 12 };
631 if (mono_test_marshal_safearray_in_byval_1dim_vt_mixed (array) != 0)
633 if ((int)array.GetValue (0) != 0)
636 array = new object[,] { { 11, 12, 13, 14 }, { 21, 22, 23, 24 } };
637 if (mono_test_marshal_safearray_in_byval_2dim_vt_i4 (array) != 0)
639 if ((int)array.GetValue (new int[] { 0, 0 }) != 11)
642 array = new object[,,] { { { "111", "112", "113" }, { "121", "122", "123" } }, { { "211", "212", "213" }, { "221", "222", "223" } } };
643 if (mono_test_marshal_safearray_in_byval_3dim_vt_bstr (array) != 0)
645 if ((string)array.GetValue (new int[] { 0, 0, 0 }) != "111")
648 array = new object[,,] { { { "111", "112", "113" }, { "121", "122", "123" } }, { { "211", "212", "213" }, { "221", "222", "223" } } };
649 if ((mono_test_marshal_safearray_in_byref_3dim_vt_bstr (ref array) != 0) || (array.Rank != 3) || (array.Length != 12))
651 if ((string)array.GetValue (new int[] { 0, 0, 0 }) != "111")
656 array = new object[] { };
657 if ((mono_test_marshal_safearray_in_out_byref_1dim_empty (ref array) != 0) || (array.Rank != 1) || (array.Length != 8))
659 for (int i = 0; i < 8; ++i)
661 if (i != Convert.ToInt32 (array.GetValue (i)))
665 array = new object[,,] { { { "111", "112", "113" }, { "121", "122", "123" } }, { { "211", "212", "213" }, { "221", "222", "223" } } };
666 if ((mono_test_marshal_safearray_in_out_byref_3dim_vt_bstr (ref array) != 0) || (array.Rank != 1) || (array.Length != 8))
668 for (int i = 0; i < 8; ++i)
670 if (i != Convert.ToInt32 (array.GetValue (i)))
674 array = new object[] { 1 };
675 if ((mono_test_marshal_safearray_in_out_byref_1dim_vt_i4 (ref array) != 0) || (array.Rank != 1) || (array.Length != 1))
679 if (Convert.ToInt32 (array.GetValue (0)) != -1)
684 array = new object[] { 1 };
685 if ((mono_test_marshal_safearray_in_out_byval_1dim_vt_i4 (array) != 0) || (array.Rank != 1) || (array.Length != 1))
689 if (Convert.ToInt32 (array.GetValue (0)) != 12345)
692 array = new object[,,] { { { "111", "112", "113" }, { "121", "122", "123" } }, { { "211", "212", "213" }, { "221", "222", "223" } } };
693 if ((mono_test_marshal_safearray_in_out_byval_3dim_vt_bstr (array) != 0) || (array.Rank != 3) || (array.Length != 12))
697 if (Convert.ToInt32 (array.GetValue (new int[] { 1, 1, 1 })) != 111)
699 if (Convert.ToInt32 (array.GetValue (new int[] { 1, 1, 2 })) != 333)
701 if (Convert.ToString(array.GetValue (new int[] { 0, 1, 0 })) != "ABCDEFG")
704 /* Multiple safearray parameters with various types and options */
706 Array array1 = new object[] { 1 };
707 Array array2 = new object[,] { { 11, 12, 13, 14 }, { 21, 22, 23, 24 } };
708 Array array3 = new object[] { 0, "1", 2, "3", 4, "5", 6, "7", 8, "9", 10, "11", 12 };
709 Array array4 = new object[,,] { { { "111", "112", "113" }, { "121", "122", "123" } }, { { "211", "212", "213" }, { "221", "222", "223" } } };
710 if ( (mono_test_marshal_safearray_mixed (array1, out array2, array3, ref array4) != 0)
711 || (array1.Rank != 1) || (array1.Length != 1) || (Convert.ToInt32 (array1.GetValue (0)) != 12345)
712 || (array2.Rank != 1) || (array2.Length != 10)
713 || (array4.Rank != 1) || (array4.Length != 8)
718 for (int i = 0; i < 10; ++i)
720 if (i != Convert.ToInt32 (array2.GetValue (i)))
723 if ((int)array3.GetValue (0) != 0)
725 for (int i = 0; i < 8; ++i)
727 if (i != Convert.ToInt32 (array4.GetValue (i)))
731 #endregion // SafeArray Tests
733 #region COM Visible Test
734 TestVisible test_vis = new TestVisible();
735 IntPtr pDisp = Marshal.GetIDispatchForObject(test_vis);
736 if (pDisp == IntPtr.Zero)
746 [Guid ("00000000-0000-0000-0000-000000000001")]
747 [InterfaceType (ComInterfaceType.InterfaceIsIUnknown)]
748 public interface ITest
750 // properties need to go first since mcs puts them there
753 [return: MarshalAs (UnmanagedType.Interface)]
754 [MethodImpl (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId (5242884)]
758 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
759 void SByteIn (sbyte val);
760 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
761 void ByteIn (byte val);
762 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
763 void ShortIn (short val);
764 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
765 void UShortIn (ushort val);
766 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
767 void IntIn (int val);
768 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
769 void UIntIn (uint val);
770 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
771 void LongIn (long val);
772 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
773 void ULongIn (ulong val);
774 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
775 void FloatIn (float val);
776 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
777 void DoubleIn (double val);
778 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
779 void ITestIn ([MarshalAs (UnmanagedType.Interface)]ITest val);
780 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
781 void ITestOut ([MarshalAs (UnmanagedType.Interface)]out ITest val);
782 int Return22NoICall();
786 [Guid ("00000000-0000-0000-0000-000000000001")]
787 [InterfaceType (ComInterfaceType.InterfaceIsIUnknown)]
788 public interface ITestPresSig
790 // properties need to go first since mcs puts them there
793 [return: MarshalAs (UnmanagedType.Interface)]
794 [MethodImpl (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId (5242884)]
798 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
800 int SByteIn (sbyte val);
801 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
803 int ByteIn (byte val);
804 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
806 int ShortIn (short val);
807 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
809 int UShortIn (ushort val);
810 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
813 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
815 int UIntIn (uint val);
816 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
818 int LongIn (long val);
819 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
821 int ULongIn (ulong val);
822 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
824 int FloatIn (float val);
825 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
827 int DoubleIn (double val);
828 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
830 int ITestIn ([MarshalAs (UnmanagedType.Interface)]ITestPresSig val);
831 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
833 int ITestOut ([MarshalAs (UnmanagedType.Interface)]out ITestPresSig val);
835 int Return22NoICall();
838 [System.Runtime.InteropServices.GuidAttribute ("00000000-0000-0000-0000-000000000002")]
839 [System.Runtime.InteropServices.ComImportAttribute ()]
840 [System.Runtime.InteropServices.ClassInterfaceAttribute (ClassInterfaceType.None)]
841 public class _TestClass : ITest
843 // properties need to go first since mcs puts them there
844 public virtual extern ITest Test
846 [return: MarshalAs (UnmanagedType.Interface)]
847 [MethodImpl (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId (5242884)]
851 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
852 public virtual extern void SByteIn (sbyte val);
853 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
854 public virtual extern void ByteIn (byte val);
855 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
856 public virtual extern void ShortIn (short val);
857 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
858 public virtual extern void UShortIn (ushort val);
859 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
860 public virtual extern void IntIn (int val);
861 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
862 public virtual extern void UIntIn (uint val);
863 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
864 public virtual extern void LongIn (long val);
865 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
866 public virtual extern void ULongIn (ulong val);
867 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
868 public virtual extern void FloatIn (float val);
869 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
870 public virtual extern void DoubleIn (double val);
871 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
872 public virtual extern void ITestIn ([MarshalAs (UnmanagedType.Interface)]ITest val);
873 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
874 public virtual extern void ITestOut ([MarshalAs (UnmanagedType.Interface)]out ITest val);
876 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
877 public virtual extern int Return22NoICall();
880 [System.Runtime.InteropServices.GuidAttribute ("00000000-0000-0000-0000-000000000002")]
881 public class TestClass : _TestClass
885 ExtensibleClassFactory.RegisterObjectCreationCallback (new ObjectCreationDelegate (CreateObject)); ;
887 private static System.IntPtr CreateObject (System.IntPtr aggr)
890 mono_test_marshal_com_object_create (out pUnk3);
895 [System.Runtime.InteropServices.GuidAttribute ("00000000-0000-0000-0000-000000000003")]
896 public class TestActivatorClass : _TestClass
898 static TestActivatorClass ()
900 ExtensibleClassFactory.RegisterObjectCreationCallback (new ObjectCreationDelegate (CreateObject)); ;
902 private static System.IntPtr CreateObject (System.IntPtr aggr)
905 mono_test_marshal_com_object_create (out pUnk3);
910 delegate void SByteInDelegate (sbyte val);
911 delegate void ByteInDelegate (byte val);
912 delegate void ShortInDelegate (short val);
913 delegate void UShortInDelegate (ushort val);
914 delegate void IntInDelegate (int val);
915 delegate void UIntInDelegate (uint val);
916 delegate void LongInDelegate (long val);
917 delegate void ULongInDelegate (ulong val);
918 delegate void FloatInDelegate (float val);
919 delegate void DoubleInDelegate (double val);
920 delegate void ITestInDelegate (ITest val);
921 delegate void ITestOutDelegate (out ITest val);
923 public class ManagedTestPresSig : ITestPresSig
924 { // properties need to go first since mcs puts them there
925 public ITestPresSig Test
929 return new ManagedTestPresSig ();
933 public int SByteIn (sbyte val)
940 public int ByteIn (byte val)
947 public int ShortIn (short val)
954 public int UShortIn (ushort val)
961 public int IntIn (int val)
968 public int UIntIn (uint val)
975 public int LongIn (long val)
982 public int ULongIn (ulong val)
989 public int FloatIn (float val)
991 if (Math.Abs (val - 3.14f) > .000001)
996 public int DoubleIn (double val)
998 if (Math.Abs (val - 3.14f) > .000001)
1003 public int ITestIn ([MarshalAs (UnmanagedType.Interface)]ITestPresSig val)
1007 if (null == val as ManagedTestPresSig)
1012 public int ITestOut ([MarshalAs (UnmanagedType.Interface)]out ITestPresSig val)
1014 val = new ManagedTestPresSig ();
1018 public int Return22NoICall()
1024 public class ManagedTest : ITest
1026 private int status = 0;
1029 get { return status; }
1031 public void SByteIn (sbyte val)
1037 public void ByteIn (byte val)
1043 public void ShortIn (short val)
1049 public void UShortIn (ushort val)
1055 public void IntIn (int val)
1061 public void UIntIn (uint val)
1067 public void LongIn (long val)
1073 public void ULongIn (ulong val)
1079 public void FloatIn (float val)
1081 if (Math.Abs (val - 3.14f) > .000001)
1085 public void DoubleIn (double val)
1087 if (Math.Abs (val - 3.14) > .000001)
1091 public void ITestIn (ITest val)
1095 if (null == val as ManagedTest)
1099 public void ITestOut (out ITest val)
1101 val = new ManagedTest ();
1108 return new ManagedTest ();
1112 public int Return22NoICall()
1118 public static int mono_test_marshal_variant_in_callback (VarEnum vt, object obj)
1123 if (obj.GetType () != typeof (sbyte))
1125 if ((sbyte)obj != -100)
1128 case VarEnum.VT_UI1:
1129 if (obj.GetType () != typeof (byte))
1131 if ((byte)obj != 100)
1135 if (obj.GetType () != typeof (short))
1137 if ((short)obj != -100)
1140 case VarEnum.VT_UI2:
1141 if (obj.GetType () != typeof (ushort))
1143 if ((ushort)obj != 100)
1147 if (obj.GetType () != typeof (int))
1149 if ((int)obj != -100)
1152 case VarEnum.VT_UI4:
1153 if (obj.GetType () != typeof (uint))
1155 if ((uint)obj != 100)
1159 if (obj.GetType () != typeof (long))
1161 if ((long)obj != -100)
1164 case VarEnum.VT_UI8:
1165 if (obj.GetType () != typeof (ulong))
1167 if ((ulong)obj != 100)
1171 if (obj.GetType () != typeof (float))
1173 if (Math.Abs ((float)obj - 3.14f) > 1e-10)
1177 if (obj.GetType () != typeof (double))
1179 if (Math.Abs ((double)obj - 3.14) > 1e-10)
1182 case VarEnum.VT_BSTR:
1183 if (obj.GetType () != typeof (string))
1185 if ((string)obj != "PI")
1188 case VarEnum.VT_BOOL:
1189 if (obj.GetType () != typeof (bool))
1191 if ((bool)obj != true)
1198 public static int mono_test_marshal_variant_out_callback (VarEnum vt, ref object obj)
1204 case VarEnum.VT_UI1:
1210 case VarEnum.VT_UI2:
1216 case VarEnum.VT_UI4:
1222 case VarEnum.VT_UI8:
1231 case VarEnum.VT_BSTR:
1234 case VarEnum.VT_BOOL:
1241 public static int TestITest (ITest itest)
1245 itest.SByteIn (-100);
1247 itest.ShortIn (-100);
1248 itest.UShortIn (100);
1251 itest.LongIn (-100);
1252 itest.ULongIn (100);
1253 itest.FloatIn (3.14f);
1254 itest.DoubleIn (3.14);
1255 itest.ITestIn (itest);
1256 itest.ITestOut (out itest2);
1258 catch (Exception ex) {
1264 public static int TestITestPresSig (ITestPresSig itest)
1266 ITestPresSig itest2;
1267 if (itest.SByteIn (-100) != 0)
1269 if (itest.ByteIn (100) != 0)
1271 if (itest.ShortIn (-100) != 0)
1273 if (itest.UShortIn (100) != 0)
1275 if (itest.IntIn (-100) != 0)
1277 if (itest.UIntIn (100) != 0)
1279 if (itest.LongIn (-100) != 0)
1281 if (itest.ULongIn (100) != 0)
1283 if (itest.FloatIn (3.14f) != 0)
1285 if (itest.DoubleIn (3.14) != 0)
1287 if (itest.ITestIn (itest) != 0)
1289 if (itest.ITestOut (out itest2) != 0)
1294 public static int TestITestDelegate (ITest itest)
1299 SByteInDelegate SByteInFcn= itest.SByteIn;
1300 ByteInDelegate ByteInFcn = itest.ByteIn;
1301 UShortInDelegate UShortInFcn = itest.UShortIn;
1302 IntInDelegate IntInFcn = itest.IntIn;
1303 UIntInDelegate UIntInFcn = itest.UIntIn;
1304 LongInDelegate LongInFcn = itest.LongIn;
1306 ULongInDelegate ULongInFcn = itest.ULongIn;
1307 FloatInDelegate FloatInFcn = itest.FloatIn;
1308 DoubleInDelegate DoubleInFcn = itest.DoubleIn;
1309 ITestInDelegate ITestInFcn = itest.ITestIn;
1310 ITestOutDelegate ITestOutFcn = itest.ITestOut;
1322 ITestOutFcn (out itest2);
1330 public static int TestIfaceNoIcall (ITestPresSig itest) {
1331 return itest.Return22NoICall () == 22 ? 0 : 1;
1335 public class TestVisible