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_byte([MarshalAs(UnmanagedType.Struct)]out object obj);
72 [DllImport("libtest")]
73 public static extern int mono_test_marshal_variant_out_short([MarshalAs(UnmanagedType.Struct)]out object obj);
75 [DllImport("libtest")]
76 public static extern int mono_test_marshal_variant_out_ushort([MarshalAs(UnmanagedType.Struct)]out object obj);
78 [DllImport("libtest")]
79 public static extern int mono_test_marshal_variant_out_int([MarshalAs(UnmanagedType.Struct)]out object obj);
81 [DllImport("libtest")]
82 public static extern int mono_test_marshal_variant_out_uint([MarshalAs(UnmanagedType.Struct)]out object obj);
84 [DllImport("libtest")]
85 public static extern int mono_test_marshal_variant_out_long([MarshalAs(UnmanagedType.Struct)]out object obj);
87 [DllImport("libtest")]
88 public static extern int mono_test_marshal_variant_out_ulong([MarshalAs(UnmanagedType.Struct)]out object obj);
90 [DllImport("libtest")]
91 public static extern int mono_test_marshal_variant_out_float([MarshalAs(UnmanagedType.Struct)]out object obj);
93 [DllImport("libtest")]
94 public static extern int mono_test_marshal_variant_out_double([MarshalAs(UnmanagedType.Struct)]out object obj);
96 [DllImport("libtest")]
97 public static extern int mono_test_marshal_variant_out_bstr ([MarshalAs (UnmanagedType.Struct)]out object obj);
99 [DllImport("libtest")]
100 public static extern int mono_test_marshal_variant_out_bool_true ([MarshalAs (UnmanagedType.Struct)]out object obj);
102 [DllImport ("libtest")]
103 public static extern int mono_test_marshal_variant_out_bool_false ([MarshalAs (UnmanagedType.Struct)]out object obj);
106 public delegate int VarFunc (VarEnum vt, [MarshalAs (UnmanagedType.Struct)] object obj);
108 public delegate int VarRefFunc (VarEnum vt, [MarshalAs (UnmanagedType.Struct)] ref object obj);
110 [DllImport ("libtest")]
111 public static extern int mono_test_marshal_variant_in_sbyte_unmanaged (VarFunc func);
113 [DllImport ("libtest")]
114 public static extern int mono_test_marshal_variant_in_byte_unmanaged (VarFunc func);
116 [DllImport ("libtest")]
117 public static extern int mono_test_marshal_variant_in_short_unmanaged (VarFunc func);
119 [DllImport ("libtest")]
120 public static extern int mono_test_marshal_variant_in_ushort_unmanaged (VarFunc func);
122 [DllImport ("libtest")]
123 public static extern int mono_test_marshal_variant_in_int_unmanaged (VarFunc func);
125 [DllImport ("libtest")]
126 public static extern int mono_test_marshal_variant_in_uint_unmanaged (VarFunc func);
128 [DllImport ("libtest")]
129 public static extern int mono_test_marshal_variant_in_long_unmanaged (VarFunc func);
131 [DllImport ("libtest")]
132 public static extern int mono_test_marshal_variant_in_ulong_unmanaged (VarFunc func);
134 [DllImport ("libtest")]
135 public static extern int mono_test_marshal_variant_in_float_unmanaged (VarFunc func);
137 [DllImport ("libtest")]
138 public static extern int mono_test_marshal_variant_in_double_unmanaged (VarFunc func);
140 [DllImport ("libtest")]
141 public static extern int mono_test_marshal_variant_in_bstr_unmanaged (VarFunc func);
143 [DllImport ("libtest")]
144 public static extern int mono_test_marshal_variant_in_bool_true_unmanaged (VarFunc func);
146 [DllImport ("libtest")]
147 public static extern int mono_test_marshal_variant_in_bool_false_unmanaged (VarFunc func);
149 [DllImport ("libtest")]
150 public static extern int mono_test_marshal_variant_out_sbyte_unmanaged (VarRefFunc func);
152 [DllImport ("libtest")]
153 public static extern int mono_test_marshal_variant_out_byte_unmanaged (VarRefFunc func);
155 [DllImport ("libtest")]
156 public static extern int mono_test_marshal_variant_out_short_unmanaged (VarRefFunc func);
158 [DllImport ("libtest")]
159 public static extern int mono_test_marshal_variant_out_ushort_unmanaged (VarRefFunc func);
161 [DllImport ("libtest")]
162 public static extern int mono_test_marshal_variant_out_int_unmanaged (VarRefFunc func);
164 [DllImport ("libtest")]
165 public static extern int mono_test_marshal_variant_out_uint_unmanaged (VarRefFunc func);
167 [DllImport ("libtest")]
168 public static extern int mono_test_marshal_variant_out_long_unmanaged (VarRefFunc func);
170 [DllImport ("libtest")]
171 public static extern int mono_test_marshal_variant_out_ulong_unmanaged (VarRefFunc func);
173 [DllImport ("libtest")]
174 public static extern int mono_test_marshal_variant_out_float_unmanaged (VarRefFunc func);
176 [DllImport ("libtest")]
177 public static extern int mono_test_marshal_variant_out_double_unmanaged (VarRefFunc func);
179 [DllImport ("libtest")]
180 public static extern int mono_test_marshal_variant_out_bstr_unmanaged (VarRefFunc func);
182 [DllImport ("libtest")]
183 public static extern int mono_test_marshal_variant_out_bool_true_unmanaged (VarRefFunc func);
185 [DllImport ("libtest")]
186 public static extern int mono_test_marshal_variant_out_bool_false_unmanaged (VarRefFunc func);
188 [DllImport ("libtest")]
189 public static extern int mono_test_marshal_com_object_create (out IntPtr pUnk);
191 [DllImport ("libtest")]
192 public static extern int mono_test_marshal_com_object_same (out IntPtr pUnk);
194 [DllImport ("libtest")]
195 public static extern int mono_test_marshal_com_object_destroy (IntPtr pUnk);
197 [DllImport ("libtest")]
198 public static extern int mono_test_marshal_com_object_ref_count (IntPtr pUnk);
200 [DllImport ("libtest")]
201 public static extern int mono_test_marshal_ccw_identity ([MarshalAs (UnmanagedType.Interface)]ITest itest);
203 [DllImport ("libtest")]
204 public static extern int mono_test_marshal_ccw_reflexive ([MarshalAs (UnmanagedType.Interface)]ITest itest);
206 [DllImport ("libtest")]
207 public static extern int mono_test_marshal_ccw_transitive ([MarshalAs (UnmanagedType.Interface)]ITest itest);
209 [DllImport ("libtest")]
210 public static extern int mono_test_marshal_ccw_itest ([MarshalAs (UnmanagedType.Interface)]ITest itest);
212 [DllImport ("libtest")]
213 public static extern int mono_test_marshal_ccw_itest ([MarshalAs (UnmanagedType.Interface)]ITestPresSig itest);
215 [DllImport("libtest")]
216 public static extern int mono_test_marshal_safearray_out_1dim_vt_bstr_empty ([MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)]out Array array);
218 [DllImport("libtest")]
219 public static extern int mono_test_marshal_safearray_out_1dim_vt_bstr ([MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)]out Array array);
221 [DllImport("libtest")]
222 public static extern int mono_test_marshal_safearray_out_2dim_vt_i4 ([MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)]out Array array);
224 [DllImport("libtest")]
225 public static extern int mono_test_marshal_safearray_out_4dim_vt_i4 ([MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)]out Array array);
227 [DllImport("libtest")]
228 public static extern int mono_test_marshal_safearray_in_byval_1dim_empty ([In, MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] Array array);
230 [DllImport("libtest")]
231 public static extern int mono_test_marshal_safearray_in_byval_1dim_vt_i4 ([In, MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] Array array);
233 [DllImport("libtest")]
234 public static extern int mono_test_marshal_safearray_in_byval_1dim_vt_mixed ([In, MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] Array array);
236 [DllImport("libtest")]
237 public static extern int mono_test_marshal_safearray_in_byval_2dim_vt_i4 ([In, MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] Array array);
239 [DllImport("libtest")]
240 public static extern int mono_test_marshal_safearray_in_byval_3dim_vt_bstr ([In, MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] Array array);
242 [DllImport("libtest")]
243 public static extern int mono_test_marshal_safearray_in_byref_3dim_vt_bstr ([In, MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] ref Array array);
245 [DllImport("libtest")]
246 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);
248 [DllImport("libtest")]
249 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);
251 [DllImport("libtest")]
252 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);
254 [DllImport("libtest")]
255 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);
257 [DllImport("libtest")]
258 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);
260 [DllImport("libtest")]
261 public static extern int mono_test_marshal_safearray_mixed (
262 [In, Out, MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] Array array1,
263 [MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] out Array array2,
264 [In, MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] Array array3,
265 [In, Out, MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] ref Array array4);
267 [DllImport("libtest")]
268 public static extern bool mono_cominterop_is_supported ();
270 public static int Main ()
273 bool isWindows = !(((int)Environment.OSVersion.Platform == 4) ||
274 ((int)Environment.OSVersion.Platform == 128));
276 if (mono_cominterop_is_supported () || isWindows)
281 if (mono_test_marshal_bstr_in ("mono_test_marshal_bstr_in") != 0)
283 if (mono_test_marshal_bstr_out (out str) != 0 || str != "mono_test_marshal_bstr_out")
285 if (mono_test_marshal_bstr_in_null (null) != 0)
287 if (mono_test_marshal_bstr_out_null (out str) != 0 || str != null)
290 #endregion // BSTR Tests
292 #region VARIANT Tests
295 if (mono_test_marshal_variant_in_sbyte ((sbyte)100) != 0)
297 if (mono_test_marshal_variant_in_byte ((byte)100) != 0)
299 if (mono_test_marshal_variant_in_short ((short)314) != 0)
301 if (mono_test_marshal_variant_in_ushort ((ushort)314) != 0)
303 if (mono_test_marshal_variant_in_int ((int)314) != 0)
305 if (mono_test_marshal_variant_in_uint ((uint)314) != 0)
307 if (mono_test_marshal_variant_in_long ((long)314) != 0)
309 if (mono_test_marshal_variant_in_ulong ((ulong)314) != 0)
311 if (mono_test_marshal_variant_in_float ((float)3.14) != 0)
313 if (mono_test_marshal_variant_in_double ((double)3.14) != 0)
315 if (mono_test_marshal_variant_in_bstr ("PI") != 0)
317 if (mono_test_marshal_variant_out_sbyte (out obj) != 0 || (sbyte)obj != 100)
319 if (mono_test_marshal_variant_out_byte (out obj) != 0 || (byte)obj != 100)
321 if (mono_test_marshal_variant_out_short (out obj) != 0 || (short)obj != 314)
323 if (mono_test_marshal_variant_out_ushort (out obj) != 0 || (ushort)obj != 314)
325 if (mono_test_marshal_variant_out_int (out obj) != 0 || (int)obj != 314)
327 if (mono_test_marshal_variant_out_uint (out obj) != 0 || (uint)obj != 314)
329 if (mono_test_marshal_variant_out_long (out obj) != 0 || (long)obj != 314)
331 if (mono_test_marshal_variant_out_ulong (out obj) != 0 || (ulong)obj != 314)
333 if (mono_test_marshal_variant_out_float (out obj) != 0 || ((float)obj - 3.14) / 3.14 > .001)
335 if (mono_test_marshal_variant_out_double (out obj) != 0 || ((double)obj - 3.14) / 3.14 > .001)
337 if (mono_test_marshal_variant_out_bstr (out obj) != 0 || (string)obj != "PI")
340 VarFunc func = new VarFunc (mono_test_marshal_variant_in_callback);
341 if (mono_test_marshal_variant_in_sbyte_unmanaged (func) != 0)
343 if (mono_test_marshal_variant_in_byte_unmanaged (func) != 0)
345 if (mono_test_marshal_variant_in_short_unmanaged (func) != 0)
347 if (mono_test_marshal_variant_in_ushort_unmanaged (func) != 0)
349 if (mono_test_marshal_variant_in_int_unmanaged (func) != 0)
351 if (mono_test_marshal_variant_in_uint_unmanaged (func) != 0)
353 if (mono_test_marshal_variant_in_long_unmanaged (func) != 0)
355 if (mono_test_marshal_variant_in_ulong_unmanaged (func) != 0)
357 if (mono_test_marshal_variant_in_float_unmanaged (func) != 0)
359 if (mono_test_marshal_variant_in_double_unmanaged (func) != 0)
361 if (mono_test_marshal_variant_in_bstr_unmanaged (func) != 0)
363 if (mono_test_marshal_variant_in_bool_true_unmanaged (func) != 0)
366 VarRefFunc reffunc = new VarRefFunc (mono_test_marshal_variant_out_callback);
367 if (mono_test_marshal_variant_out_sbyte_unmanaged (reffunc) != 0)
369 if (mono_test_marshal_variant_out_byte_unmanaged (reffunc) != 0)
371 if (mono_test_marshal_variant_out_short_unmanaged (reffunc) != 0)
373 if (mono_test_marshal_variant_out_ushort_unmanaged (reffunc) != 0)
375 if (mono_test_marshal_variant_out_int_unmanaged (reffunc) != 0)
377 if (mono_test_marshal_variant_out_uint_unmanaged (reffunc) != 0)
379 if (mono_test_marshal_variant_out_long_unmanaged (reffunc) != 0)
381 if (mono_test_marshal_variant_out_ulong_unmanaged (reffunc) != 0)
383 if (mono_test_marshal_variant_out_float_unmanaged (reffunc) != 0)
385 if (mono_test_marshal_variant_out_double_unmanaged (reffunc) != 0)
387 if (mono_test_marshal_variant_out_bstr_unmanaged (reffunc) != 0)
389 if (mono_test_marshal_variant_out_bool_true_unmanaged (reffunc) != 0)
392 #endregion // VARIANT Tests
394 #region Runtime Callable Wrapper Tests
397 if (mono_test_marshal_com_object_create (out pUnk) != 0)
400 if (mono_test_marshal_com_object_ref_count (pUnk) != 1)
403 if (Marshal.AddRef (pUnk) != 2)
406 if (mono_test_marshal_com_object_ref_count (pUnk) != 2)
409 if (Marshal.Release (pUnk) != 1)
412 if (mono_test_marshal_com_object_ref_count (pUnk) != 1)
415 object com_obj = Marshal.GetObjectForIUnknown (pUnk);
420 ITest itest = com_obj as ITest;
426 if (mono_test_marshal_com_object_same (out pUnk2) != 0)
429 object com_obj2 = Marshal.GetObjectForIUnknown (pUnk2);
431 if (com_obj != com_obj2)
434 if (!com_obj.Equals (com_obj2))
438 if (mono_test_marshal_com_object_create (out pUnk3) != 0)
441 object com_obj3 = Marshal.GetObjectForIUnknown (pUnk3);
442 if (com_obj == com_obj3)
445 if (com_obj.Equals (com_obj3))
448 // com_obj & com_obj2 share a RCW
449 if (Marshal.ReleaseComObject (com_obj2) != 1)
452 // com_obj3 should only have one RCW
453 if (Marshal.ReleaseComObject (com_obj3) != 0)
456 IntPtr iunknown = Marshal.GetIUnknownForObject (com_obj);
457 if (iunknown == IntPtr.Zero)
460 if (pUnk != iunknown)
463 if (TestITest (itest) != 0)
466 if (TestITestPresSig (itest as ITestPresSig) != 0)
469 if (TestITestDelegate (itest) != 0)
472 itest = new TestClass ();
474 if (TestITest (itest) != 0)
477 #endregion // Runtime Callable Wrapper Tests
479 #region COM Callable Wrapper Tests
481 ManagedTest test = new ManagedTest ();
483 mono_test_marshal_ccw_itest (test);
485 if (test.Status != 0)
488 ManagedTestPresSig test_pres_sig = new ManagedTestPresSig ();
490 mono_test_marshal_ccw_itest (test_pres_sig);
492 #endregion // COM Callable Wrapper Tests
494 #region SAFEARRAY tests
501 if ((mono_test_marshal_safearray_out_1dim_vt_bstr_empty (out array) != 0) || (array.Rank != 1) || (array.Length != 0))
504 if ((mono_test_marshal_safearray_out_1dim_vt_bstr (out array) != 0) || (array.Rank != 1) || (array.Length != 10))
506 for (int i = 0; i < 10; ++i) {
507 if (i != Convert.ToInt32 (array.GetValue (i)))
511 if ((mono_test_marshal_safearray_out_2dim_vt_i4 (out array) != 0) || (array.Rank != 2))
513 if ( (array.GetLowerBound (0) != 0) || (array.GetUpperBound (0) != 3)
514 || (array.GetLowerBound (1) != 0) || (array.GetUpperBound (1) != 2))
516 for (int i = array.GetLowerBound (0); i <= array.GetUpperBound (0); ++i)
518 for (int j = array.GetLowerBound (1); j <= array.GetUpperBound (1); ++j) {
519 if ((i + 1) * 10 + (j + 1) != (int)array.GetValue (new long[] { i, j }))
524 if ((mono_test_marshal_safearray_out_4dim_vt_i4 (out array) != 0) || (array.Rank != 4))
526 if ( (array.GetLowerBound (0) != 15) || (array.GetUpperBound (0) != 24)
527 || (array.GetLowerBound (1) != 20) || (array.GetUpperBound (1) != 22)
528 || (array.GetLowerBound (2) != 5) || (array.GetUpperBound (2) != 10)
529 || (array.GetLowerBound (3) != 12) || (array.GetUpperBound (3) != 18) )
533 for (int i = array.GetLowerBound (3); i <= array.GetUpperBound (3); ++i) {
534 for (int j = array.GetLowerBound (2); j <= array.GetUpperBound (2); ++j) {
535 for (int k = array.GetLowerBound (1); k <= array.GetUpperBound (1); ++k) {
536 for (int l = array.GetLowerBound (0); l <= array.GetUpperBound (0); ++l) {
537 if (index != (int)array.GetValue (new long[] { l, k, j, i }))
547 array = new object[] { };
548 if (mono_test_marshal_safearray_in_byval_1dim_empty (array) != 0)
551 array = new object[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
552 if (mono_test_marshal_safearray_in_byval_1dim_vt_i4 (array) != 0)
555 array = new object[] { 0, "1", 2, "3", 4, "5", 6, "7", 8, "9", 10, "11", 12 };
556 if (mono_test_marshal_safearray_in_byval_1dim_vt_mixed (array) != 0)
558 if ((int)array.GetValue (0) != 0)
561 array = new object[,] { { 11, 12, 13, 14 }, { 21, 22, 23, 24 } };
562 if (mono_test_marshal_safearray_in_byval_2dim_vt_i4 (array) != 0)
564 if ((int)array.GetValue (new int[] { 0, 0 }) != 11)
567 array = new object[,,] { { { "111", "112", "113" }, { "121", "122", "123" } }, { { "211", "212", "213" }, { "221", "222", "223" } } };
568 if (mono_test_marshal_safearray_in_byval_3dim_vt_bstr (array) != 0)
570 if ((string)array.GetValue (new int[] { 0, 0, 0 }) != "111")
573 array = new object[,,] { { { "111", "112", "113" }, { "121", "122", "123" } }, { { "211", "212", "213" }, { "221", "222", "223" } } };
574 if ((mono_test_marshal_safearray_in_byref_3dim_vt_bstr (ref array) != 0) || (array.Rank != 3) || (array.Length != 12))
576 if ((string)array.GetValue (new int[] { 0, 0, 0 }) != "111")
581 array = new object[] { };
582 if ((mono_test_marshal_safearray_in_out_byref_1dim_empty (ref array) != 0) || (array.Rank != 1) || (array.Length != 8))
584 for (int i = 0; i < 8; ++i)
586 if (i != Convert.ToInt32 (array.GetValue (i)))
590 array = new object[,,] { { { "111", "112", "113" }, { "121", "122", "123" } }, { { "211", "212", "213" }, { "221", "222", "223" } } };
591 if ((mono_test_marshal_safearray_in_out_byref_3dim_vt_bstr (ref array) != 0) || (array.Rank != 1) || (array.Length != 8))
593 for (int i = 0; i < 8; ++i)
595 if (i != Convert.ToInt32 (array.GetValue (i)))
599 array = new object[] { 1 };
600 if ((mono_test_marshal_safearray_in_out_byref_1dim_vt_i4 (ref array) != 0) || (array.Rank != 1) || (array.Length != 1))
604 if (Convert.ToInt32 (array.GetValue (0)) != -1)
609 array = new object[] { 1 };
610 if ((mono_test_marshal_safearray_in_out_byval_1dim_vt_i4 (array) != 0) || (array.Rank != 1) || (array.Length != 1))
614 if (Convert.ToInt32 (array.GetValue (0)) != 12345)
617 array = new object[,,] { { { "111", "112", "113" }, { "121", "122", "123" } }, { { "211", "212", "213" }, { "221", "222", "223" } } };
618 if ((mono_test_marshal_safearray_in_out_byval_3dim_vt_bstr (array) != 0) || (array.Rank != 3) || (array.Length != 12))
622 if (Convert.ToInt32 (array.GetValue (new int[] { 1, 1, 1 })) != 111)
624 if (Convert.ToInt32 (array.GetValue (new int[] { 1, 1, 2 })) != 333)
626 if (Convert.ToString(array.GetValue (new int[] { 0, 1, 0 })) != "ABCDEFG")
629 /* Multiple safearray parameters with various types and options */
631 Array array1 = new object[] { 1 };
632 Array array2 = new object[,] { { 11, 12, 13, 14 }, { 21, 22, 23, 24 } };
633 Array array3 = new object[] { 0, "1", 2, "3", 4, "5", 6, "7", 8, "9", 10, "11", 12 };
634 Array array4 = new object[,,] { { { "111", "112", "113" }, { "121", "122", "123" } }, { { "211", "212", "213" }, { "221", "222", "223" } } };
635 if ( (mono_test_marshal_safearray_mixed (array1, out array2, array3, ref array4) != 0)
636 || (array1.Rank != 1) || (array1.Length != 1) || (Convert.ToInt32 (array1.GetValue (0)) != 12345)
637 || (array2.Rank != 1) || (array2.Length != 10)
638 || (array4.Rank != 1) || (array4.Length != 8)
643 for (int i = 0; i < 10; ++i)
645 if (i != Convert.ToInt32 (array2.GetValue (i)))
648 if ((int)array3.GetValue (0) != 0)
650 for (int i = 0; i < 8; ++i)
652 if (i != Convert.ToInt32 (array4.GetValue (i)))
656 #endregion // SafeArray Tests
658 #region COM Visible Test
659 TestVisible test_vis = new TestVisible();
660 IntPtr pDisp = Marshal.GetIDispatchForObject(test_vis);
661 if (pDisp == IntPtr.Zero)
671 [Guid ("00000000-0000-0000-0000-000000000001")]
672 [InterfaceType (ComInterfaceType.InterfaceIsIUnknown)]
673 public interface ITest
675 // properties need to go first since mcs puts them there
678 [return: MarshalAs (UnmanagedType.Interface)]
679 [MethodImpl (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId (5242884)]
683 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
684 void SByteIn (sbyte val);
685 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
686 void ByteIn (byte val);
687 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
688 void ShortIn (short val);
689 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
690 void UShortIn (ushort val);
691 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
692 void IntIn (int val);
693 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
694 void UIntIn (uint val);
695 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
696 void LongIn (long val);
697 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
698 void ULongIn (ulong val);
699 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
700 void FloatIn (float val);
701 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
702 void DoubleIn (double val);
703 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
704 void ITestIn ([MarshalAs (UnmanagedType.Interface)]ITest val);
705 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
706 void ITestOut ([MarshalAs (UnmanagedType.Interface)]out ITest val);
710 [Guid ("00000000-0000-0000-0000-000000000001")]
711 [InterfaceType (ComInterfaceType.InterfaceIsIUnknown)]
712 public interface ITestPresSig
714 // properties need to go first since mcs puts them there
717 [return: MarshalAs (UnmanagedType.Interface)]
718 [MethodImpl (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId (5242884)]
722 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
724 int SByteIn (sbyte val);
725 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
727 int ByteIn (byte val);
728 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
730 int ShortIn (short val);
731 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
733 int UShortIn (ushort val);
734 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
737 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
739 int UIntIn (uint val);
740 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
742 int LongIn (long val);
743 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
745 int ULongIn (ulong val);
746 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
748 int FloatIn (float val);
749 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
751 int DoubleIn (double val);
752 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
754 int ITestIn ([MarshalAs (UnmanagedType.Interface)]ITestPresSig val);
755 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
757 int ITestOut ([MarshalAs (UnmanagedType.Interface)]out ITestPresSig val);
760 [System.Runtime.InteropServices.GuidAttribute ("00000000-0000-0000-0000-000000000002")]
761 [System.Runtime.InteropServices.ComImportAttribute ()]
762 [System.Runtime.InteropServices.ClassInterfaceAttribute (ClassInterfaceType.None)]
763 public class _TestClass : ITest
765 // properties need to go first since mcs puts them there
766 public virtual extern ITest Test
768 [return: MarshalAs (UnmanagedType.Interface)]
769 [MethodImpl (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId (5242884)]
773 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
774 public virtual extern void SByteIn (sbyte val);
775 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
776 public virtual extern void ByteIn (byte val);
777 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
778 public virtual extern void ShortIn (short val);
779 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
780 public virtual extern void UShortIn (ushort val);
781 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
782 public virtual extern void IntIn (int val);
783 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
784 public virtual extern void UIntIn (uint val);
785 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
786 public virtual extern void LongIn (long val);
787 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
788 public virtual extern void ULongIn (ulong val);
789 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
790 public virtual extern void FloatIn (float val);
791 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
792 public virtual extern void DoubleIn (double val);
793 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
794 public virtual extern void ITestIn ([MarshalAs (UnmanagedType.Interface)]ITest val);
795 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
796 public virtual extern void ITestOut ([MarshalAs (UnmanagedType.Interface)]out ITest val);
799 [System.Runtime.InteropServices.GuidAttribute ("00000000-0000-0000-0000-000000000002")]
800 public class TestClass : _TestClass
804 ExtensibleClassFactory.RegisterObjectCreationCallback (new ObjectCreationDelegate (CreateObject)); ;
806 private static System.IntPtr CreateObject (System.IntPtr aggr)
809 mono_test_marshal_com_object_create (out pUnk3);
815 delegate void SByteInDelegate (sbyte val);
816 delegate void ByteInDelegate (byte val);
817 delegate void ShortInDelegate (short val);
818 delegate void UShortInDelegate (ushort val);
819 delegate void IntInDelegate (int val);
820 delegate void UIntInDelegate (uint val);
821 delegate void LongInDelegate (long val);
822 delegate void ULongInDelegate (ulong val);
823 delegate void FloatInDelegate (float val);
824 delegate void DoubleInDelegate (double val);
825 delegate void ITestInDelegate (ITest val);
826 delegate void ITestOutDelegate (out ITest val);
828 public class ManagedTestPresSig : ITestPresSig
829 { // properties need to go first since mcs puts them there
830 public ITestPresSig Test
834 return new ManagedTestPresSig ();
838 public int SByteIn (sbyte val)
845 public int ByteIn (byte val)
852 public int ShortIn (short val)
859 public int UShortIn (ushort val)
866 public int IntIn (int val)
873 public int UIntIn (uint val)
880 public int LongIn (long val)
887 public int ULongIn (ulong val)
894 public int FloatIn (float val)
896 if (Math.Abs (val - 3.14f) > .000001)
901 public int DoubleIn (double val)
903 if (Math.Abs (val - 3.14f) > .000001)
908 public int ITestIn ([MarshalAs (UnmanagedType.Interface)]ITestPresSig val)
912 if (null == val as ManagedTestPresSig)
917 public int ITestOut ([MarshalAs (UnmanagedType.Interface)]out ITestPresSig val)
919 val = new ManagedTestPresSig ();
924 public class ManagedTest : ITest
926 private int status = 0;
929 get { return status; }
931 public void SByteIn (sbyte val)
937 public void ByteIn (byte val)
943 public void ShortIn (short val)
949 public void UShortIn (ushort val)
955 public void IntIn (int val)
961 public void UIntIn (uint val)
967 public void LongIn (long val)
973 public void ULongIn (ulong val)
979 public void FloatIn (float val)
981 if (Math.Abs (val - 3.14f) > .000001)
985 public void DoubleIn (double val)
987 if (Math.Abs (val - 3.14) > .000001)
991 public void ITestIn (ITest val)
995 if (null == val as ManagedTest)
999 public void ITestOut (out ITest val)
1001 val = new ManagedTest ();
1008 return new ManagedTest ();
1013 public static int mono_test_marshal_variant_in_callback (VarEnum vt, object obj)
1018 if (obj.GetType () != typeof (sbyte))
1020 if ((sbyte)obj != -100)
1023 case VarEnum.VT_UI1:
1024 if (obj.GetType () != typeof (byte))
1026 if ((byte)obj != 100)
1030 if (obj.GetType () != typeof (short))
1032 if ((short)obj != -100)
1035 case VarEnum.VT_UI2:
1036 if (obj.GetType () != typeof (ushort))
1038 if ((ushort)obj != 100)
1042 if (obj.GetType () != typeof (int))
1044 if ((int)obj != -100)
1047 case VarEnum.VT_UI4:
1048 if (obj.GetType () != typeof (uint))
1050 if ((uint)obj != 100)
1054 if (obj.GetType () != typeof (long))
1056 if ((long)obj != -100)
1059 case VarEnum.VT_UI8:
1060 if (obj.GetType () != typeof (ulong))
1062 if ((ulong)obj != 100)
1066 if (obj.GetType () != typeof (float))
1068 if (Math.Abs ((float)obj - 3.14f) > 1e-10)
1072 if (obj.GetType () != typeof (double))
1074 if (Math.Abs ((double)obj - 3.14) > 1e-10)
1077 case VarEnum.VT_BSTR:
1078 if (obj.GetType () != typeof (string))
1080 if ((string)obj != "PI")
1083 case VarEnum.VT_BOOL:
1084 if (obj.GetType () != typeof (bool))
1086 if ((bool)obj != true)
1093 public static int mono_test_marshal_variant_out_callback (VarEnum vt, ref object obj)
1099 case VarEnum.VT_UI1:
1105 case VarEnum.VT_UI2:
1111 case VarEnum.VT_UI4:
1117 case VarEnum.VT_UI8:
1126 case VarEnum.VT_BSTR:
1129 case VarEnum.VT_BOOL:
1136 public static int TestITest (ITest itest)
1140 itest.SByteIn (-100);
1142 itest.ShortIn (-100);
1143 itest.UShortIn (100);
1146 itest.LongIn (-100);
1147 itest.ULongIn (100);
1148 itest.FloatIn (3.14f);
1149 itest.DoubleIn (3.14);
1150 itest.ITestIn (itest);
1151 itest.ITestOut (out itest2);
1153 catch (Exception ex) {
1159 public static int TestITestPresSig (ITestPresSig itest)
1161 ITestPresSig itest2;
1162 if (itest.SByteIn (-100) != 0)
1164 if (itest.ByteIn (100) != 0)
1166 if (itest.ShortIn (-100) != 0)
1168 if (itest.UShortIn (100) != 0)
1170 if (itest.IntIn (-100) != 0)
1172 if (itest.UIntIn (100) != 0)
1174 if (itest.LongIn (-100) != 0)
1176 if (itest.ULongIn (100) != 0)
1178 if (itest.FloatIn (3.14f) != 0)
1180 if (itest.DoubleIn (3.14) != 0)
1182 if (itest.ITestIn (itest) != 0)
1184 if (itest.ITestOut (out itest2) != 0)
1189 public static int TestITestDelegate (ITest itest)
1194 SByteInDelegate SByteInFcn= itest.SByteIn;
1195 ByteInDelegate ByteInFcn = itest.ByteIn;
1196 UShortInDelegate UShortInFcn = itest.UShortIn;
1197 IntInDelegate IntInFcn = itest.IntIn;
1198 UIntInDelegate UIntInFcn = itest.UIntIn;
1199 LongInDelegate LongInFcn = itest.LongIn;
1201 ULongInDelegate ULongInFcn = itest.ULongIn;
1202 FloatInDelegate FloatInFcn = itest.FloatIn;
1203 DoubleInDelegate DoubleInFcn = itest.DoubleIn;
1204 ITestInDelegate ITestInFcn = itest.ITestIn;
1205 ITestOutDelegate ITestOutFcn = itest.ITestOut;
1217 ITestOutFcn (out itest2);
1226 public class TestVisible