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 itest = (ITest)System.Activator.CreateInstance (typeof(TestActivatorClass));
479 if (TestITest (itest) != 0)
482 #endregion // Runtime Callable Wrapper Tests
484 #region COM Callable Wrapper Tests
486 ManagedTest test = new ManagedTest ();
488 mono_test_marshal_ccw_itest (test);
490 if (test.Status != 0)
493 ManagedTestPresSig test_pres_sig = new ManagedTestPresSig ();
495 mono_test_marshal_ccw_itest (test_pres_sig);
497 #endregion // COM Callable Wrapper Tests
499 #region SAFEARRAY tests
506 if ((mono_test_marshal_safearray_out_1dim_vt_bstr_empty (out array) != 0) || (array.Rank != 1) || (array.Length != 0))
509 if ((mono_test_marshal_safearray_out_1dim_vt_bstr (out array) != 0) || (array.Rank != 1) || (array.Length != 10))
511 for (int i = 0; i < 10; ++i) {
512 if (i != Convert.ToInt32 (array.GetValue (i)))
516 if ((mono_test_marshal_safearray_out_2dim_vt_i4 (out array) != 0) || (array.Rank != 2))
518 if ( (array.GetLowerBound (0) != 0) || (array.GetUpperBound (0) != 3)
519 || (array.GetLowerBound (1) != 0) || (array.GetUpperBound (1) != 2))
521 for (int i = array.GetLowerBound (0); i <= array.GetUpperBound (0); ++i)
523 for (int j = array.GetLowerBound (1); j <= array.GetUpperBound (1); ++j) {
524 if ((i + 1) * 10 + (j + 1) != (int)array.GetValue (new long[] { i, j }))
529 if ((mono_test_marshal_safearray_out_4dim_vt_i4 (out array) != 0) || (array.Rank != 4))
531 if ( (array.GetLowerBound (0) != 15) || (array.GetUpperBound (0) != 24)
532 || (array.GetLowerBound (1) != 20) || (array.GetUpperBound (1) != 22)
533 || (array.GetLowerBound (2) != 5) || (array.GetUpperBound (2) != 10)
534 || (array.GetLowerBound (3) != 12) || (array.GetUpperBound (3) != 18) )
538 for (int i = array.GetLowerBound (3); i <= array.GetUpperBound (3); ++i) {
539 for (int j = array.GetLowerBound (2); j <= array.GetUpperBound (2); ++j) {
540 for (int k = array.GetLowerBound (1); k <= array.GetUpperBound (1); ++k) {
541 for (int l = array.GetLowerBound (0); l <= array.GetUpperBound (0); ++l) {
542 if (index != (int)array.GetValue (new long[] { l, k, j, i }))
552 array = new object[] { };
553 if (mono_test_marshal_safearray_in_byval_1dim_empty (array) != 0)
556 array = new object[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
557 if (mono_test_marshal_safearray_in_byval_1dim_vt_i4 (array) != 0)
560 array = new object[] { 0, "1", 2, "3", 4, "5", 6, "7", 8, "9", 10, "11", 12 };
561 if (mono_test_marshal_safearray_in_byval_1dim_vt_mixed (array) != 0)
563 if ((int)array.GetValue (0) != 0)
566 array = new object[,] { { 11, 12, 13, 14 }, { 21, 22, 23, 24 } };
567 if (mono_test_marshal_safearray_in_byval_2dim_vt_i4 (array) != 0)
569 if ((int)array.GetValue (new int[] { 0, 0 }) != 11)
572 array = new object[,,] { { { "111", "112", "113" }, { "121", "122", "123" } }, { { "211", "212", "213" }, { "221", "222", "223" } } };
573 if (mono_test_marshal_safearray_in_byval_3dim_vt_bstr (array) != 0)
575 if ((string)array.GetValue (new int[] { 0, 0, 0 }) != "111")
578 array = new object[,,] { { { "111", "112", "113" }, { "121", "122", "123" } }, { { "211", "212", "213" }, { "221", "222", "223" } } };
579 if ((mono_test_marshal_safearray_in_byref_3dim_vt_bstr (ref array) != 0) || (array.Rank != 3) || (array.Length != 12))
581 if ((string)array.GetValue (new int[] { 0, 0, 0 }) != "111")
586 array = new object[] { };
587 if ((mono_test_marshal_safearray_in_out_byref_1dim_empty (ref array) != 0) || (array.Rank != 1) || (array.Length != 8))
589 for (int i = 0; i < 8; ++i)
591 if (i != Convert.ToInt32 (array.GetValue (i)))
595 array = new object[,,] { { { "111", "112", "113" }, { "121", "122", "123" } }, { { "211", "212", "213" }, { "221", "222", "223" } } };
596 if ((mono_test_marshal_safearray_in_out_byref_3dim_vt_bstr (ref array) != 0) || (array.Rank != 1) || (array.Length != 8))
598 for (int i = 0; i < 8; ++i)
600 if (i != Convert.ToInt32 (array.GetValue (i)))
604 array = new object[] { 1 };
605 if ((mono_test_marshal_safearray_in_out_byref_1dim_vt_i4 (ref array) != 0) || (array.Rank != 1) || (array.Length != 1))
609 if (Convert.ToInt32 (array.GetValue (0)) != -1)
614 array = new object[] { 1 };
615 if ((mono_test_marshal_safearray_in_out_byval_1dim_vt_i4 (array) != 0) || (array.Rank != 1) || (array.Length != 1))
619 if (Convert.ToInt32 (array.GetValue (0)) != 12345)
622 array = new object[,,] { { { "111", "112", "113" }, { "121", "122", "123" } }, { { "211", "212", "213" }, { "221", "222", "223" } } };
623 if ((mono_test_marshal_safearray_in_out_byval_3dim_vt_bstr (array) != 0) || (array.Rank != 3) || (array.Length != 12))
627 if (Convert.ToInt32 (array.GetValue (new int[] { 1, 1, 1 })) != 111)
629 if (Convert.ToInt32 (array.GetValue (new int[] { 1, 1, 2 })) != 333)
631 if (Convert.ToString(array.GetValue (new int[] { 0, 1, 0 })) != "ABCDEFG")
634 /* Multiple safearray parameters with various types and options */
636 Array array1 = new object[] { 1 };
637 Array array2 = new object[,] { { 11, 12, 13, 14 }, { 21, 22, 23, 24 } };
638 Array array3 = new object[] { 0, "1", 2, "3", 4, "5", 6, "7", 8, "9", 10, "11", 12 };
639 Array array4 = new object[,,] { { { "111", "112", "113" }, { "121", "122", "123" } }, { { "211", "212", "213" }, { "221", "222", "223" } } };
640 if ( (mono_test_marshal_safearray_mixed (array1, out array2, array3, ref array4) != 0)
641 || (array1.Rank != 1) || (array1.Length != 1) || (Convert.ToInt32 (array1.GetValue (0)) != 12345)
642 || (array2.Rank != 1) || (array2.Length != 10)
643 || (array4.Rank != 1) || (array4.Length != 8)
648 for (int i = 0; i < 10; ++i)
650 if (i != Convert.ToInt32 (array2.GetValue (i)))
653 if ((int)array3.GetValue (0) != 0)
655 for (int i = 0; i < 8; ++i)
657 if (i != Convert.ToInt32 (array4.GetValue (i)))
661 #endregion // SafeArray Tests
663 #region COM Visible Test
664 TestVisible test_vis = new TestVisible();
665 IntPtr pDisp = Marshal.GetIDispatchForObject(test_vis);
666 if (pDisp == IntPtr.Zero)
676 [Guid ("00000000-0000-0000-0000-000000000001")]
677 [InterfaceType (ComInterfaceType.InterfaceIsIUnknown)]
678 public interface ITest
680 // properties need to go first since mcs puts them there
683 [return: MarshalAs (UnmanagedType.Interface)]
684 [MethodImpl (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId (5242884)]
688 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
689 void SByteIn (sbyte val);
690 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
691 void ByteIn (byte val);
692 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
693 void ShortIn (short val);
694 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
695 void UShortIn (ushort val);
696 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
697 void IntIn (int val);
698 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
699 void UIntIn (uint val);
700 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
701 void LongIn (long val);
702 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
703 void ULongIn (ulong val);
704 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
705 void FloatIn (float val);
706 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
707 void DoubleIn (double val);
708 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
709 void ITestIn ([MarshalAs (UnmanagedType.Interface)]ITest val);
710 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
711 void ITestOut ([MarshalAs (UnmanagedType.Interface)]out ITest val);
715 [Guid ("00000000-0000-0000-0000-000000000001")]
716 [InterfaceType (ComInterfaceType.InterfaceIsIUnknown)]
717 public interface ITestPresSig
719 // properties need to go first since mcs puts them there
722 [return: MarshalAs (UnmanagedType.Interface)]
723 [MethodImpl (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId (5242884)]
727 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
729 int SByteIn (sbyte val);
730 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
732 int ByteIn (byte val);
733 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
735 int ShortIn (short val);
736 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
738 int UShortIn (ushort val);
739 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
742 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
744 int UIntIn (uint val);
745 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
747 int LongIn (long val);
748 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
750 int ULongIn (ulong val);
751 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
753 int FloatIn (float val);
754 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
756 int DoubleIn (double val);
757 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
759 int ITestIn ([MarshalAs (UnmanagedType.Interface)]ITestPresSig val);
760 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
762 int ITestOut ([MarshalAs (UnmanagedType.Interface)]out ITestPresSig val);
765 [System.Runtime.InteropServices.GuidAttribute ("00000000-0000-0000-0000-000000000002")]
766 [System.Runtime.InteropServices.ComImportAttribute ()]
767 [System.Runtime.InteropServices.ClassInterfaceAttribute (ClassInterfaceType.None)]
768 public class _TestClass : ITest
770 // properties need to go first since mcs puts them there
771 public virtual extern ITest Test
773 [return: MarshalAs (UnmanagedType.Interface)]
774 [MethodImpl (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId (5242884)]
778 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
779 public virtual extern void SByteIn (sbyte val);
780 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
781 public virtual extern void ByteIn (byte val);
782 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
783 public virtual extern void ShortIn (short val);
784 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
785 public virtual extern void UShortIn (ushort val);
786 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
787 public virtual extern void IntIn (int val);
788 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
789 public virtual extern void UIntIn (uint val);
790 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
791 public virtual extern void LongIn (long val);
792 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
793 public virtual extern void ULongIn (ulong val);
794 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
795 public virtual extern void FloatIn (float val);
796 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
797 public virtual extern void DoubleIn (double val);
798 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
799 public virtual extern void ITestIn ([MarshalAs (UnmanagedType.Interface)]ITest val);
800 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
801 public virtual extern void ITestOut ([MarshalAs (UnmanagedType.Interface)]out ITest val);
804 [System.Runtime.InteropServices.GuidAttribute ("00000000-0000-0000-0000-000000000002")]
805 public class TestClass : _TestClass
809 ExtensibleClassFactory.RegisterObjectCreationCallback (new ObjectCreationDelegate (CreateObject)); ;
811 private static System.IntPtr CreateObject (System.IntPtr aggr)
814 mono_test_marshal_com_object_create (out pUnk3);
819 [System.Runtime.InteropServices.GuidAttribute ("00000000-0000-0000-0000-000000000003")]
820 public class TestActivatorClass : _TestClass
822 static TestActivatorClass ()
824 ExtensibleClassFactory.RegisterObjectCreationCallback (new ObjectCreationDelegate (CreateObject)); ;
826 private static System.IntPtr CreateObject (System.IntPtr aggr)
829 mono_test_marshal_com_object_create (out pUnk3);
834 delegate void SByteInDelegate (sbyte val);
835 delegate void ByteInDelegate (byte val);
836 delegate void ShortInDelegate (short val);
837 delegate void UShortInDelegate (ushort val);
838 delegate void IntInDelegate (int val);
839 delegate void UIntInDelegate (uint val);
840 delegate void LongInDelegate (long val);
841 delegate void ULongInDelegate (ulong val);
842 delegate void FloatInDelegate (float val);
843 delegate void DoubleInDelegate (double val);
844 delegate void ITestInDelegate (ITest val);
845 delegate void ITestOutDelegate (out ITest val);
847 public class ManagedTestPresSig : ITestPresSig
848 { // properties need to go first since mcs puts them there
849 public ITestPresSig Test
853 return new ManagedTestPresSig ();
857 public int SByteIn (sbyte val)
864 public int ByteIn (byte val)
871 public int ShortIn (short val)
878 public int UShortIn (ushort val)
885 public int IntIn (int val)
892 public int UIntIn (uint val)
899 public int LongIn (long val)
906 public int ULongIn (ulong val)
913 public int FloatIn (float val)
915 if (Math.Abs (val - 3.14f) > .000001)
920 public int DoubleIn (double val)
922 if (Math.Abs (val - 3.14f) > .000001)
927 public int ITestIn ([MarshalAs (UnmanagedType.Interface)]ITestPresSig val)
931 if (null == val as ManagedTestPresSig)
936 public int ITestOut ([MarshalAs (UnmanagedType.Interface)]out ITestPresSig val)
938 val = new ManagedTestPresSig ();
943 public class ManagedTest : ITest
945 private int status = 0;
948 get { return status; }
950 public void SByteIn (sbyte val)
956 public void ByteIn (byte val)
962 public void ShortIn (short val)
968 public void UShortIn (ushort val)
974 public void IntIn (int val)
980 public void UIntIn (uint val)
986 public void LongIn (long val)
992 public void ULongIn (ulong val)
998 public void FloatIn (float val)
1000 if (Math.Abs (val - 3.14f) > .000001)
1004 public void DoubleIn (double val)
1006 if (Math.Abs (val - 3.14) > .000001)
1010 public void ITestIn (ITest val)
1014 if (null == val as ManagedTest)
1018 public void ITestOut (out ITest val)
1020 val = new ManagedTest ();
1027 return new ManagedTest ();
1032 public static int mono_test_marshal_variant_in_callback (VarEnum vt, object obj)
1037 if (obj.GetType () != typeof (sbyte))
1039 if ((sbyte)obj != -100)
1042 case VarEnum.VT_UI1:
1043 if (obj.GetType () != typeof (byte))
1045 if ((byte)obj != 100)
1049 if (obj.GetType () != typeof (short))
1051 if ((short)obj != -100)
1054 case VarEnum.VT_UI2:
1055 if (obj.GetType () != typeof (ushort))
1057 if ((ushort)obj != 100)
1061 if (obj.GetType () != typeof (int))
1063 if ((int)obj != -100)
1066 case VarEnum.VT_UI4:
1067 if (obj.GetType () != typeof (uint))
1069 if ((uint)obj != 100)
1073 if (obj.GetType () != typeof (long))
1075 if ((long)obj != -100)
1078 case VarEnum.VT_UI8:
1079 if (obj.GetType () != typeof (ulong))
1081 if ((ulong)obj != 100)
1085 if (obj.GetType () != typeof (float))
1087 if (Math.Abs ((float)obj - 3.14f) > 1e-10)
1091 if (obj.GetType () != typeof (double))
1093 if (Math.Abs ((double)obj - 3.14) > 1e-10)
1096 case VarEnum.VT_BSTR:
1097 if (obj.GetType () != typeof (string))
1099 if ((string)obj != "PI")
1102 case VarEnum.VT_BOOL:
1103 if (obj.GetType () != typeof (bool))
1105 if ((bool)obj != true)
1112 public static int mono_test_marshal_variant_out_callback (VarEnum vt, ref object obj)
1118 case VarEnum.VT_UI1:
1124 case VarEnum.VT_UI2:
1130 case VarEnum.VT_UI4:
1136 case VarEnum.VT_UI8:
1145 case VarEnum.VT_BSTR:
1148 case VarEnum.VT_BOOL:
1155 public static int TestITest (ITest itest)
1159 itest.SByteIn (-100);
1161 itest.ShortIn (-100);
1162 itest.UShortIn (100);
1165 itest.LongIn (-100);
1166 itest.ULongIn (100);
1167 itest.FloatIn (3.14f);
1168 itest.DoubleIn (3.14);
1169 itest.ITestIn (itest);
1170 itest.ITestOut (out itest2);
1172 catch (Exception ex) {
1178 public static int TestITestPresSig (ITestPresSig itest)
1180 ITestPresSig itest2;
1181 if (itest.SByteIn (-100) != 0)
1183 if (itest.ByteIn (100) != 0)
1185 if (itest.ShortIn (-100) != 0)
1187 if (itest.UShortIn (100) != 0)
1189 if (itest.IntIn (-100) != 0)
1191 if (itest.UIntIn (100) != 0)
1193 if (itest.LongIn (-100) != 0)
1195 if (itest.ULongIn (100) != 0)
1197 if (itest.FloatIn (3.14f) != 0)
1199 if (itest.DoubleIn (3.14) != 0)
1201 if (itest.ITestIn (itest) != 0)
1203 if (itest.ITestOut (out itest2) != 0)
1208 public static int TestITestDelegate (ITest itest)
1213 SByteInDelegate SByteInFcn= itest.SByteIn;
1214 ByteInDelegate ByteInFcn = itest.ByteIn;
1215 UShortInDelegate UShortInFcn = itest.UShortIn;
1216 IntInDelegate IntInFcn = itest.IntIn;
1217 UIntInDelegate UIntInFcn = itest.UIntIn;
1218 LongInDelegate LongInFcn = itest.LongIn;
1220 ULongInDelegate ULongInFcn = itest.ULongIn;
1221 FloatInDelegate FloatInFcn = itest.FloatIn;
1222 DoubleInDelegate DoubleInFcn = itest.DoubleIn;
1223 ITestInDelegate ITestInFcn = itest.ITestIn;
1224 ITestOutDelegate ITestOutFcn = itest.ITestOut;
1236 ITestOutFcn (out itest2);
1245 public class TestVisible