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_array_ccw_itest (int count, [MarshalAs (UnmanagedType.LPArray, SizeParamIndex=0)] ITest[] ppUnk);
257 [DllImport("libtest")]
258 public static extern int mono_test_marshal_safearray_out_1dim_vt_bstr_empty ([MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)]out Array array);
260 [DllImport("libtest")]
261 public static extern int mono_test_marshal_safearray_out_1dim_vt_bstr ([MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)]out Array array);
263 [DllImport("libtest")]
264 public static extern int mono_test_marshal_safearray_out_2dim_vt_i4 ([MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)]out Array array);
266 [DllImport("libtest")]
267 public static extern int mono_test_marshal_safearray_out_4dim_vt_i4 ([MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)]out Array array);
269 [DllImport("libtest")]
270 public static extern int mono_test_marshal_safearray_in_byval_1dim_empty ([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_i4 ([In, MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] Array array);
275 [DllImport("libtest")]
276 public static extern int mono_test_marshal_safearray_in_byval_1dim_vt_mixed ([In, MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] Array array);
278 [DllImport("libtest")]
279 public static extern int mono_test_marshal_safearray_in_byval_2dim_vt_i4 ([In, MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] Array array);
281 [DllImport("libtest")]
282 public static extern int mono_test_marshal_safearray_in_byval_3dim_vt_bstr ([In, MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] Array array);
284 [DllImport("libtest")]
285 public static extern int mono_test_marshal_safearray_in_byref_3dim_vt_bstr ([In, 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_1dim_empty ([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_3dim_vt_bstr ([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_byref_1dim_vt_i4 ([In, Out, MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] ref Array array);
296 [DllImport("libtest")]
297 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);
299 [DllImport("libtest")]
300 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);
302 [DllImport("libtest")]
303 public static extern int mono_test_marshal_safearray_mixed (
304 [In, Out, MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] Array array1,
305 [MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] out Array array2,
306 [In, MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] Array array3,
307 [In, Out, MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] ref Array array4);
309 [DllImport("libtest")]
310 public static extern bool mono_cominterop_is_supported ();
312 public static int Main ()
315 bool isWindows = !(((int)Environment.OSVersion.Platform == 4) ||
316 ((int)Environment.OSVersion.Platform == 128));
318 if (mono_cominterop_is_supported () || isWindows)
323 if (mono_test_marshal_bstr_in ("mono_test_marshal_bstr_in") != 0)
325 if (mono_test_marshal_bstr_out (out str) != 0 || str != "mono_test_marshal_bstr_out")
327 if (mono_test_marshal_bstr_in_null (null) != 0)
329 if (mono_test_marshal_bstr_out_null (out str) != 0 || str != null)
332 #endregion // BSTR Tests
334 #region VARIANT Tests
337 if (mono_test_marshal_variant_in_sbyte ((sbyte)100) != 0)
339 if (mono_test_marshal_variant_in_byte ((byte)100) != 0)
341 if (mono_test_marshal_variant_in_short ((short)314) != 0)
343 if (mono_test_marshal_variant_in_ushort ((ushort)314) != 0)
345 if (mono_test_marshal_variant_in_int ((int)314) != 0)
347 if (mono_test_marshal_variant_in_uint ((uint)314) != 0)
349 if (mono_test_marshal_variant_in_long ((long)314) != 0)
351 if (mono_test_marshal_variant_in_ulong ((ulong)314) != 0)
353 if (mono_test_marshal_variant_in_float ((float)3.14) != 0)
355 if (mono_test_marshal_variant_in_double ((double)3.14) != 0)
357 if (mono_test_marshal_variant_in_bstr ("PI") != 0)
359 if (mono_test_marshal_variant_out_sbyte (out obj) != 0 || (sbyte)obj != 100)
361 if (mono_test_marshal_variant_out_byte (out obj) != 0 || (byte)obj != 100)
363 if (mono_test_marshal_variant_out_short (out obj) != 0 || (short)obj != 314)
365 if (mono_test_marshal_variant_out_ushort (out obj) != 0 || (ushort)obj != 314)
367 if (mono_test_marshal_variant_out_int (out obj) != 0 || (int)obj != 314)
369 if (mono_test_marshal_variant_out_uint (out obj) != 0 || (uint)obj != 314)
371 if (mono_test_marshal_variant_out_long (out obj) != 0 || (long)obj != 314)
373 if (mono_test_marshal_variant_out_ulong (out obj) != 0 || (ulong)obj != 314)
375 if (mono_test_marshal_variant_out_float (out obj) != 0 || ((float)obj - 3.14) / 3.14 > .001)
377 if (mono_test_marshal_variant_out_double (out obj) != 0 || ((double)obj - 3.14) / 3.14 > .001)
379 if (mono_test_marshal_variant_out_bstr (out obj) != 0 || (string)obj != "PI")
382 VarFunc func = new VarFunc (mono_test_marshal_variant_in_callback);
383 if (mono_test_marshal_variant_in_sbyte_unmanaged (func) != 0)
385 if (mono_test_marshal_variant_in_byte_unmanaged (func) != 0)
387 if (mono_test_marshal_variant_in_short_unmanaged (func) != 0)
389 if (mono_test_marshal_variant_in_ushort_unmanaged (func) != 0)
391 if (mono_test_marshal_variant_in_int_unmanaged (func) != 0)
393 if (mono_test_marshal_variant_in_uint_unmanaged (func) != 0)
395 if (mono_test_marshal_variant_in_long_unmanaged (func) != 0)
397 if (mono_test_marshal_variant_in_ulong_unmanaged (func) != 0)
399 if (mono_test_marshal_variant_in_float_unmanaged (func) != 0)
401 if (mono_test_marshal_variant_in_double_unmanaged (func) != 0)
403 if (mono_test_marshal_variant_in_bstr_unmanaged (func) != 0)
405 if (mono_test_marshal_variant_in_bool_true_unmanaged (func) != 0)
408 VarRefFunc reffunc = new VarRefFunc (mono_test_marshal_variant_out_callback);
409 if (mono_test_marshal_variant_out_sbyte_unmanaged (reffunc) != 0)
411 if (mono_test_marshal_variant_out_byte_unmanaged (reffunc) != 0)
413 if (mono_test_marshal_variant_out_short_unmanaged (reffunc) != 0)
415 if (mono_test_marshal_variant_out_ushort_unmanaged (reffunc) != 0)
417 if (mono_test_marshal_variant_out_int_unmanaged (reffunc) != 0)
419 if (mono_test_marshal_variant_out_uint_unmanaged (reffunc) != 0)
421 if (mono_test_marshal_variant_out_long_unmanaged (reffunc) != 0)
423 if (mono_test_marshal_variant_out_ulong_unmanaged (reffunc) != 0)
425 if (mono_test_marshal_variant_out_float_unmanaged (reffunc) != 0)
427 if (mono_test_marshal_variant_out_double_unmanaged (reffunc) != 0)
429 if (mono_test_marshal_variant_out_bstr_unmanaged (reffunc) != 0)
431 if (mono_test_marshal_variant_out_bool_true_unmanaged (reffunc) != 0)
434 if (mono_test_marshal_variant_out_sbyte_byref (out obj) != 0 || (sbyte)obj != 100)
436 if (mono_test_marshal_variant_out_byte_byref (out obj) != 0 || (byte)obj != 100)
438 if (mono_test_marshal_variant_out_short_byref (out obj) != 0 || (short)obj != 314)
440 if (mono_test_marshal_variant_out_ushort_byref (out obj) != 0 || (ushort)obj != 314)
442 if (mono_test_marshal_variant_out_int_byref (out obj) != 0 || (int)obj != 314)
444 if (mono_test_marshal_variant_out_uint_byref (out obj) != 0 || (uint)obj != 314)
446 if (mono_test_marshal_variant_out_long_byref (out obj) != 0 || (long)obj != 314)
448 if (mono_test_marshal_variant_out_ulong_byref (out obj) != 0 || (ulong)obj != 314)
450 if (mono_test_marshal_variant_out_float_byref (out obj) != 0 || ((float)obj - 3.14) / 3.14 > .001)
452 if (mono_test_marshal_variant_out_double_byref (out obj) != 0 || ((double)obj - 3.14) / 3.14 > .001)
454 if (mono_test_marshal_variant_out_bstr_byref (out obj) != 0 || (string)obj != "PI")
457 #endregion // VARIANT Tests
459 #region Runtime Callable Wrapper Tests
464 if (mono_test_marshal_com_object_create (out pUnk) != 0)
467 if (mono_test_marshal_com_object_ref_count (pUnk) != 1)
470 if (Marshal.AddRef (pUnk) != 2)
473 if (mono_test_marshal_com_object_ref_count (pUnk) != 2)
476 if (Marshal.Release (pUnk) != 1)
479 if (mono_test_marshal_com_object_ref_count (pUnk) != 1)
482 object com_obj = Marshal.GetObjectForIUnknown (pUnk);
487 ITest itest = com_obj as ITest;
493 if (mono_test_marshal_com_object_same (out pUnk2) != 0)
496 object com_obj2 = Marshal.GetObjectForIUnknown (pUnk2);
498 if (com_obj != com_obj2)
501 if (!com_obj.Equals (com_obj2))
505 if (mono_test_marshal_com_object_create (out pUnk3) != 0)
508 object com_obj3 = Marshal.GetObjectForIUnknown (pUnk3);
509 if (com_obj == com_obj3)
512 if (com_obj.Equals (com_obj3))
515 // com_obj & com_obj2 share a RCW
516 if (Marshal.ReleaseComObject (com_obj2) != 1)
519 // com_obj3 should only have one RCW
520 if (Marshal.ReleaseComObject (com_obj3) != 0)
523 IntPtr iunknown = Marshal.GetIUnknownForObject (com_obj);
524 if (iunknown == IntPtr.Zero)
527 if (pUnk != iunknown)
530 if (TestITest (itest) != 0)
533 if (TestITestPresSig (itest as ITestPresSig) != 0)
536 if (TestITestDelegate (itest) != 0)
539 if (TestIfaceNoIcall (itest as ITestPresSig) != 0)
542 itest = new TestClass ();
544 if (TestITest (itest) != 0)
547 itest = (ITest)System.Activator.CreateInstance (typeof(TestActivatorClass));
549 if (TestITest (itest) != 0)
555 #endregion // Runtime Callable Wrapper Tests
557 #region COM Callable Wrapper Tests
559 ManagedTest test = new ManagedTest ();
561 mono_test_marshal_ccw_itest (test);
563 if (test.Status != 0)
566 ManagedTestPresSig test_pres_sig = new ManagedTestPresSig ();
568 mono_test_marshal_ccw_itest (test_pres_sig);
570 // test for Xamarin-47560
571 var tests = new[] { test.Test };
572 if (mono_test_marshal_array_ccw_itest (1, tests) != 0)
575 #endregion // COM Callable Wrapper Tests
577 #region SAFEARRAY tests
584 if ((mono_test_marshal_safearray_out_1dim_vt_bstr_empty (out array) != 0) || (array.Rank != 1) || (array.Length != 0))
587 if ((mono_test_marshal_safearray_out_1dim_vt_bstr (out array) != 0) || (array.Rank != 1) || (array.Length != 10))
589 for (int i = 0; i < 10; ++i) {
590 if (i != Convert.ToInt32 (array.GetValue (i)))
594 if ((mono_test_marshal_safearray_out_2dim_vt_i4 (out array) != 0) || (array.Rank != 2))
596 if ( (array.GetLowerBound (0) != 0) || (array.GetUpperBound (0) != 3)
597 || (array.GetLowerBound (1) != 0) || (array.GetUpperBound (1) != 2))
599 for (int i = array.GetLowerBound (0); i <= array.GetUpperBound (0); ++i)
601 for (int j = array.GetLowerBound (1); j <= array.GetUpperBound (1); ++j) {
602 if ((i + 1) * 10 + (j + 1) != (int)array.GetValue (new long[] { i, j }))
607 if ((mono_test_marshal_safearray_out_4dim_vt_i4 (out array) != 0) || (array.Rank != 4))
609 if ( (array.GetLowerBound (0) != 15) || (array.GetUpperBound (0) != 24)
610 || (array.GetLowerBound (1) != 20) || (array.GetUpperBound (1) != 22)
611 || (array.GetLowerBound (2) != 5) || (array.GetUpperBound (2) != 10)
612 || (array.GetLowerBound (3) != 12) || (array.GetUpperBound (3) != 18) )
616 for (int i = array.GetLowerBound (3); i <= array.GetUpperBound (3); ++i) {
617 for (int j = array.GetLowerBound (2); j <= array.GetUpperBound (2); ++j) {
618 for (int k = array.GetLowerBound (1); k <= array.GetUpperBound (1); ++k) {
619 for (int l = array.GetLowerBound (0); l <= array.GetUpperBound (0); ++l) {
620 if (index != (int)array.GetValue (new long[] { l, k, j, i }))
630 array = new object[] { };
631 if (mono_test_marshal_safearray_in_byval_1dim_empty (array) != 0)
634 array = new object[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
635 if (mono_test_marshal_safearray_in_byval_1dim_vt_i4 (array) != 0)
638 array = new object[] { 0, "1", 2, "3", 4, "5", 6, "7", 8, "9", 10, "11", 12 };
639 if (mono_test_marshal_safearray_in_byval_1dim_vt_mixed (array) != 0)
641 if ((int)array.GetValue (0) != 0)
644 array = new object[,] { { 11, 12, 13, 14 }, { 21, 22, 23, 24 } };
645 if (mono_test_marshal_safearray_in_byval_2dim_vt_i4 (array) != 0)
647 if ((int)array.GetValue (new int[] { 0, 0 }) != 11)
650 array = new object[,,] { { { "111", "112", "113" }, { "121", "122", "123" } }, { { "211", "212", "213" }, { "221", "222", "223" } } };
651 if (mono_test_marshal_safearray_in_byval_3dim_vt_bstr (array) != 0)
653 if ((string)array.GetValue (new int[] { 0, 0, 0 }) != "111")
656 array = new object[,,] { { { "111", "112", "113" }, { "121", "122", "123" } }, { { "211", "212", "213" }, { "221", "222", "223" } } };
657 if ((mono_test_marshal_safearray_in_byref_3dim_vt_bstr (ref array) != 0) || (array.Rank != 3) || (array.Length != 12))
659 if ((string)array.GetValue (new int[] { 0, 0, 0 }) != "111")
664 array = new object[] { };
665 if ((mono_test_marshal_safearray_in_out_byref_1dim_empty (ref array) != 0) || (array.Rank != 1) || (array.Length != 8))
667 for (int i = 0; i < 8; ++i)
669 if (i != Convert.ToInt32 (array.GetValue (i)))
673 array = new object[,,] { { { "111", "112", "113" }, { "121", "122", "123" } }, { { "211", "212", "213" }, { "221", "222", "223" } } };
674 if ((mono_test_marshal_safearray_in_out_byref_3dim_vt_bstr (ref array) != 0) || (array.Rank != 1) || (array.Length != 8))
676 for (int i = 0; i < 8; ++i)
678 if (i != Convert.ToInt32 (array.GetValue (i)))
682 array = new object[] { 1 };
683 if ((mono_test_marshal_safearray_in_out_byref_1dim_vt_i4 (ref array) != 0) || (array.Rank != 1) || (array.Length != 1))
687 if (Convert.ToInt32 (array.GetValue (0)) != -1)
692 array = new object[] { 1 };
693 if ((mono_test_marshal_safearray_in_out_byval_1dim_vt_i4 (array) != 0) || (array.Rank != 1) || (array.Length != 1))
697 if (Convert.ToInt32 (array.GetValue (0)) != 12345)
700 array = new object[,,] { { { "111", "112", "113" }, { "121", "122", "123" } }, { { "211", "212", "213" }, { "221", "222", "223" } } };
701 if ((mono_test_marshal_safearray_in_out_byval_3dim_vt_bstr (array) != 0) || (array.Rank != 3) || (array.Length != 12))
705 if (Convert.ToInt32 (array.GetValue (new int[] { 1, 1, 1 })) != 111)
707 if (Convert.ToInt32 (array.GetValue (new int[] { 1, 1, 2 })) != 333)
709 if (Convert.ToString(array.GetValue (new int[] { 0, 1, 0 })) != "ABCDEFG")
712 /* Multiple safearray parameters with various types and options */
714 Array array1 = new object[] { 1 };
715 Array array2 = new object[,] { { 11, 12, 13, 14 }, { 21, 22, 23, 24 } };
716 Array array3 = new object[] { 0, "1", 2, "3", 4, "5", 6, "7", 8, "9", 10, "11", 12 };
717 Array array4 = new object[,,] { { { "111", "112", "113" }, { "121", "122", "123" } }, { { "211", "212", "213" }, { "221", "222", "223" } } };
718 if ( (mono_test_marshal_safearray_mixed (array1, out array2, array3, ref array4) != 0)
719 || (array1.Rank != 1) || (array1.Length != 1) || (Convert.ToInt32 (array1.GetValue (0)) != 12345)
720 || (array2.Rank != 1) || (array2.Length != 10)
721 || (array4.Rank != 1) || (array4.Length != 8)
726 for (int i = 0; i < 10; ++i)
728 if (i != Convert.ToInt32 (array2.GetValue (i)))
731 if ((int)array3.GetValue (0) != 0)
733 for (int i = 0; i < 8; ++i)
735 if (i != Convert.ToInt32 (array4.GetValue (i)))
739 #endregion // SafeArray Tests
741 #region COM Visible Test
742 TestVisible test_vis = new TestVisible();
743 IntPtr pDisp = Marshal.GetIDispatchForObject(test_vis);
744 if (pDisp == IntPtr.Zero)
754 [Guid ("00000000-0000-0000-0000-000000000001")]
755 [InterfaceType (ComInterfaceType.InterfaceIsIUnknown)]
756 public interface ITest
758 // properties need to go first since mcs puts them there
761 [return: MarshalAs (UnmanagedType.Interface)]
762 [MethodImpl (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId (5242884)]
766 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
767 void SByteIn (sbyte val);
768 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
769 void ByteIn (byte val);
770 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
771 void ShortIn (short val);
772 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
773 void UShortIn (ushort val);
774 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
775 void IntIn (int val);
776 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
777 void UIntIn (uint val);
778 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
779 void LongIn (long val);
780 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
781 void ULongIn (ulong val);
782 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
783 void FloatIn (float val);
784 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
785 void DoubleIn (double val);
786 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
787 void ITestIn ([MarshalAs (UnmanagedType.Interface)]ITest val);
788 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
789 void ITestOut ([MarshalAs (UnmanagedType.Interface)]out ITest val);
790 int Return22NoICall();
794 [Guid ("00000000-0000-0000-0000-000000000001")]
795 [InterfaceType (ComInterfaceType.InterfaceIsIUnknown)]
796 public interface ITestPresSig
798 // properties need to go first since mcs puts them there
801 [return: MarshalAs (UnmanagedType.Interface)]
802 [MethodImpl (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId (5242884)]
806 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
808 int SByteIn (sbyte val);
809 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
811 int ByteIn (byte val);
812 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
814 int ShortIn (short val);
815 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
817 int UShortIn (ushort val);
818 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
821 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
823 int UIntIn (uint val);
824 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
826 int LongIn (long val);
827 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
829 int ULongIn (ulong val);
830 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
832 int FloatIn (float val);
833 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
835 int DoubleIn (double val);
836 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
838 int ITestIn ([MarshalAs (UnmanagedType.Interface)]ITestPresSig val);
839 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
841 int ITestOut ([MarshalAs (UnmanagedType.Interface)]out ITestPresSig val);
843 int Return22NoICall();
846 [System.Runtime.InteropServices.GuidAttribute ("00000000-0000-0000-0000-000000000002")]
847 [System.Runtime.InteropServices.ComImportAttribute ()]
848 [System.Runtime.InteropServices.ClassInterfaceAttribute (ClassInterfaceType.None)]
849 public class _TestClass : ITest
851 // properties need to go first since mcs puts them there
852 public virtual extern ITest Test
854 [return: MarshalAs (UnmanagedType.Interface)]
855 [MethodImpl (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId (5242884)]
859 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
860 public virtual extern void SByteIn (sbyte val);
861 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
862 public virtual extern void ByteIn (byte val);
863 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
864 public virtual extern void ShortIn (short val);
865 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
866 public virtual extern void UShortIn (ushort val);
867 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
868 public virtual extern void IntIn (int val);
869 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
870 public virtual extern void UIntIn (uint val);
871 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
872 public virtual extern void LongIn (long val);
873 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
874 public virtual extern void ULongIn (ulong val);
875 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
876 public virtual extern void FloatIn (float val);
877 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
878 public virtual extern void DoubleIn (double val);
879 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
880 public virtual extern void ITestIn ([MarshalAs (UnmanagedType.Interface)]ITest val);
881 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
882 public virtual extern void ITestOut ([MarshalAs (UnmanagedType.Interface)]out ITest val);
884 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
885 public virtual extern int Return22NoICall();
888 [System.Runtime.InteropServices.GuidAttribute ("00000000-0000-0000-0000-000000000002")]
889 public class TestClass : _TestClass
893 ExtensibleClassFactory.RegisterObjectCreationCallback (new ObjectCreationDelegate (CreateObject)); ;
895 private static System.IntPtr CreateObject (System.IntPtr aggr)
898 mono_test_marshal_com_object_create (out pUnk3);
903 [System.Runtime.InteropServices.GuidAttribute ("00000000-0000-0000-0000-000000000003")]
904 public class TestActivatorClass : _TestClass
906 static TestActivatorClass ()
908 ExtensibleClassFactory.RegisterObjectCreationCallback (new ObjectCreationDelegate (CreateObject)); ;
910 private static System.IntPtr CreateObject (System.IntPtr aggr)
913 mono_test_marshal_com_object_create (out pUnk3);
918 delegate void SByteInDelegate (sbyte val);
919 delegate void ByteInDelegate (byte val);
920 delegate void ShortInDelegate (short val);
921 delegate void UShortInDelegate (ushort val);
922 delegate void IntInDelegate (int val);
923 delegate void UIntInDelegate (uint val);
924 delegate void LongInDelegate (long val);
925 delegate void ULongInDelegate (ulong val);
926 delegate void FloatInDelegate (float val);
927 delegate void DoubleInDelegate (double val);
928 delegate void ITestInDelegate (ITest val);
929 delegate void ITestOutDelegate (out ITest val);
931 public class ManagedTestPresSig : ITestPresSig
932 { // properties need to go first since mcs puts them there
933 public ITestPresSig Test
937 return new ManagedTestPresSig ();
941 public int SByteIn (sbyte val)
948 public int ByteIn (byte val)
955 public int ShortIn (short val)
962 public int UShortIn (ushort val)
969 public int IntIn (int val)
976 public int UIntIn (uint val)
983 public int LongIn (long val)
990 public int ULongIn (ulong val)
997 public int FloatIn (float val)
999 if (Math.Abs (val - 3.14f) > .000001)
1004 public int DoubleIn (double val)
1006 if (Math.Abs (val - 3.14f) > .000001)
1011 public int ITestIn ([MarshalAs (UnmanagedType.Interface)]ITestPresSig val)
1015 if (null == val as ManagedTestPresSig)
1020 public int ITestOut ([MarshalAs (UnmanagedType.Interface)]out ITestPresSig val)
1022 val = new ManagedTestPresSig ();
1026 public int Return22NoICall()
1032 public class ManagedTest : ITest
1034 private int status = 0;
1037 get { return status; }
1039 public void SByteIn (sbyte val)
1045 public void ByteIn (byte val)
1051 public void ShortIn (short val)
1057 public void UShortIn (ushort val)
1063 public void IntIn (int val)
1069 public void UIntIn (uint val)
1075 public void LongIn (long val)
1081 public void ULongIn (ulong val)
1087 public void FloatIn (float val)
1089 if (Math.Abs (val - 3.14f) > .000001)
1093 public void DoubleIn (double val)
1095 if (Math.Abs (val - 3.14) > .000001)
1099 public void ITestIn (ITest val)
1103 if (null == val as ManagedTest)
1107 public void ITestOut (out ITest val)
1109 val = new ManagedTest ();
1116 return new ManagedTest ();
1120 public int Return22NoICall()
1126 public static int mono_test_marshal_variant_in_callback (VarEnum vt, object obj)
1131 if (obj.GetType () != typeof (sbyte))
1133 if ((sbyte)obj != -100)
1136 case VarEnum.VT_UI1:
1137 if (obj.GetType () != typeof (byte))
1139 if ((byte)obj != 100)
1143 if (obj.GetType () != typeof (short))
1145 if ((short)obj != -100)
1148 case VarEnum.VT_UI2:
1149 if (obj.GetType () != typeof (ushort))
1151 if ((ushort)obj != 100)
1155 if (obj.GetType () != typeof (int))
1157 if ((int)obj != -100)
1160 case VarEnum.VT_UI4:
1161 if (obj.GetType () != typeof (uint))
1163 if ((uint)obj != 100)
1167 if (obj.GetType () != typeof (long))
1169 if ((long)obj != -100)
1172 case VarEnum.VT_UI8:
1173 if (obj.GetType () != typeof (ulong))
1175 if ((ulong)obj != 100)
1179 if (obj.GetType () != typeof (float))
1181 if (Math.Abs ((float)obj - 3.14f) > 1e-10)
1185 if (obj.GetType () != typeof (double))
1187 if (Math.Abs ((double)obj - 3.14) > 1e-10)
1190 case VarEnum.VT_BSTR:
1191 if (obj.GetType () != typeof (string))
1193 if ((string)obj != "PI")
1196 case VarEnum.VT_BOOL:
1197 if (obj.GetType () != typeof (bool))
1199 if ((bool)obj != true)
1206 public static int mono_test_marshal_variant_out_callback (VarEnum vt, ref object obj)
1212 case VarEnum.VT_UI1:
1218 case VarEnum.VT_UI2:
1224 case VarEnum.VT_UI4:
1230 case VarEnum.VT_UI8:
1239 case VarEnum.VT_BSTR:
1242 case VarEnum.VT_BOOL:
1249 public static int TestITest (ITest itest)
1253 itest.SByteIn (-100);
1255 itest.ShortIn (-100);
1256 itest.UShortIn (100);
1259 itest.LongIn (-100);
1260 itest.ULongIn (100);
1261 itest.FloatIn (3.14f);
1262 itest.DoubleIn (3.14);
1263 itest.ITestIn (itest);
1264 itest.ITestOut (out itest2);
1266 catch (Exception ex) {
1272 public static int TestITestPresSig (ITestPresSig itest)
1274 ITestPresSig itest2;
1275 if (itest.SByteIn (-100) != 0)
1277 if (itest.ByteIn (100) != 0)
1279 if (itest.ShortIn (-100) != 0)
1281 if (itest.UShortIn (100) != 0)
1283 if (itest.IntIn (-100) != 0)
1285 if (itest.UIntIn (100) != 0)
1287 if (itest.LongIn (-100) != 0)
1289 if (itest.ULongIn (100) != 0)
1291 if (itest.FloatIn (3.14f) != 0)
1293 if (itest.DoubleIn (3.14) != 0)
1295 if (itest.ITestIn (itest) != 0)
1297 if (itest.ITestOut (out itest2) != 0)
1302 public static int TestITestDelegate (ITest itest)
1307 SByteInDelegate SByteInFcn= itest.SByteIn;
1308 ByteInDelegate ByteInFcn = itest.ByteIn;
1309 UShortInDelegate UShortInFcn = itest.UShortIn;
1310 IntInDelegate IntInFcn = itest.IntIn;
1311 UIntInDelegate UIntInFcn = itest.UIntIn;
1312 LongInDelegate LongInFcn = itest.LongIn;
1314 ULongInDelegate ULongInFcn = itest.ULongIn;
1315 FloatInDelegate FloatInFcn = itest.FloatIn;
1316 DoubleInDelegate DoubleInFcn = itest.DoubleIn;
1317 ITestInDelegate ITestInFcn = itest.ITestIn;
1318 ITestOutDelegate ITestOutFcn = itest.ITestOut;
1330 ITestOutFcn (out itest2);
1338 public static int TestIfaceNoIcall (ITestPresSig itest) {
1339 return itest.Return22NoICall () == 22 ? 0 : 1;
1343 public class TestVisible