1 // Licensed to the .NET Foundation under one or more agreements.
2 // The .NET Foundation licenses this file to you under the MIT license.
3 // See the LICENSE file in the project root for more information.
6 using System.Runtime.InteropServices;
11 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
12 static extern bool TakeIntArraySeqStructByVal([In]S_INTArray_Seq s, [In]int size);
13 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
14 static extern bool TakeUIntArraySeqStructByVal([In]S_UINTArray_Seq s, [In]int size);
15 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
16 static extern bool TakeShortArraySeqStructByVal([In]S_SHORTArray_Seq s, [In]int size);
17 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
18 static extern bool TakeWordArraySeqStructByVal([In]S_WORDArray_Seq s, [In]int size);
19 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
20 static extern bool TakeLong64ArraySeqStructByVal([In]S_LONG64Array_Seq s, [In]int size);
21 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
22 static extern bool TakeULong64ArraySeqStructByVal([In]S_ULONG64Array_Seq s, [In]int size);
23 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
24 static extern bool TakeDoubleArraySeqStructByVal([In]S_DOUBLEArray_Seq s, [In]int size);
25 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
26 static extern bool TakeFloatArraySeqStructByVal([In]S_FLOATArray_Seq s, [In]int size);
27 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
28 static extern bool TakeByteArraySeqStructByVal([In]S_BYTEArray_Seq s, [In]int size);
29 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
30 static extern bool TakeCharArraySeqStructByVal([In]S_CHARArray_Seq s, [In]int size);
31 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
32 static extern bool TakeLPSTRArraySeqStructByVal([In]S_LPSTRArray_Seq s, [In]int size);
33 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
34 static extern bool TakeLPCSTRArraySeqStructByVal([In]S_LPCSTRArray_Seq s, [In]int size);
35 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
36 static extern bool TakeBSTRArraySeqStructByVal([In]S_BSTRArray_Seq s, [In]int size);
37 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
38 static extern bool TakeStructArraySeqStructByVal([In]S_StructArray_Seq s, [In]int size);
39 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
40 static extern bool TakeIntArraySeqClassByVal([In]C_INTArray_Seq c, [In]int size);
41 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
42 static extern bool TakeUIntArraySeqClassByVal([In]C_UINTArray_Seq c, [In]int size);
43 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
44 static extern bool TakeShortArraySeqClassByVal([In]C_SHORTArray_Seq c, [In]int size);
45 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
46 static extern bool TakeWordArraySeqClassByVal([In]C_WORDArray_Seq c, [In]int size);
47 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
48 static extern bool TakeLong64ArraySeqClassByVal([In]C_LONG64Array_Seq c, [In]int size);
49 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
50 static extern bool TakeULong64ArraySeqClassByVal([In]C_ULONG64Array_Seq c, [In]int size);
51 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
52 static extern bool TakeDoubleArraySeqClassByVal([In]C_DOUBLEArray_Seq c, [In]int size);
53 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
54 static extern bool TakeFloatArraySeqClassByVal([In]C_FLOATArray_Seq c, [In]int size);
55 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
56 static extern bool TakeByteArraySeqClassByVal([In]C_BYTEArray_Seq c, [In]int size);
57 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
58 static extern bool TakeCharArraySeqClassByVal([In]C_CHARArray_Seq c, [In]int size);
59 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
60 static extern bool TakeLPSTRArraySeqClassByVal([In]C_LPSTRArray_Seq c, [In]int size);
61 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
62 static extern bool TakeLPCSTRArraySeqClassByVal([In]C_LPCSTRArray_Seq c, [In]int size);
63 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
64 static extern bool TakeBSTRArraySeqClassByVal([In]C_BSTRArray_Seq c, [In]int size);
65 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
66 static extern bool TakeStructArraySeqClassByVal([In]C_StructArray_Seq c, [In]int size);
68 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
69 static extern bool TakeIntArrayExpStructByVal([In]S_INTArray_Exp s, [In]int size);
70 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
71 static extern bool TakeUIntArrayExpStructByVal([In]S_UINTArray_Exp s, [In]int size);
72 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
73 static extern bool TakeShortArrayExpStructByVal([In]S_SHORTArray_Exp s, [In]int size);
74 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
75 static extern bool TakeWordArrayExpStructByVal([In]S_WORDArray_Exp s, [In]int size);
76 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
77 static extern bool TakeLong64ArrayExpStructByVal([In]S_LONG64Array_Exp s, [In]int size);
78 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
79 static extern bool TakeULong64ArrayExpStructByVal([In]S_ULONG64Array_Exp s, [In]int size);
80 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
81 static extern bool TakeDoubleArrayExpStructByVal([In]S_DOUBLEArray_Exp s, [In]int size);
82 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
83 static extern bool TakeFloatArrayExpStructByVal([In]S_FLOATArray_Exp s, [In]int size);
84 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
85 static extern bool TakeByteArrayExpStructByVal([In]S_BYTEArray_Exp s, [In]int size);
86 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
87 static extern bool TakeCharArrayExpStructByVal([In]S_CHARArray_Exp s, [In]int size);
88 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
89 static extern bool TakeLPSTRArrayExpStructByVal([In]S_LPSTRArray_Exp s, [In]int size);
90 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
91 static extern bool TakeLPCSTRArrayExpStructByVal([In]S_LPCSTRArray_Exp s, [In]int size);
92 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
93 static extern bool TakeBSTRArrayExpStructByVal([In]S_BSTRArray_Exp s, [In]int size);
94 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
95 static extern bool TakeStructArrayExpStructByVal([In]S_StructArray_Exp s, [In]int size);
96 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
97 static extern bool TakeIntArrayExpClassByVal([In]C_INTArray_Exp c, [In]int size);
98 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
99 static extern bool TakeUIntArrayExpClassByVal([In]C_UINTArray_Exp c, [In]int size);
100 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
101 static extern bool TakeShortArrayExpClassByVal([In]C_SHORTArray_Exp c, [In]int size);
102 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
103 static extern bool TakeWordArrayExpClassByVal([In]C_WORDArray_Exp c, [In]int size);
104 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
105 static extern bool TakeLong64ArrayExpClassByVal([In]C_LONG64Array_Exp c, [In]int size);
106 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
107 static extern bool TakeULong64ArrayExpClassByVal([In]C_ULONG64Array_Exp c, [In]int size);
108 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
109 static extern bool TakeDoubleArrayExpClassByVal([In]C_DOUBLEArray_Exp c, [In]int size);
110 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
111 static extern bool TakeFloatArrayExpClassByVal([In]C_FLOATArray_Exp c, [In]int size);
112 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
113 static extern bool TakeByteArrayExpClassByVal([In]C_BYTEArray_Exp c, [In]int size);
114 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
115 static extern bool TakeCharArrayExpClassByVal([In]C_CHARArray_Exp c, [In]int size);
116 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
117 static extern bool TakeLPSTRArrayExpClassByVal([In]C_LPSTRArray_Exp c, [In]int size);
118 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
119 static extern bool TakeLPCSTRArrayExpClassByVal([In]C_LPCSTRArray_Exp c, [In]int size);
120 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
121 static extern bool TakeBSTRArrayExpClassByVal([In]C_BSTRArray_Exp c, [In]int size);
122 [DllImport("MarshalArrayByValArrayNative", CallingConvention = CallingConvention.Cdecl)]
123 static extern bool TakeStructArrayExpClassByVal([In]C_StructArray_Exp c, [In]int size);
127 internal const int ARRAY_SIZE = 100;
129 static T[] InitArray<T>(int size)
131 T[] array = new T[size];
133 for (int i = 0; i < array.Length; i++)
134 array[i] = (T)Convert.ChangeType(i, typeof(T));
139 static TestStruct[] InitStructArray(int size)
141 TestStruct[] array = new TestStruct[size];
143 for (int i = 0; i < array.Length; i++)
148 array[i].str = i.ToString();
154 static bool[] InitBoolArray(int size)
156 bool[] array = new bool[size];
158 for (int i = 0; i < array.Length; i++)
171 static void RunTest1(string report)
173 Console.WriteLine(report);
174 S_INTArray_Seq s1 = new S_INTArray_Seq();
175 s1.arr = InitArray<int>(ARRAY_SIZE);
176 Assert.Throws<TypeLoadException>(() => TakeIntArraySeqStructByVal(s1, ARRAY_SIZE), "TakeIntArraySeqStructByVal");
178 S_UINTArray_Seq s2 = new S_UINTArray_Seq();
179 s2.arr = InitArray<uint>(ARRAY_SIZE);
180 Assert.Throws<TypeLoadException>(() => TakeUIntArraySeqStructByVal(s2, ARRAY_SIZE), "TakeUIntArraySeqStructByVal");
182 S_SHORTArray_Seq s3 = new S_SHORTArray_Seq();
183 s3.arr = InitArray<short>(ARRAY_SIZE);
184 Assert.Throws<TypeLoadException>(() => TakeShortArraySeqStructByVal(s3, ARRAY_SIZE), "TakeShortArraySeqStructByVal");
186 S_WORDArray_Seq s4 = new S_WORDArray_Seq();
187 s4.arr = InitArray<ushort>(ARRAY_SIZE);
188 Assert.Throws<TypeLoadException>(() => TakeWordArraySeqStructByVal(s4, ARRAY_SIZE), "TakeWordArraySeqStructByVal");
190 S_LONG64Array_Seq s5 = new S_LONG64Array_Seq();
191 s5.arr = InitArray<long>(ARRAY_SIZE);
192 Assert.Throws<TypeLoadException>(() => TakeLong64ArraySeqStructByVal(s5, ARRAY_SIZE), "TakeLong64ArraySeqStructByVal");
194 S_ULONG64Array_Seq s6 = new S_ULONG64Array_Seq();
195 s6.arr = InitArray<ulong>(ARRAY_SIZE);
196 Assert.Throws<TypeLoadException>(() => TakeULong64ArraySeqStructByVal(s6, ARRAY_SIZE), "TakeULong64ArraySeqStructByVal");
198 S_DOUBLEArray_Seq s7 = new S_DOUBLEArray_Seq();
199 s7.arr = InitArray<double>(ARRAY_SIZE);
200 Assert.Throws<TypeLoadException>(() => TakeDoubleArraySeqStructByVal(s7, ARRAY_SIZE), "TakeDoubleArraySeqStructByVal");
202 S_FLOATArray_Seq s8 = new S_FLOATArray_Seq();
203 s8.arr = InitArray<float>(ARRAY_SIZE);
204 Assert.Throws<TypeLoadException>(() => TakeFloatArraySeqStructByVal(s8, ARRAY_SIZE), "TakeFloatArraySeqStructByVal");
206 S_BYTEArray_Seq s9 = new S_BYTEArray_Seq();
207 s9.arr = InitArray<byte>(ARRAY_SIZE);
208 Assert.Throws<TypeLoadException>(() => TakeByteArraySeqStructByVal(s9, ARRAY_SIZE), "TakeByteArraySeqStructByVal");
210 S_CHARArray_Seq s10 = new S_CHARArray_Seq();
211 s10.arr = InitArray<char>(ARRAY_SIZE);
212 Assert.Throws<TypeLoadException>(() => TakeCharArraySeqStructByVal(s10, ARRAY_SIZE), "TakeCharArraySeqStructByVal");
214 S_LPSTRArray_Seq s11 = new S_LPSTRArray_Seq();
215 s11.arr = InitArray<string>(ARRAY_SIZE);
216 Assert.Throws<TypeLoadException>(() => TakeLPSTRArraySeqStructByVal(s11, ARRAY_SIZE), "TakeLPSTRArraySeqStructByVal");
218 S_LPCSTRArray_Seq s12 = new S_LPCSTRArray_Seq();
219 s12.arr = InitArray<string>(ARRAY_SIZE);
220 Assert.Throws<TypeLoadException>(() => TakeLPCSTRArraySeqStructByVal(s12, ARRAY_SIZE), "TakeLPCSTRArraySeqStructByVal");
222 if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
224 S_BSTRArray_Seq s13 = new S_BSTRArray_Seq();
225 s13.arr = InitArray<string>(ARRAY_SIZE);
226 Assert.Throws<TypeLoadException>(() => TakeBSTRArraySeqStructByVal(s13, ARRAY_SIZE), "TakeBSTRArraySeqStructByVal");
229 S_StructArray_Seq s14 = new S_StructArray_Seq();
230 s14.arr = InitStructArray(ARRAY_SIZE);
231 Assert.Throws<TypeLoadException>(() => TakeStructArraySeqStructByVal(s14, ARRAY_SIZE), "TakeStructArraySeqStructByVal");
234 static void RunTest2(string report)
236 Console.WriteLine(report);
237 C_INTArray_Seq c1 = new C_INTArray_Seq();
238 c1.arr = InitArray<int>(ARRAY_SIZE);
239 Assert.Throws<TypeLoadException>(() => TakeIntArraySeqClassByVal(c1, ARRAY_SIZE), "TakeIntArraySeqClassByVal");
241 C_UINTArray_Seq c2 = new C_UINTArray_Seq();
242 c2.arr = InitArray<uint>(ARRAY_SIZE);
243 Assert.Throws<TypeLoadException>(() => TakeUIntArraySeqClassByVal(c2, ARRAY_SIZE), "TakeUIntArraySeqClassByVal");
245 C_SHORTArray_Seq c3 = new C_SHORTArray_Seq();
246 c3.arr = InitArray<short>(ARRAY_SIZE);
247 Assert.Throws<TypeLoadException>(() => TakeShortArraySeqClassByVal(c3, ARRAY_SIZE), "TakeShortArraySeqClassByVal");
249 C_WORDArray_Seq c4 = new C_WORDArray_Seq();
250 c4.arr = InitArray<ushort>(ARRAY_SIZE);
251 Assert.Throws<TypeLoadException>(() => TakeWordArraySeqClassByVal(c4, ARRAY_SIZE), "TakeWordArraySeqClassByVal");
253 C_LONG64Array_Seq c5 = new C_LONG64Array_Seq();
254 c5.arr = InitArray<long>(ARRAY_SIZE);
255 Assert.Throws<TypeLoadException>(() => TakeLong64ArraySeqClassByVal(c5, ARRAY_SIZE), "TakeLong64ArraySeqClassByVal");
257 C_ULONG64Array_Seq c6 = new C_ULONG64Array_Seq();
258 c6.arr = InitArray<ulong>(ARRAY_SIZE);
259 Assert.Throws<TypeLoadException>(() => TakeULong64ArraySeqClassByVal(c6, ARRAY_SIZE), "TakeULong64ArraySeqClassByVal");
261 C_DOUBLEArray_Seq c7 = new C_DOUBLEArray_Seq();
262 c7.arr = InitArray<double>(ARRAY_SIZE);
263 Assert.Throws<TypeLoadException>(() => TakeDoubleArraySeqClassByVal(c7, ARRAY_SIZE), "TakeDoubleArraySeqClassByVal");
265 C_FLOATArray_Seq c8 = new C_FLOATArray_Seq();
266 c8.arr = InitArray<float>(ARRAY_SIZE);
267 Assert.Throws<TypeLoadException>(() => TakeFloatArraySeqClassByVal(c8, ARRAY_SIZE), "TakeFloatArraySeqClassByVal");
269 C_BYTEArray_Seq c9 = new C_BYTEArray_Seq();
270 c9.arr = InitArray<byte>(ARRAY_SIZE);
271 Assert.Throws<TypeLoadException>(() => TakeByteArraySeqClassByVal(c9, ARRAY_SIZE), "TakeByteArraySeqClassByVal");
273 C_CHARArray_Seq c10 = new C_CHARArray_Seq();
274 c10.arr = InitArray<char>(ARRAY_SIZE);
275 Assert.Throws<TypeLoadException>(() => TakeCharArraySeqClassByVal(c10, ARRAY_SIZE), "TakeCharArraySeqClassByVal");
277 C_LPSTRArray_Seq c11 = new C_LPSTRArray_Seq();
278 c11.arr = InitArray<string>(ARRAY_SIZE);
279 Assert.Throws<TypeLoadException>(() => TakeLPSTRArraySeqClassByVal(c11, ARRAY_SIZE), "TakeLPSTRArraySeqClassByVal");
281 C_LPCSTRArray_Seq c12 = new C_LPCSTRArray_Seq();
282 c12.arr = InitArray<string>(ARRAY_SIZE);
283 Assert.Throws<TypeLoadException>(() => TakeLPCSTRArraySeqClassByVal(c12, ARRAY_SIZE), "TakeLPCSTRArraySeqClassByVal");
285 if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
287 C_BSTRArray_Seq c13 = new C_BSTRArray_Seq();
288 c13.arr = InitArray<string>(ARRAY_SIZE);
289 Assert.Throws<TypeLoadException>(() => TakeBSTRArraySeqClassByVal(c13, ARRAY_SIZE), "TakeBSTRArraySeqClassByVal");
292 C_StructArray_Seq c14 = new C_StructArray_Seq();
293 c14.arr = InitStructArray(ARRAY_SIZE);
294 Assert.Throws<TypeLoadException>(() => TakeStructArraySeqClassByVal(c14, ARRAY_SIZE), "TakeStructArraySeqClassByVal");
297 static void RunTest3(string report)
299 Console.WriteLine(report);
301 S_INTArray_Exp s1 = new S_INTArray_Exp();
302 s1.arr = InitArray<int>(ARRAY_SIZE);
303 Assert.Throws<TypeLoadException>(() => TakeIntArrayExpStructByVal(s1, ARRAY_SIZE), "TakeIntArrayExpStructByVal");
305 S_UINTArray_Exp s2 = new S_UINTArray_Exp();
306 s2.arr = InitArray<uint>(ARRAY_SIZE);
307 Assert.Throws<TypeLoadException>(() => TakeUIntArrayExpStructByVal(s2, ARRAY_SIZE), "TakeUIntArrayExpStructByVal");
309 S_SHORTArray_Exp s3 = new S_SHORTArray_Exp();
310 s3.arr = InitArray<short>(ARRAY_SIZE);
311 Assert.Throws<TypeLoadException>(() => TakeShortArrayExpStructByVal(s3, ARRAY_SIZE), "TakeShortArrayExpStructByVal");
313 S_WORDArray_Exp s4 = new S_WORDArray_Exp();
314 s4.arr = InitArray<ushort>(ARRAY_SIZE);
315 Assert.Throws<TypeLoadException>(() => TakeWordArrayExpStructByVal(s4, ARRAY_SIZE), "TakeWordArrayExpStructByVal");
317 S_LONG64Array_Exp s5 = new S_LONG64Array_Exp();
318 s5.arr = InitArray<long>(ARRAY_SIZE);
319 Assert.Throws<TypeLoadException>(() => TakeLong64ArrayExpStructByVal(s5, ARRAY_SIZE), "TakeLong64ArrayExpStructByVal");
321 S_ULONG64Array_Exp s6 = new S_ULONG64Array_Exp();
322 s6.arr = InitArray<ulong>(ARRAY_SIZE);
323 Assert.Throws<TypeLoadException>(() => TakeULong64ArrayExpStructByVal(s6, ARRAY_SIZE), "TakeULong64ArrayExpStructByVal");
325 S_DOUBLEArray_Exp s7 = new S_DOUBLEArray_Exp();
326 s7.arr = InitArray<double>(ARRAY_SIZE);
327 Assert.Throws<TypeLoadException>(() => TakeDoubleArrayExpStructByVal(s7, ARRAY_SIZE), "TakeDoubleArrayExpStructByVal");
329 S_FLOATArray_Exp s8 = new S_FLOATArray_Exp();
330 s8.arr = InitArray<float>(ARRAY_SIZE);
331 Assert.Throws<TypeLoadException>(() => TakeFloatArrayExpStructByVal(s8, ARRAY_SIZE), "TakeFloatArrayExpStructByVal");
333 S_BYTEArray_Exp s9 = new S_BYTEArray_Exp();
334 s9.arr = InitArray<byte>(ARRAY_SIZE);
335 Assert.Throws<TypeLoadException>(() => TakeByteArrayExpStructByVal(s9, ARRAY_SIZE), "TakeByteArrayExpStructByVal");
337 S_CHARArray_Exp s10 = new S_CHARArray_Exp();
338 s10.arr = InitArray<char>(ARRAY_SIZE);
339 Assert.Throws<TypeLoadException>(() => TakeCharArrayExpStructByVal(s10, ARRAY_SIZE), "TakeCharArrayExpStructByVal");
341 S_LPSTRArray_Exp s11 = new S_LPSTRArray_Exp();
342 s11.arr = InitArray<string>(ARRAY_SIZE);
343 Assert.Throws<TypeLoadException>(() => TakeLPSTRArrayExpStructByVal(s11, ARRAY_SIZE), "TakeLPSTRArrayExpStructByVal");
345 S_LPCSTRArray_Exp s12 = new S_LPCSTRArray_Exp();
346 s12.arr = InitArray<string>(ARRAY_SIZE);
347 Assert.Throws<TypeLoadException>(() => TakeLPCSTRArrayExpStructByVal(s12, ARRAY_SIZE), "TakeLPCSTRArrayExpStructByVal");
349 if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
351 S_BSTRArray_Exp s13 = new S_BSTRArray_Exp();
352 s13.arr = InitArray<string>(ARRAY_SIZE);
353 Assert.Throws<TypeLoadException>(() => TakeBSTRArrayExpStructByVal(s13, ARRAY_SIZE), "TakeBSTRArrayExpStructByVal");
356 S_StructArray_Exp s14 = new S_StructArray_Exp();
357 s14.arr = InitStructArray(ARRAY_SIZE);
358 Assert.Throws<TypeLoadException>(() => TakeStructArrayExpStructByVal(s14, ARRAY_SIZE), "TakeStructArrayExpStructByVal");
361 static void RunTest4(string report)
363 Console.WriteLine(report);
365 C_INTArray_Exp c1 = new C_INTArray_Exp();
366 c1.arr = InitArray<int>(ARRAY_SIZE);
367 Assert.Throws<TypeLoadException>(() => TakeIntArrayExpClassByVal(c1, ARRAY_SIZE), "TakeIntArrayExpClassByVal");
369 C_UINTArray_Exp c2 = new C_UINTArray_Exp();
370 c2.arr = InitArray<uint>(ARRAY_SIZE);
371 Assert.Throws<TypeLoadException>(() => TakeUIntArrayExpClassByVal(c2, ARRAY_SIZE), "TakeUIntArrayExpClassByVal");
373 C_SHORTArray_Exp c3 = new C_SHORTArray_Exp();
374 c3.arr = InitArray<short>(ARRAY_SIZE);
375 Assert.Throws<TypeLoadException>(() => TakeShortArrayExpClassByVal(c3, ARRAY_SIZE), "TakeShortArrayExpClassByVal");
377 C_WORDArray_Exp c4 = new C_WORDArray_Exp();
378 c4.arr = InitArray<ushort>(ARRAY_SIZE);
379 Assert.Throws<TypeLoadException>(() => TakeWordArrayExpClassByVal(c4, ARRAY_SIZE), "TakeWordArrayExpClassByVal");
381 C_LONG64Array_Exp c5 = new C_LONG64Array_Exp();
382 c5.arr = InitArray<long>(ARRAY_SIZE);
383 Assert.Throws<TypeLoadException>(() => TakeLong64ArrayExpClassByVal(c5, ARRAY_SIZE), "TakeLong64ArrayExpClassByVal");
385 C_ULONG64Array_Exp c6 = new C_ULONG64Array_Exp();
386 c6.arr = InitArray<ulong>(ARRAY_SIZE);
387 Assert.Throws<TypeLoadException>(() => TakeULong64ArrayExpClassByVal(c6, ARRAY_SIZE), "TakeULong64ArrayExpClassByVal");
389 C_DOUBLEArray_Exp c7 = new C_DOUBLEArray_Exp();
390 c7.arr = InitArray<double>(ARRAY_SIZE);
391 Assert.Throws<TypeLoadException>(() => TakeDoubleArrayExpClassByVal(c7, ARRAY_SIZE), "TakeDoubleArrayExpClassByVal");
393 C_FLOATArray_Exp c8 = new C_FLOATArray_Exp();
394 c8.arr = InitArray<float>(ARRAY_SIZE);
395 Assert.Throws<TypeLoadException>(() => TakeFloatArrayExpClassByVal(c8, ARRAY_SIZE), "TakeFloatArrayExpClassByVal");
397 C_BYTEArray_Exp c9 = new C_BYTEArray_Exp();
398 c9.arr = InitArray<byte>(ARRAY_SIZE);
399 Assert.Throws<TypeLoadException>(() => TakeByteArrayExpClassByVal(c9, ARRAY_SIZE), "TakeByteArrayExpClassByVal");
401 C_CHARArray_Exp c10 = new C_CHARArray_Exp();
402 c10.arr = InitArray<char>(ARRAY_SIZE);
403 Assert.Throws<TypeLoadException>(() => TakeCharArrayExpClassByVal(c10, ARRAY_SIZE), "TakeCharArrayExpClassByVal");
405 C_LPSTRArray_Exp c11 = new C_LPSTRArray_Exp();
406 c11.arr = InitArray<string>(ARRAY_SIZE);
407 Assert.Throws<TypeLoadException>(() => TakeLPSTRArrayExpClassByVal(c11, ARRAY_SIZE), "TakeLPSTRArrayExpClassByVal");
409 C_LPCSTRArray_Exp c12 = new C_LPCSTRArray_Exp();
410 c12.arr = InitArray<string>(ARRAY_SIZE);
411 Assert.Throws<TypeLoadException>(() => TakeLPCSTRArrayExpClassByVal(c12, ARRAY_SIZE), "TakeLPCSTRArrayExpClassByVal");
413 if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
415 C_BSTRArray_Exp c13 = new C_BSTRArray_Exp();
416 c13.arr = InitArray<string>(ARRAY_SIZE);
417 Assert.Throws<TypeLoadException>(() => TakeBSTRArrayExpClassByVal(c13, ARRAY_SIZE), "TakeBSTRArrayExpClassByVal");
420 C_StructArray_Exp c14 = new C_StructArray_Exp();
421 c14.arr = InitStructArray(ARRAY_SIZE);
422 Assert.Throws<TypeLoadException>(() => TakeStructArrayExpClassByVal(c14, ARRAY_SIZE), "TakeStructArrayExpClassByVal");
425 static int Main(string[] args)
429 RunTest1("RunTest 1 : Marshal Array In Sequential Struct As LPArray. ");
430 RunTest2("RunTest 2 : Marshal Array In Sequential Class As LPArray. ");
431 if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
433 RunTest3("RunTest 3 : Marshal Array In Explicit Struct As LPArray. ");
435 RunTest4("RunTest 4 : Marshal Array In Explicit Class As LPArray. ");
436 Console.WriteLine("\nTest PASS.");
441 Console.WriteLine($"\nTest FAIL: {e}");