summaryrefslogtreecommitdiff
path: root/tests/src/Interop
diff options
context:
space:
mode:
authorJohn Bottenberg <jobotten@microsoft.com>2016-03-30 11:38:21 -0700
committerJohn Bottenberg <jobotten@microsoft.com>2016-03-30 11:43:35 -0700
commit6648620070db5f33979cfedd74853e9cfab652f3 (patch)
treec5ea8888f6ed3f59f4cebd295cc2581c58934433 /tests/src/Interop
parent831ce3c7db6b532420dcb778918a7554a6fc2965 (diff)
downloadcoreclr-6648620070db5f33979cfedd74853e9cfab652f3.tar.gz
coreclr-6648620070db5f33979cfedd74853e9cfab652f3.tar.bz2
coreclr-6648620070db5f33979cfedd74853e9cfab652f3.zip
Port more Interop tests from Desktop CLR to CoreCLR
Diffstat (limited to 'tests/src/Interop')
-rw-r--r--tests/src/Interop/CMakeLists.txt6
-rw-r--r--tests/src/Interop/EnumMarshalling/CMakeLists.txt9
-rw-r--r--tests/src/Interop/EnumMarshalling/EnumTest.csproj49
-rw-r--r--tests/src/Interop/EnumMarshalling/MarshalEnumManaged.cs69
-rw-r--r--tests/src/Interop/EnumMarshalling/MarshalEnumNative.cpp23
-rw-r--r--tests/src/Interop/EnumMarshalling/project.json35
-rw-r--r--tests/src/Interop/FuncPtrAsDelegateParam/CMakeLists.txt10
-rw-r--r--tests/src/Interop/FuncPtrAsDelegateParam/FuncPtrAsDelegateParam.csproj49
-rw-r--r--tests/src/Interop/FuncPtrAsDelegateParam/FuncPtrAsDelegateParamManaged.csbin0 -> 2480 bytes
-rw-r--r--tests/src/Interop/FuncPtrAsDelegateParam/FuncPtrAsDelegateParamNative.cpp28
-rw-r--r--tests/src/Interop/FuncPtrAsDelegateParam/project.json35
-rw-r--r--tests/src/Interop/SimpleStruct/CMakeLists.txt10
-rw-r--r--tests/src/Interop/SimpleStruct/SimpleStruct.csproj49
-rw-r--r--tests/src/Interop/SimpleStruct/SimpleStructManaged.cs490
-rw-r--r--tests/src/Interop/SimpleStruct/SimpleStructNative.cpp107
-rw-r--r--tests/src/Interop/SimpleStruct/project.json35
-rw-r--r--tests/src/Interop/StructMarshalling/PInvoke/CMakeLists.txt10
-rw-r--r--tests/src/Interop/StructMarshalling/PInvoke/Helper.cs905
-rw-r--r--tests/src/Interop/StructMarshalling/PInvoke/MarshalStructAsLayoutExp.cs1570
-rw-r--r--tests/src/Interop/StructMarshalling/PInvoke/MarshalStructAsLayoutExp.csproj50
-rw-r--r--tests/src/Interop/StructMarshalling/PInvoke/MarshalStructAsLayoutSeq.cs2271
-rw-r--r--tests/src/Interop/StructMarshalling/PInvoke/MarshalStructAsLayoutSeq.csproj50
-rw-r--r--tests/src/Interop/StructMarshalling/PInvoke/MarshalStructAsParamDLL.cpp1145
-rw-r--r--tests/src/Interop/StructMarshalling/PInvoke/MarshalStructAsParamDLL.h900
-rw-r--r--tests/src/Interop/StructMarshalling/PInvoke/Struct.cs272
-rw-r--r--tests/src/Interop/StructMarshalling/PInvoke/project.json35
26 files changed, 8211 insertions, 1 deletions
diff --git a/tests/src/Interop/CMakeLists.txt b/tests/src/Interop/CMakeLists.txt
index f3478fd56f..4e4200a8a3 100644
--- a/tests/src/Interop/CMakeLists.txt
+++ b/tests/src/Interop/CMakeLists.txt
@@ -4,10 +4,14 @@ add_subdirectory(PrimitiveMarshalling/Bool)
add_subdirectory(PrimitiveMarshalling/UIntPtr)
add_subdirectory(ArrayMarshalling/BoolArray)
add_subdirectory(ArrayMarshalling/ByValArray)
+add_subdirectory(EnumMarshalling)
+add_subdirectory(FuncPtrAsDelegateParam)
+add_subdirectory(SimpleStruct)
+add_subdirectory(StructMarshalling/PInvoke)
add_subdirectory(BestFitMapping)
add_subdirectory(RefInt)
add_subdirectory(RefCharArray)
add_subdirectory(StringMarshalling/LPSTR)
add_subdirectory(StringMarshalling/LPTSTR)
add_subdirectory(MarshalAPI/FunctionPointer)
-add_subdirectory(MarshalAPI/IUnknown) \ No newline at end of file
+add_subdirectory(MarshalAPI/IUnknown)
diff --git a/tests/src/Interop/EnumMarshalling/CMakeLists.txt b/tests/src/Interop/EnumMarshalling/CMakeLists.txt
new file mode 100644
index 0000000000..42eaff6394
--- /dev/null
+++ b/tests/src/Interop/EnumMarshalling/CMakeLists.txt
@@ -0,0 +1,9 @@
+cmake_minimum_required (VERSION 2.6)
+project (MarshalEnumNative)
+set(SOURCES MarshalEnumNative.cpp )
+
+# add the executable
+add_library (MarshalEnumNative SHARED ${SOURCES})
+
+# add the install targets
+install (TARGETS MarshalEnumNative DESTINATION bin) \ No newline at end of file
diff --git a/tests/src/Interop/EnumMarshalling/EnumTest.csproj b/tests/src/Interop/EnumMarshalling/EnumTest.csproj
new file mode 100644
index 0000000000..000fba21a1
--- /dev/null
+++ b/tests/src/Interop/EnumMarshalling/EnumTest.csproj
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>EnumTest</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{F1E66554-8C8E-4141-85CF-D0CD6A0CD0B0}</ProjectGuid>
+ <OutputType>exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ <DefineConstants>$(DefineConstants);STATIC</DefineConstants>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="*.cs" />
+ <Compile Include="..\common\Assertion.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="project.json" />
+ </ItemGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\..\Common\CoreCLRTestLibrary\CoreCLRTestLibrary.csproj">
+ <Project>{c8c0dc74-fac4-45b1-81fe-70c4808366e0}</Project>
+ <Name>CoreCLRTestLibrary</Name>
+ </ProjectReference>
+ <ProjectReference Include="CMakeLists.txt">
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+</Project> \ No newline at end of file
diff --git a/tests/src/Interop/EnumMarshalling/MarshalEnumManaged.cs b/tests/src/Interop/EnumMarshalling/MarshalEnumManaged.cs
new file mode 100644
index 0000000000..23c497aa2f
--- /dev/null
+++ b/tests/src/Interop/EnumMarshalling/MarshalEnumManaged.cs
@@ -0,0 +1,69 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using TestLibrary;
+using System.Runtime.InteropServices;
+
+namespace EnumRoundtrip
+{
+ class MarshalEnumManaged
+ {
+ [Flags]
+ public enum DialogResult
+ {
+ None = 0x01,
+ OK = 0x02,
+ Cancel = 0x03
+ }
+
+ #region pinvoke declarations
+ //cdecl
+
+ [DllImport("MarshalEnumNative", CallingConvention = CallingConvention.Cdecl)]
+ public static extern int CdeclEnum(DialogResult r, ref bool result);
+
+ [DllImport("MarshalEnumNative", EntryPoint = "GetFptr")]
+ [return: MarshalAs(UnmanagedType.FunctionPtr)]
+ public static extern CdeclEnumDelegate GetFptrCdeclEnum();
+
+
+ #endregion
+
+ #region delegate pinvoke
+ //cdecl
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ public delegate int CdeclEnumDelegate(DialogResult r, ref bool result);
+
+ #endregion
+ [System.Security.SecuritySafeCritical]
+ static int Main(string[] args)
+ {
+ bool result = true;
+ int r = 0;
+
+ TestFramework.BeginScenario("\n\nTest #1 (Roundtrip of enum).");
+
+ TestFramework.LogInformation("Direct p/invoke cdecl calling convention");
+ //direct pinvoke - cdecl
+ r = CdeclEnum(DialogResult.None | DialogResult.OK, ref result);
+ if ((!result) || (r != 3))
+ {
+ TestFramework.LogError("02", "Main : Returned value of enum doesn't match with the value passed in to pinvoke call");
+ return 101;
+ }
+
+ TestFramework.LogInformation("Delegate p/invoke cdecl calling convention");
+ //delegate pincoke - cdecl
+ CdeclEnumDelegate cdecdel = GetFptrCdeclEnum();
+ r = cdecdel(DialogResult.None | DialogResult.OK, ref result);
+ if ((!result) || (r != 3))
+ {
+ TestFramework.LogError("04", "Main : Returned value of enum doesn't match with the value passed in to pinvoke call");
+ return 101;
+ }
+
+ Console.WriteLine("PASS");
+ return 100;
+ }
+ }
+}
diff --git a/tests/src/Interop/EnumMarshalling/MarshalEnumNative.cpp b/tests/src/Interop/EnumMarshalling/MarshalEnumNative.cpp
new file mode 100644
index 0000000000..c1e37ca4bf
--- /dev/null
+++ b/tests/src/Interop/EnumMarshalling/MarshalEnumNative.cpp
@@ -0,0 +1,23 @@
+#include <xplatform.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+typedef void *voidPtr;
+
+extern "C" DLL_EXPORT long WINAPI CdeclEnum(int r,BOOL *result)
+{
+ if(r != 3)
+ {
+ printf("\nThe enum value is different from expected one\n");
+ *(result)= FALSE;
+ return 0;
+ }
+ return r;
+}
+
+
+extern "C" DLL_EXPORT voidPtr WINAPI GetFptr(int i)
+{
+ return (voidPtr) &CdeclEnum;
+}
diff --git a/tests/src/Interop/EnumMarshalling/project.json b/tests/src/Interop/EnumMarshalling/project.json
new file mode 100644
index 0000000000..d0bba5fe35
--- /dev/null
+++ b/tests/src/Interop/EnumMarshalling/project.json
@@ -0,0 +1,35 @@
+{
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1-rc2-23816",
+ "System.Collections": "4.0.10",
+ "System.Collections.NonGeneric": "4.0.1-rc2-23816",
+ "System.Collections.Specialized": "4.0.1-rc2-23816",
+ "System.ComponentModel": "4.0.1-rc2-23816",
+ "System.Console": "4.0.0-rc2-23816",
+ "System.Diagnostics.Process": "4.1.0-rc2-23816",
+ "System.Globalization": "4.0.10",
+ "System.Globalization.Calendars": "4.0.0",
+ "System.IO": "4.0.10",
+ "System.IO.FileSystem": "4.0.0",
+ "System.IO.FileSystem.Primitives": "4.0.0",
+ "System.Linq": "4.0.1-rc2-23816",
+ "System.Linq.Queryable": "4.0.1-rc2-23816",
+ "System.Reflection": "4.0.10",
+ "System.Reflection.Primitives": "4.0.0",
+ "System.Runtime": "4.1.0-rc2-23816",
+ "System.Runtime.Extensions": "4.0.10",
+ "System.Runtime.Handles": "4.0.0",
+ "System.Runtime.InteropServices": "4.1.0-rc2-23816",
+ "System.Runtime.Loader": "4.0.0-rc2-23816",
+ "System.Text.Encoding": "4.0.10",
+ "System.Threading": "4.0.10",
+ "System.Threading.Thread": "4.0.0-rc2-23816",
+ "System.Xml.ReaderWriter": "4.0.11-rc2-23816",
+ "System.Xml.XDocument": "4.0.11-rc2-23816",
+ "System.Xml.XmlDocument": "4.0.1-rc2-23816",
+ "System.Xml.XmlSerializer": "4.0.11-rc2-23816"
+ },
+ "frameworks": {
+ "dnxcore50": {}
+ }
+} \ No newline at end of file
diff --git a/tests/src/Interop/FuncPtrAsDelegateParam/CMakeLists.txt b/tests/src/Interop/FuncPtrAsDelegateParam/CMakeLists.txt
new file mode 100644
index 0000000000..3fa62f1b84
--- /dev/null
+++ b/tests/src/Interop/FuncPtrAsDelegateParam/CMakeLists.txt
@@ -0,0 +1,10 @@
+cmake_minimum_required (VERSION 2.6)
+project (FuncPtrAsDelegateParamNative)
+include_directories(${INC_PLATFORM_DIR})
+set(SOURCES FuncPtrAsDelegateParamNative.cpp )
+
+# add the executable
+add_library (FuncPtrAsDelegateParamNative SHARED ${SOURCES})
+
+# add the install targets
+install (TARGETS FuncPtrAsDelegateParamNative DESTINATION bin) \ No newline at end of file
diff --git a/tests/src/Interop/FuncPtrAsDelegateParam/FuncPtrAsDelegateParam.csproj b/tests/src/Interop/FuncPtrAsDelegateParam/FuncPtrAsDelegateParam.csproj
new file mode 100644
index 0000000000..f5c95fa8e1
--- /dev/null
+++ b/tests/src/Interop/FuncPtrAsDelegateParam/FuncPtrAsDelegateParam.csproj
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>FuncPtrAsDelegateParam</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{F1E66554-8C8E-4141-85CF-D0CD6A0CD0B0}</ProjectGuid>
+ <OutputType>exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ <DefineConstants>$(DefineConstants);STATIC</DefineConstants>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="*.cs" />
+ <Compile Include="..\common\Assertion.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="project.json" />
+ </ItemGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\..\Common\CoreCLRTestLibrary\CoreCLRTestLibrary.csproj">
+ <Project>{c8c0dc74-fac4-45b1-81fe-70c4808366e0}</Project>
+ <Name>CoreCLRTestLibrary</Name>
+ </ProjectReference>
+ <ProjectReference Include="CMakeLists.txt">
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+</Project> \ No newline at end of file
diff --git a/tests/src/Interop/FuncPtrAsDelegateParam/FuncPtrAsDelegateParamManaged.cs b/tests/src/Interop/FuncPtrAsDelegateParam/FuncPtrAsDelegateParamManaged.cs
new file mode 100644
index 0000000000..324f9a22a8
--- /dev/null
+++ b/tests/src/Interop/FuncPtrAsDelegateParam/FuncPtrAsDelegateParamManaged.cs
Binary files differ
diff --git a/tests/src/Interop/FuncPtrAsDelegateParam/FuncPtrAsDelegateParamNative.cpp b/tests/src/Interop/FuncPtrAsDelegateParam/FuncPtrAsDelegateParamNative.cpp
new file mode 100644
index 0000000000..9c9d36dbef
--- /dev/null
+++ b/tests/src/Interop/FuncPtrAsDelegateParam/FuncPtrAsDelegateParamNative.cpp
@@ -0,0 +1,28 @@
+#include "platformdefines.cpp"
+#include <stdio.h>
+#include <stdlib.h>
+#include <xplatform.h>
+
+//Value Pass N-->M M--->N
+//STDcall 200 9999
+//Cdecl -1 678
+
+
+int WINAPI CdeTest()
+{
+ return -1;
+}
+
+typedef int (WINAPI *pFunc)();
+typedef int (WINAPI *Cdeclcaller)(pFunc);
+extern "C" DLL_EXPORT BOOL WINAPI DoCallBack_Cdecl(Cdeclcaller caller)
+{
+ printf("DoCallBack_Cdecl\n");
+
+ if(678 != caller(CdeTest))
+ {
+ printf("Error:The Return value from caller is wrong!\n");
+ return FALSE;
+ }
+ return TRUE;
+} \ No newline at end of file
diff --git a/tests/src/Interop/FuncPtrAsDelegateParam/project.json b/tests/src/Interop/FuncPtrAsDelegateParam/project.json
new file mode 100644
index 0000000000..d0bba5fe35
--- /dev/null
+++ b/tests/src/Interop/FuncPtrAsDelegateParam/project.json
@@ -0,0 +1,35 @@
+{
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1-rc2-23816",
+ "System.Collections": "4.0.10",
+ "System.Collections.NonGeneric": "4.0.1-rc2-23816",
+ "System.Collections.Specialized": "4.0.1-rc2-23816",
+ "System.ComponentModel": "4.0.1-rc2-23816",
+ "System.Console": "4.0.0-rc2-23816",
+ "System.Diagnostics.Process": "4.1.0-rc2-23816",
+ "System.Globalization": "4.0.10",
+ "System.Globalization.Calendars": "4.0.0",
+ "System.IO": "4.0.10",
+ "System.IO.FileSystem": "4.0.0",
+ "System.IO.FileSystem.Primitives": "4.0.0",
+ "System.Linq": "4.0.1-rc2-23816",
+ "System.Linq.Queryable": "4.0.1-rc2-23816",
+ "System.Reflection": "4.0.10",
+ "System.Reflection.Primitives": "4.0.0",
+ "System.Runtime": "4.1.0-rc2-23816",
+ "System.Runtime.Extensions": "4.0.10",
+ "System.Runtime.Handles": "4.0.0",
+ "System.Runtime.InteropServices": "4.1.0-rc2-23816",
+ "System.Runtime.Loader": "4.0.0-rc2-23816",
+ "System.Text.Encoding": "4.0.10",
+ "System.Threading": "4.0.10",
+ "System.Threading.Thread": "4.0.0-rc2-23816",
+ "System.Xml.ReaderWriter": "4.0.11-rc2-23816",
+ "System.Xml.XDocument": "4.0.11-rc2-23816",
+ "System.Xml.XmlDocument": "4.0.1-rc2-23816",
+ "System.Xml.XmlSerializer": "4.0.11-rc2-23816"
+ },
+ "frameworks": {
+ "dnxcore50": {}
+ }
+} \ No newline at end of file
diff --git a/tests/src/Interop/SimpleStruct/CMakeLists.txt b/tests/src/Interop/SimpleStruct/CMakeLists.txt
new file mode 100644
index 0000000000..4f990270df
--- /dev/null
+++ b/tests/src/Interop/SimpleStruct/CMakeLists.txt
@@ -0,0 +1,10 @@
+cmake_minimum_required (VERSION 2.6)
+project (SimpleStructNative)
+include_directories(${INC_PLATFORM_DIR})
+set(SOURCES SimpleStructNative.cpp )
+
+# add the executable
+add_library (SimpleStructNative SHARED ${SOURCES})
+
+# add the install targets
+install (TARGETS SimpleStructNative DESTINATION bin) \ No newline at end of file
diff --git a/tests/src/Interop/SimpleStruct/SimpleStruct.csproj b/tests/src/Interop/SimpleStruct/SimpleStruct.csproj
new file mode 100644
index 0000000000..f564b645c4
--- /dev/null
+++ b/tests/src/Interop/SimpleStruct/SimpleStruct.csproj
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>SimpleStruct</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{F1E66554-8C8E-4141-85CF-D0CD6A0CD0B0}</ProjectGuid>
+ <OutputType>exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ <DefineConstants>$(DefineConstants);STATIC</DefineConstants>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="*.cs" />
+ <Compile Include="..\common\Assertion.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="project.json" />
+ </ItemGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\..\Common\CoreCLRTestLibrary\CoreCLRTestLibrary.csproj">
+ <Project>{c8c0dc74-fac4-45b1-81fe-70c4808366e0}</Project>
+ <Name>CoreCLRTestLibrary</Name>
+ </ProjectReference>
+ <ProjectReference Include="CMakeLists.txt">
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+</Project> \ No newline at end of file
diff --git a/tests/src/Interop/SimpleStruct/SimpleStructManaged.cs b/tests/src/Interop/SimpleStruct/SimpleStructManaged.cs
new file mode 100644
index 0000000000..c815015a39
--- /dev/null
+++ b/tests/src/Interop/SimpleStruct/SimpleStructManaged.cs
@@ -0,0 +1,490 @@
+using System;
+using System.Security;
+using System.Collections.Generic;
+using System.Text;
+using System.Runtime.InteropServices;
+using TestLibrary;
+
+namespace PInvokeTests
+{
+ #region structure def
+
+ [SecuritySafeCritical]
+ [StructLayout(LayoutKind.Sequential)]
+ public struct Sstr
+ {
+ public int a;
+ public bool b;
+ public string str;
+
+ public Sstr(int _a, bool _b, string _str)
+ {
+ a = _a;
+ b = _b;
+ str = String.Concat(_str, "");
+ }
+ }
+
+ //Using this structure for pass by value scenario
+ //because we don't support returning a structure
+ //containing a non-blittable type like string.
+
+ [SecuritySafeCritical]
+ [StructLayout(LayoutKind.Sequential)]
+ public struct Sstr_simple
+ {
+ public int a;
+ public bool b;
+ public double c;
+
+ public Sstr_simple(int _a, bool _b, double _c)
+ {
+ a = _a;
+ b = _b;
+ c = _c;
+ }
+ }
+
+ [SecuritySafeCritical]
+ [StructLayout(LayoutKind.Explicit)]
+ public struct ExplStruct
+ {
+ [FieldOffset(0)]
+ public DialogResult type;
+
+ [FieldOffset(8)]
+ public int i;
+
+ [FieldOffset(8)]
+ public bool b;
+
+ [FieldOffset(8)]
+ public double c;
+
+ public ExplStruct(DialogResult t, int num)
+ {
+ type = t;
+ b = false;
+ c = num;
+ i = num;
+ }
+ public ExplStruct(DialogResult t, double dnum)
+ {
+ type = t;
+ b = false;
+ i = 0;
+ c = dnum;
+ }
+ public ExplStruct(DialogResult t, bool bnum)
+ {
+ type = t;
+ i = 0;
+ c = 0;
+ b = bnum;
+ }
+ }
+
+ public enum DialogResult
+ {
+ None = 0,
+ OK = 1,
+ Cancel = 2
+ }
+ #endregion
+
+ class StructureTests
+ {
+ #region direct Pinvoke declarartions
+
+ #region cdecl
+ //Simple struct - sequential layout by ref
+ [DllImport("SimpleStructNative", CallingConvention = CallingConvention.Cdecl)]
+ private static extern bool CdeclSimpleStructByRef(ref Sstr p);
+
+ [DllImport("SimpleStructNative", EntryPoint = "GetFptr")]
+ [return: MarshalAs(UnmanagedType.FunctionPtr)]
+ public static extern CdeclSimpleStructByRefDelegate GetFptrCdeclSimpleStructByRef(int i);
+
+ //Simple struct - sequential layout by value
+ [DllImport("SimpleStructNative", CallingConvention = CallingConvention.Cdecl)]
+ private static extern IntPtr CdeclSimpleStruct(Sstr_simple p, ref bool retval);
+
+ [DllImport("SimpleStructNative", EntryPoint = "GetFptr")]
+ [return: MarshalAs(UnmanagedType.FunctionPtr)]
+ public static extern CdeclSimpleStructDelegate GetFptrCdeclSimpleStruct(int i);
+
+ //Simple struct - explicit layout by value
+ [DllImport("SimpleStructNative", CallingConvention = CallingConvention.Cdecl)]
+ private static extern IntPtr CdeclSimpleExplStruct(ExplStruct p, ref bool retval);
+
+ [DllImport("SimpleStructNative", EntryPoint = "GetFptr")]
+ [return: MarshalAs(UnmanagedType.FunctionPtr)]
+ public static extern CdeclSimpleExplStructDelegate GetFptrCdeclSimpleExplStruct(int i);
+
+ //Simple struct - explicit layout by ref
+ [DllImport("SimpleStructNative", EntryPoint = "GetFptr")]
+ [return: MarshalAs(UnmanagedType.FunctionPtr)]
+ public static extern CdeclSimpleExplStructByRefDelegate GetFptrCdeclSimpleExplStructByRef(int i);
+
+ [DllImport("SimpleStructNative", CallingConvention = CallingConvention.Cdecl)]
+ private static extern bool CdeclSimpleExplStructByRef(ref ExplStruct p);
+
+ #endregion
+
+ #endregion
+
+ #region delegate pinvoke
+ //Simple struct - sequential layout by value
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ public delegate IntPtr CdeclSimpleStructDelegate(Sstr_simple p, ref bool retval);
+
+ //Simple struct - explicit layout by value
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ public delegate IntPtr CdeclSimpleExplStructDelegate(ExplStruct p, ref bool retval);
+
+ //Simple struct - sequential layout by ref
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ public delegate bool CdeclSimpleStructByRefDelegate(ref Sstr p);
+
+ //Simple struct - explicit layout by ref
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ public delegate bool CdeclSimpleExplStructByRefDelegate(ref ExplStruct p);
+
+ #endregion
+
+ #region reverse pinvoke
+
+ #endregion
+
+ #region public methods related to pinvoke declrarations
+ //Simple struct - sequential layout by ref
+ [System.Security.SecuritySafeCritical]
+ public static bool DoCdeclSimpleStructByRef(ref Sstr p)
+ {
+ return CdeclSimpleStructByRef(ref p);
+ }
+
+ //Simple struct - explicit by ref
+ [System.Security.SecuritySafeCritical]
+ public static bool DoCdeclSimpleExplStructByRef(ref ExplStruct p)
+ {
+ return CdeclSimpleExplStructByRef(ref p);
+ }
+
+ //Simple struct - sequential layout by value
+ [System.Security.SecuritySafeCritical]
+ public static Sstr_simple DoCdeclSimpleStruct(Sstr_simple p, ref bool retval)
+ {
+ IntPtr st = CdeclSimpleStruct(p, ref retval);
+ Sstr_simple simple = (Sstr_simple)Marshal.PtrToStructure(st, typeof(Sstr_simple));
+ return simple;
+ }
+
+ //Simple Struct - Explicit layout by value
+ [System.Security.SecuritySafeCritical]
+ public static ExplStruct DoCdeclSimpleExplStruct(ExplStruct p, ref bool retval)
+ {
+ IntPtr st = CdeclSimpleExplStruct(p, ref retval);
+ ExplStruct simple = (ExplStruct)Marshal.PtrToStructure(st, typeof(ExplStruct));
+ return simple;
+ }
+
+ #endregion
+
+ #region test methods
+ //Simple sequential struct by reference testcase
+ [System.Security.SecuritySafeCritical]
+ public static bool PosTest1()
+ {
+ string s = "before";
+ string changedValue = "after";
+ bool retval = true;
+ Sstr p = new Sstr(0, false, s);
+
+ TestFramework.BeginScenario("Test #1 (Roundtrip of a simple structre by reference. Verify that values updated on unmanaged side reflect on managed side)");
+
+ //Direct pinvoke
+
+ //cdecl calling convention.
+ try
+ {
+ TestFramework.LogInformation(" Case 2: Direct p/invoke cdecl calling convention");
+ retval = DoCdeclSimpleStructByRef(ref p);
+
+ if ((p.a != 100) || (!p.b) || (!p.str.Equals(changedValue)))
+ {
+ Console.WriteLine("\nExpected values:\n SimpleStruct->a=" + 100 + "\nSimpleStruct->b=TRUE\n" + "SimpleStruct->str=after\n");
+ Console.WriteLine("\nActual values:\n SimpleStruct->a=" + p.a + "\nSimpleStruct->b=" + p.b + "\nSimpleStruct->str=" + p.str + "\n");
+ TestFramework.LogError("03", "PInvokeTests->PosTest1 : Returned values are different from expected values");
+ retval = false;
+ }
+ }
+ catch (Exception e)
+ {
+ TestFramework.LogError("04", "Unexpected exception: " + e.ToString());
+ retval = false;
+ }
+
+ //Delegate pinvoke
+
+ //cdecl
+ try
+ {
+ TestFramework.LogInformation(" Case 4: Delegate p/invoke - cdecl calling convention");
+ CdeclSimpleStructByRefDelegate std = GetFptrCdeclSimpleStructByRef(14);
+
+ retval = std(ref p);
+
+ if ((p.a != 100) || (!p.b) || (!p.str.Equals(changedValue)))
+ {
+ Console.WriteLine("\nExpected values:\n SimpleStruct->a=" + 100 + "\nSimpleStruct->b=TRUE\n" + "SimpleStruct->str=after\n");
+ Console.WriteLine("\nActual values:\n SimpleStruct->a=" + p.a + "\nSimpleStruct->b=" + p.b + "\nSimpleStruct->str=" + p.str + "\n");
+ TestFramework.LogError("01", "PInvokeTests->PosTest1 : Returned values are different from expected values");
+ retval = false;
+ }
+ }
+ catch (Exception e)
+ {
+ TestFramework.LogError("02", "Unexpected exception: " + e.ToString());
+ retval = false;
+ }
+
+
+ return retval;
+ }
+
+ //Simple Sequential struct by value
+ [System.Security.SecuritySafeCritical]
+ public static bool PosTest2()
+ {
+ string s = "Before";
+ bool retval = true;
+ double d = 3.142;
+ Sstr p = new Sstr(100, false, s);
+
+ TestFramework.BeginScenario("\n\nTest #2 (Roundtrip of a simple structre by value. Verify that values updated on unmanaged side reflect on managed side)");
+ //direct pinvoke
+
+ // //cdecl calling convention
+ try
+ {
+ TestFramework.LogInformation(" Case 2: Direct p/invoke cdecl calling convention");
+ Sstr_simple simple = new Sstr_simple(100, false, d);
+ simple = DoCdeclSimpleStruct(simple, ref retval);
+
+ if (retval == false)
+ {
+ TestFramework.LogError("01", "PInvokeTests->PosTest2 : values of passed in structure not matched with expected once on unmanaged side.");
+ return false;
+ }
+ if ((simple.a != 101) || (!simple.b) || (simple.c != 10.11))
+ {
+ Console.WriteLine("\nExpected values:\n SimpleStruct->a=101\nSimpleStruct->b=TRUE\nSimpleStruct->c=10.11\n");
+ Console.WriteLine("\nActual values:\n SimpleStruct->a=" + simple.a + "\nSimpleStruct->b=" + simple.b + "\nSimpleStruct->c=" + simple.c + "\n");
+ TestFramework.LogError("02", "PInvokeTests->PosTest2 : Returned values are different from expected values");
+ retval = false;
+ }
+ }
+ catch (Exception e)
+ {
+
+ TestFramework.LogError("03", "Unexpected exception: " + e.ToString());
+ retval = false;
+ }
+
+ // //delegate pinvoke
+
+ // //cdecl calling convention
+ try
+ {
+ TestFramework.LogInformation(" Case 4: Delegate p/invoke cdecl calling convention");
+ Sstr_simple simple = new Sstr_simple(100, false, d);
+ CdeclSimpleStructDelegate std = GetFptrCdeclSimpleStruct(16);
+
+ IntPtr st = std(simple, ref retval);
+ simple = (Sstr_simple)Marshal.PtrToStructure(st, typeof(Sstr_simple));
+
+
+ if (retval == false)
+ {
+ TestFramework.LogError("01", "PInvokeTests->PosTest2 : values of passed in structure not matched with expected once on unmanaged side.");
+ return false;
+ }
+ if ((simple.a != 101) || (!simple.b) || (simple.c != 10.11))
+ {
+ Console.WriteLine("\nExpected values:\n SimpleStruct->a=101\nSimpleStruct->b=TRUE\nSimpleStruct->c=10.11\n");
+ Console.WriteLine("\nActual values:\n SimpleStruct->a=" + simple.a + "\nSimpleStruct->b=" + simple.b + "\nSimpleStruct->c=" + simple.c + "\n");
+ TestFramework.LogError("02", "PInvokeTests->PosTest2 : Returned values are different from expected values");
+ retval = false;
+ }
+ }
+ catch (Exception e)
+ {
+ TestFramework.LogError("03", "Unexpected exception: " + e.ToString());
+ retval = false;
+ }
+ return retval;
+ }
+
+ //Simple struct explicit layout by reference.
+ [System.Security.SecuritySafeCritical]
+ public static bool PosTest3()
+ {
+ ExplStruct p;
+ bool retval = false;
+
+ TestFramework.BeginScenario("\n\nTest #3 (Roundtrip of a simple structre (explicit layout) by reference. Verify that values updated on unmanaged side reflect on managed side)");
+ //direct pinvoke
+
+ //cdecl
+ try
+ {
+ p = new ExplStruct(DialogResult.None, 10);
+ TestFramework.LogInformation(" Case 2: Direct p/invoke cdecl calling convention");
+ retval = DoCdeclSimpleExplStructByRef(ref p);
+
+ if (retval == false)
+ {
+ TestFramework.LogError("01", "PInvokeTests->PosTest3 : Unexpected error occured on unmanaged side");
+ return false;
+ }
+ if ((p.type != DialogResult.OK) || (!p.b))
+ {
+ Console.WriteLine("\nExpected values:\n SimpleStruct->type=1\nSimpleStruct->b=TRUE\n");
+ Console.WriteLine("\nActual values:\n SimpleStruct->type=" + p.type + "\nSimpleStruct->b=" + p.b);
+ TestFramework.LogError("02", "PInvokeTests->PosTest3 : Returned values are different from expected values");
+ retval = false;
+ }
+ }
+ catch (Exception e)
+ {
+ TestFramework.LogError("03", "Unexpected exception: " + e.ToString());
+ retval = false;
+ }
+
+ //Delegate pinvoke --- cdecl
+ try
+ {
+ p = new ExplStruct(DialogResult.None, 10);
+ TestFramework.LogInformation(" Case 4: Delegate p/invoke cdecl calling convention");
+ CdeclSimpleExplStructByRefDelegate std = GetFptrCdeclSimpleExplStructByRef(18);
+
+ retval = std(ref p);
+
+ if (retval == false)
+ {
+ TestFramework.LogError("01", "PInvokeTests->PosTest3 : Unexpected error occured on unmanaged side");
+ return false;
+ }
+ if ((p.type != DialogResult.OK) || (!p.b))
+ {
+ Console.WriteLine("\nExpected values:\n SimpleStruct->type=1\nSimpleStruct->b=TRUE\n");
+ Console.WriteLine("\nActual values:\n SimpleStruct->type=" + p.type + "\nSimpleStruct->b=" + p.b);
+ TestFramework.LogError("02", "PInvokeTests->PosTest3 : Returned values are different from expected values");
+ retval = false;
+ }
+ }
+ catch (Exception e)
+ {
+ TestFramework.LogError("03", "Unexpected exception: " + e.ToString());
+ retval = false;
+ }
+
+
+ return retval;
+ }
+
+ //Simple struct explicit layout by value.
+ [System.Security.SecuritySafeCritical]
+ public static bool PosTest4()
+ {
+ ExplStruct p;
+ bool retval = false;
+
+ TestFramework.BeginScenario("\n\nTest #4 (Roundtrip of a simple structre (Explicit layout) by value. Verify that values updated on unmanaged side reflect on managed side)");
+ //direct pinvoke
+
+ //cdecl
+ try
+ {
+ p = new ExplStruct(DialogResult.OK, false);
+ TestFramework.LogInformation(" Case 2: Direct p/invoke cdecl calling convention");
+ p = DoCdeclSimpleExplStruct(p, ref retval);
+ if (retval == false)
+ {
+ TestFramework.LogError("01", "PInvokeTests->PosTest2 : values of passed in structure not matched with expected once on unmanaged side.");
+ return false;
+ }
+ if ((p.type != DialogResult.Cancel) || (p.c != 3.142))
+ {
+ Console.WriteLine("\nExpected values:\n SimpleStruct->a=2\nSimpleStruct->c=3.142\n");
+ Console.WriteLine("\nActual values:\n SimpleStruct->a=" + p.type + "\nSimpleStruct->c=" + p.c + "\n");
+ TestFramework.LogError("02", "PInvokeTests->PosTest4 : Returned values are different from expected values");
+ retval = false;
+ }
+ }
+ catch (Exception e)
+ {
+ TestFramework.LogError("03", "Unexpected exception: " + e.ToString());
+ retval = false;
+ }
+
+ //delegate pinvoke
+
+ //cdecl
+ try
+ {
+ p = new ExplStruct(DialogResult.OK, false);
+ TestFramework.LogInformation(" Case 4: Direct p/invoke cdecl calling convention");
+
+ CdeclSimpleExplStructDelegate std = GetFptrCdeclSimpleExplStruct(20);
+
+ IntPtr st = std(p, ref retval);
+ p = (ExplStruct)Marshal.PtrToStructure(st, typeof(ExplStruct));
+
+ if (retval == false)
+ {
+ TestFramework.LogError("01", "PInvokeTests->PosTest2 : values of passed in structure not matched with expected once on unmanaged side.");
+ return false;
+ }
+ if ((p.type != DialogResult.Cancel) || (p.c != 3.142))
+ {
+ Console.WriteLine("\nExpected values:\n SimpleStruct->a=2\nSimpleStruct->c=3.142\n");
+ Console.WriteLine("\nActual values:\n SimpleStruct->a=" + p.type + "\nSimpleStruct->c=" + p.c + "\n");
+ TestFramework.LogError("02", "PInvokeTests->PosTest4 : Returned values are different from expected values");
+ retval = false;
+ }
+ }
+ catch (Exception e)
+ {
+ TestFramework.LogError("03", "Unexpected exception: " + e.ToString());
+ retval = false;
+ }
+ return retval;
+ }
+
+ #endregion
+
+ public static int Main(string[] argv)
+ {
+ bool retVal = true;
+
+ retVal = retVal && PosTest1();
+ retVal = retVal && PosTest2();
+ retVal = retVal && PosTest3();
+ retVal = retVal && PosTest4();
+
+ if (!retVal)
+ Console.WriteLine("FAIL");
+ else
+ Console.WriteLine("PASS");
+ return (retVal ? 100 : 101);
+ }
+
+
+ }
+}
diff --git a/tests/src/Interop/SimpleStruct/SimpleStructNative.cpp b/tests/src/Interop/SimpleStruct/SimpleStructNative.cpp
new file mode 100644
index 0000000000..24517b8f10
--- /dev/null
+++ b/tests/src/Interop/SimpleStruct/SimpleStructNative.cpp
@@ -0,0 +1,107 @@
+#include "platformdefines.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <xplatform.h>
+
+typedef void *voidPtr;
+
+typedef struct { int a;
+bool b;
+char* str;} Sstr;
+
+typedef struct { int a;
+bool b;
+double c;} Sstr_simple;
+
+typedef struct {
+ int a;
+ int extra; //padding needs to be added here as we have added 8 byte offset.
+ union
+ {
+ int i;
+ BOOL b;
+ double d;
+ }udata;
+}ExplStruct;
+
+extern "C"
+DLL_EXPORT BOOL WINAPI CdeclSimpleStructByRef(Sstr *p)
+{
+ p->a = 100;
+ p->b=1;
+ strncpy(p->str,"after",6);
+ return TRUE;
+}
+
+extern "C"
+DLL_EXPORT BOOL WINAPI CdeclSimpleExplStructByRef(ExplStruct *p)
+{
+ if((p->a != 0) || (p->udata.i != 10))
+ {
+ printf("\np->a=%d, p->udata.i=%d\n",p->a,p->udata.i);
+ return FALSE;
+ }
+ p->a = 1;
+ p->udata.b = TRUE;
+ return TRUE;
+}
+
+extern "C"
+DLL_EXPORT Sstr_simple* WINAPI CdeclSimpleStruct(Sstr_simple p,BOOL *result)
+{
+ Sstr_simple *pSimpleStruct;
+ if((p.a !=100) || (p.b != FALSE) || (p.c != 3.142))
+ {
+ *(result)= FALSE;
+ return NULL;
+ }
+ pSimpleStruct = (Sstr_simple*) TP_CoTaskMemAlloc(sizeof(Sstr_simple) * 1);
+ pSimpleStruct->a = 101;
+ pSimpleStruct->b = TRUE;
+ pSimpleStruct->c = 10.11;
+ *(result)= TRUE;
+ return pSimpleStruct;
+}
+
+extern "C"
+DLL_EXPORT ExplStruct* WINAPI CdeclSimpleExplStruct(ExplStruct p,BOOL *result)
+{
+ ExplStruct *pExplStruct;
+ if((p.a !=1) || (p.udata.b != FALSE))
+ {
+ *(result)= FALSE;
+ return NULL;
+ }
+ pExplStruct = (ExplStruct*) TP_CoTaskMemAlloc(sizeof(ExplStruct) * 1);
+ pExplStruct->a = 2;
+ pExplStruct->udata.d = 3.142;
+ *(result)= TRUE;
+ return pExplStruct;
+}
+
+extern "C"
+DLL_EXPORT voidPtr WINAPI GetFptr(int i)
+{
+ switch(i)
+ {
+
+ case 14:
+ return (voidPtr) &CdeclSimpleStructByRef;
+ break;
+
+ case 16:
+ return (voidPtr) &CdeclSimpleStruct;
+ break;
+
+ case 18:
+ return (voidPtr) &CdeclSimpleExplStructByRef;
+ break;
+
+ case 20:
+ return (voidPtr) &CdeclSimpleExplStruct;
+ break;
+
+ }
+ return (voidPtr) &CdeclSimpleStruct;
+}
diff --git a/tests/src/Interop/SimpleStruct/project.json b/tests/src/Interop/SimpleStruct/project.json
new file mode 100644
index 0000000000..d0bba5fe35
--- /dev/null
+++ b/tests/src/Interop/SimpleStruct/project.json
@@ -0,0 +1,35 @@
+{
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1-rc2-23816",
+ "System.Collections": "4.0.10",
+ "System.Collections.NonGeneric": "4.0.1-rc2-23816",
+ "System.Collections.Specialized": "4.0.1-rc2-23816",
+ "System.ComponentModel": "4.0.1-rc2-23816",
+ "System.Console": "4.0.0-rc2-23816",
+ "System.Diagnostics.Process": "4.1.0-rc2-23816",
+ "System.Globalization": "4.0.10",
+ "System.Globalization.Calendars": "4.0.0",
+ "System.IO": "4.0.10",
+ "System.IO.FileSystem": "4.0.0",
+ "System.IO.FileSystem.Primitives": "4.0.0",
+ "System.Linq": "4.0.1-rc2-23816",
+ "System.Linq.Queryable": "4.0.1-rc2-23816",
+ "System.Reflection": "4.0.10",
+ "System.Reflection.Primitives": "4.0.0",
+ "System.Runtime": "4.1.0-rc2-23816",
+ "System.Runtime.Extensions": "4.0.10",
+ "System.Runtime.Handles": "4.0.0",
+ "System.Runtime.InteropServices": "4.1.0-rc2-23816",
+ "System.Runtime.Loader": "4.0.0-rc2-23816",
+ "System.Text.Encoding": "4.0.10",
+ "System.Threading": "4.0.10",
+ "System.Threading.Thread": "4.0.0-rc2-23816",
+ "System.Xml.ReaderWriter": "4.0.11-rc2-23816",
+ "System.Xml.XDocument": "4.0.11-rc2-23816",
+ "System.Xml.XmlDocument": "4.0.1-rc2-23816",
+ "System.Xml.XmlSerializer": "4.0.11-rc2-23816"
+ },
+ "frameworks": {
+ "dnxcore50": {}
+ }
+} \ No newline at end of file
diff --git a/tests/src/Interop/StructMarshalling/PInvoke/CMakeLists.txt b/tests/src/Interop/StructMarshalling/PInvoke/CMakeLists.txt
new file mode 100644
index 0000000000..dc1e16f241
--- /dev/null
+++ b/tests/src/Interop/StructMarshalling/PInvoke/CMakeLists.txt
@@ -0,0 +1,10 @@
+cmake_minimum_required (VERSION 2.6)
+project (MarshalStructAsParam)
+include_directories(${INC_PLATFORM_DIR})
+set(SOURCES MarshalStructAsParamDLL.cpp)
+
+# add the executable
+add_library (MarshalStructAsParam SHARED ${SOURCES})
+
+# add the install targets
+install (TARGETS MarshalStructAsParam DESTINATION bin) \ No newline at end of file
diff --git a/tests/src/Interop/StructMarshalling/PInvoke/Helper.cs b/tests/src/Interop/StructMarshalling/PInvoke/Helper.cs
new file mode 100644
index 0000000000..9e8f7d7316
--- /dev/null
+++ b/tests/src/Interop/StructMarshalling/PInvoke/Helper.cs
@@ -0,0 +1,905 @@
+using System;
+using System.Runtime.InteropServices;
+
+public class Helper
+{
+ #region methods for InnerSequential struct
+ // Return new InnerSequential instance
+ public static InnerSequential NewInnerSequential(int f1, float f2, string f3)
+ {
+ InnerSequential inner_seq = new InnerSequential();
+ inner_seq.f1 = f1;
+ inner_seq.f2 = f2;
+ inner_seq.f3 = f3;
+ return inner_seq;
+ }
+ // Prints InnerSequential
+ public static void PrintInnerSequential(InnerSequential inner_seq, string name)
+ {
+ Console.WriteLine("\t{0}.f1 = {1}", name, inner_seq.f1);
+ Console.WriteLine("\t{0}.f2 = {1}", name, inner_seq.f2);
+ Console.WriteLine("\t{0}.f3 = {1}", name, inner_seq.f3);
+ }
+ public static bool ValidateInnerSequential(InnerSequential s1, InnerSequential s2, string methodName)
+ {
+ if (s1.f1 != s2.f1 || s1.f2 != s2.f2 || s1.f3 != s2.f3)
+ {
+ Console.WriteLine("\tFAILED! " + methodName + "did not recieve result as expected.");
+ Console.WriteLine("\tThe Actual is...");
+ PrintInnerSequential(s1, s1.ToString());
+ Console.WriteLine("\tThe Expected is...");
+ PrintInnerSequential(s2, s2.ToString());
+ return false;
+ }
+ else
+ {
+ Console.WriteLine("\tPASSED!");
+ return true;
+ }
+ }
+ #endregion
+
+
+ #region methods for INNER2 struct
+ // Return new INNER2 instance
+ public static INNER2 NewINNER2(int f1, float f2, string f3)
+ {
+ INNER2 inner = new INNER2();
+ inner.f1 = f1;
+ inner.f2 = f2;
+ inner.f3 = f3;
+ return inner;
+ }
+ // Prints INNER2
+ public static void PrintINNER2(INNER2 inner, string name)
+ {
+ Console.WriteLine("\t{0}.f1 = {1}", name, inner.f1);
+ Console.WriteLine("\t{0}.f2 = {1}", name, inner.f2);
+ Console.WriteLine("\t{0}.f3 = {1}", name, inner.f3);
+ }
+ public static bool ValidateINNER2(INNER2 inner1, INNER2 inner2, string methodName)
+ {
+ if (inner1.f1 != inner2.f1 || inner1.f2 != inner2.f2 || inner1.f3 != inner2.f3)
+ {
+ Console.WriteLine("\tFAILED! " + methodName + "did not recieve result as expected.");
+ Console.WriteLine("\tThe Actual is...");
+ PrintINNER2(inner1, inner1.ToString());
+ Console.WriteLine("\tThe Expected is...");
+ PrintINNER2(inner2, inner2.ToString());
+ return false;
+ }
+ else
+ {
+ Console.WriteLine("\tPASSED!");
+ return true;
+ }
+ }
+
+ #endregion
+
+ #region methods for InnerExplicit struct
+ // Return new InnerExplicit instance
+ public static InnerExplicit NewInnerExplicit(int f1, float f2, string f3)
+ {
+ InnerExplicit inner = new InnerExplicit();
+ inner.f1 = f1;
+ inner.f2 = f2;
+ inner.f3 = f3;
+ return inner;
+ }
+ // Prints InnerExplicit
+ public static void PrintInnerExplicit(InnerExplicit inner, string name)
+ {
+ Console.WriteLine("\t{0}.f1 = {1}", name, inner.f1);
+ Console.WriteLine("\t{0}.f2 = {1}", name, inner.f2);
+ Console.WriteLine("\t{0}.f3 = {1}", name, inner.f3);
+ }
+ public static bool ValidateInnerExplicit(InnerExplicit inner1, InnerExplicit inner2, string methodName)
+ {
+ if (inner1.f1 != inner2.f1 || inner1.f2 != inner2.f2 || inner1.f3 != inner2.f3)
+ {
+ Console.WriteLine("\tFAILED! " + methodName + "did not recieve result as expected.");
+ Console.WriteLine("\tThe Actual is...");
+ PrintInnerExplicit(inner1, inner1.ToString());
+ Console.WriteLine("\tThe Expected is...");
+ PrintInnerExplicit(inner2, inner2.ToString());
+ return false;
+ }
+ else
+ {
+ Console.WriteLine("\tPASSED!");
+ return true;
+ }
+ }
+
+ #endregion
+
+ #region methods for InnerArraySequential struct
+ // Returns new OUTER instance; the params are the fields of INNER;
+ // all the INNER elements have the same field values
+ public static InnerArraySequential NewInnerArraySequential(int f1, float f2, string f3)
+ {
+ InnerArraySequential outer = new InnerArraySequential();
+ outer.arr = new InnerSequential[Common.NumArrElements];
+ for (int i = 0; i < Common.NumArrElements; i++)
+ {
+ outer.arr[i].f1 = f1;
+ outer.arr[i].f2 = f2;
+ outer.arr[i].f3 = f3;
+ }
+ return outer;
+ }
+ // Prints InnerArraySequential
+ public static void PrintInnerArraySequential(InnerArraySequential outer, string name)
+ {
+ for (int i = 0; i < Common.NumArrElements; i++)
+ {
+ Console.WriteLine("\t{0}.arr[{1}].f1 = {2}", name, i, outer.arr[i].f1);
+ Console.WriteLine("\t{0}.arr[{1}].f2 = {2}", name, i, outer.arr[i].f2);
+ Console.WriteLine("\t{0}.arr[{1}].f3 = {2}", name, i, outer.arr[i].f3);
+ }
+ }
+ // Returns true if the two params have the same fields
+ public static bool ValidateInnerArraySequential(InnerArraySequential outer1, InnerArraySequential outer2, string methodName)
+ {
+ for (int i = 0; i < Common.NumArrElements; i++)
+ {
+ if (outer1.arr[i].f1 != outer2.arr[i].f1 ||
+ outer1.arr[i].f2 != outer2.arr[i].f2 ||
+ outer1.arr[i].f3 != outer2.arr[i].f3)
+ {
+ Console.WriteLine("\tFAILED! " + methodName + "did not recieve result as expected.");
+ Console.WriteLine("\tThe Actual is...");
+ Console.WriteLine("\t{0}.arr[{1}].f1 = {2}", outer1.ToString(), i, outer1.arr[i].f1);
+ Console.WriteLine("\t{0}.arr[{1}].f2 = {2}", outer1.ToString(), i, outer1.arr[i].f2);
+ Console.WriteLine("\t{0}.arr[{1}].f3 = {2}", outer1.ToString(), i, outer1.arr[i].f3);
+ Console.WriteLine("\tThe Expected is...");
+ Console.WriteLine("\t{0}.arr[{1}].f1 = {2}", outer2.ToString(), i, outer2.arr[i].f1);
+ Console.WriteLine("\t{0}.arr[{1}].f2 = {2}", outer2.ToString(), i, outer2.arr[i].f2);
+ Console.WriteLine("\t{0}.arr[{1}].f3 = {2}", outer2.ToString(), i, outer2.arr[i].f3);
+ return false;
+ }
+ }
+ Console.WriteLine("\tPASSED!");
+ return true;
+ }
+ #endregion
+
+ #region methods for InnerArrayExplicit struct
+ // Returns new InnerArrayExplicit instance; the params are the fields of INNER;
+ // all the INNER elements have the same field values
+ public static InnerArrayExplicit NewInnerArrayExplicit(int f1, float f2, string f3, string f4)
+ {
+ InnerArrayExplicit outer = new InnerArrayExplicit();
+ outer.arr = new InnerSequential[Common.NumArrElements];
+ for (int i = 0; i < Common.NumArrElements; i++)
+ {
+ outer.arr[i].f1 = f1;
+ outer.arr[i].f2 = f2;
+ outer.arr[i].f3 = f3;
+ }
+ outer.f4 = f4;
+ return outer;
+ }
+ // Prints InnerArrayExplicit
+ public static void PrintInnerArrayExplicit(InnerArrayExplicit outer, string name)
+ {
+ for (int i = 0; i < Common.NumArrElements; i++)
+ {
+ Console.WriteLine("\t{0}.arr[{1}].f1 = {2}", name, i, outer.arr[i].f1);
+ Console.WriteLine("\t{0}.arr[{1}].f2 = {2}", name, i, outer.arr[i].f2);
+ Console.WriteLine("\t{0}.arr[{1}].f3 = {2}", name, i, outer.arr[i].f3);
+ }
+ Console.WriteLine("\t{0}.f4 = {1}", name, outer.f4);
+ }
+ // Returns true if the two params have the same fields
+ public static bool ValidateInnerArrayExplicit(InnerArrayExplicit outer1, InnerArrayExplicit InnerArrayExplicit, string methodName)
+ {
+ for (int i = 0; i < Common.NumArrElements; i++)
+ {
+ if (outer1.arr[i].f1 != InnerArrayExplicit.arr[i].f1)
+ {
+ Console.WriteLine("\tFAILED! " + methodName + "did not recieve result as expected.");
+ Console.WriteLine("\tThe Actual f1 field is...");
+ Console.WriteLine("\t{0}.arr[{1}].f1 = {2}", outer1.ToString(), i, outer1.arr[i].f1);
+ Console.WriteLine("\tThe Expected f1 field is...");
+ Console.WriteLine("\t{0}.arr[{1}].f1 = {2}", InnerArrayExplicit.ToString(), i, InnerArrayExplicit.arr[i].f1);
+ return false;
+ }
+ }
+ if (outer1.f4 != InnerArrayExplicit.f4)
+ {
+ Console.WriteLine("\tFAILED! " + methodName + "did not recieve result as expected.");
+ Console.WriteLine("\tThe Actual f4 field is...");
+ Console.WriteLine("\t{0}.f4 = {1}", outer1.ToString(), outer1.f4);
+ Console.WriteLine("\tThe Expected f4 field is...");
+ Console.WriteLine("\t{0}.f4 = {1}", InnerArrayExplicit.ToString(), InnerArrayExplicit.f4);
+ return false;
+ }
+ Console.WriteLine("\tPASSED!");
+ return true;
+ }
+ #endregion
+
+ #region methods for OUTER3 struct
+ // Returns new OUTER3 instance; the params are the fields of INNER;
+ // all the INNER elements have the same field values
+ public static OUTER3 NewOUTER3(int f1, float f2, string f3, string f4)
+ {
+ OUTER3 outer = new OUTER3();
+ outer.arr = new InnerSequential[Common.NumArrElements];
+ for (int i = 0; i < Common.NumArrElements; i++)
+ {
+ outer.arr[i].f1 = f1;
+ outer.arr[i].f2 = f2;
+ outer.arr[i].f3 = f3;
+ }
+ outer.f4 = f4;
+ return outer;
+ }
+ // Prints OUTER3
+ public static void PrintOUTER3(OUTER3 outer, string name)
+ {
+ for (int i = 0; i < Common.NumArrElements; i++)
+ {
+ Console.WriteLine("\t{0}.arr[{1}].f1 = {2}", name, i, outer.arr[i].f1);
+ Console.WriteLine("\t{0}.arr[{1}].f2 = {2}", name, i, outer.arr[i].f2);
+ Console.WriteLine("\t{0}.arr[{1}].f3 = {2}", name, i, outer.arr[i].f3);
+ }
+ Console.WriteLine("\t{0}.f4 = {1}", name, outer.f4);
+ }
+ // Returns true if the two params have the same fields
+ public static bool ValidateOUTER3(OUTER3 outer1, OUTER3 InnerArrayExplicit, string methodName)
+ {
+ for (int i = 0; i < Common.NumArrElements; i++)
+ {
+ if (outer1.arr[i].f1 != InnerArrayExplicit.arr[i].f1 ||
+ outer1.arr[i].f2 != InnerArrayExplicit.arr[i].f2 ||
+ outer1.arr[i].f3 != InnerArrayExplicit.arr[i].f3)
+ {
+ Console.WriteLine("\tFAILED! " + methodName + "did not recieve result as expected.");
+ Console.WriteLine("\tThe Actual is...");
+ Console.WriteLine("\t{0}.arr[{1}].f1 = {2}", outer1.ToString(), i, outer1.arr[i].f1);
+ Console.WriteLine("\t{0}.arr[{1}].f2 = {2}", outer1.ToString(), i, outer1.arr[i].f2);
+ Console.WriteLine("\t{0}.arr[{1}].f3 = {2}", outer1.ToString(), i, outer1.arr[i].f3);
+ Console.WriteLine("\tThe Expected is...");
+ Console.WriteLine("\t{0}.arr[{1}].f1 = {2}", InnerArrayExplicit.ToString(), i, InnerArrayExplicit.arr[i].f1);
+ Console.WriteLine("\t{0}.arr[{1}].f2 = {2}", InnerArrayExplicit.ToString(), i, InnerArrayExplicit.arr[i].f2);
+ Console.WriteLine("\t{0}.arr[{1}].f3 = {2}", InnerArrayExplicit.ToString(), i, InnerArrayExplicit.arr[i].f3);
+ return false;
+ }
+ }
+ if (outer1.f4 != InnerArrayExplicit.f4)
+ {
+ Console.WriteLine("\tFAILED! " + methodName + "did not recieve result as expected.");
+ Console.WriteLine("\tThe Actual f4 field is...");
+ Console.WriteLine("\t{0}.f4 = {1}", outer1.ToString(), outer1.f4);
+ Console.WriteLine("\tThe Expected f4 field is...");
+ Console.WriteLine("\t{0}.f4 = {1}", InnerArrayExplicit.ToString(), InnerArrayExplicit.f4);
+ return false;
+ }
+ Console.WriteLine("\tPASSED!");
+ return true;
+ }
+ #endregion
+
+ #region methods for CharSetAnsiSequential struct
+ //return CharSetAnsiSequential struct instance
+ public static CharSetAnsiSequential NewCharSetAnsiSequential(string f1, char f2)
+ {
+ CharSetAnsiSequential str1 = new CharSetAnsiSequential();
+ str1.f1 = f1;
+ str1.f2 = f2;
+ return str1;
+ }
+ //print the struct CharSetAnsiSequential element
+ public static void PrintCharSetAnsiSequential(CharSetAnsiSequential str1, string name)
+ {
+ Console.WriteLine("\t{0}.f1 = {1}", name, str1.f1);
+ Console.WriteLine("\t{0}.f2 = {1}", name, str1.f2);
+ }
+ // Returns true if the two params have the same fields
+ public static bool ValidateCharSetAnsiSequential(CharSetAnsiSequential str1, CharSetAnsiSequential str2, string methodName)
+ {
+ if (str1.f1 != str2.f1 || str1.f2 != str2.f2)
+ {
+ Console.WriteLine("\tFAILED! " + methodName + "did not recieve result as expected.");
+ Console.WriteLine("\tThe Actual is...");
+ PrintCharSetAnsiSequential(str1, str1.ToString());
+ Console.WriteLine("\tThe Expected is...");
+ PrintCharSetAnsiSequential(str2, str2.ToString());
+ return false;
+ }
+ else
+ {
+ Console.WriteLine("\tPASSED!");
+ return true;
+ }
+ }
+
+ #endregion
+
+ #region methods for CharSetUnicodeSequential struct
+ //return the struct CharSetUnicodeSequential instance
+ public static CharSetUnicodeSequential NewCharSetUnicodeSequential(string f1, char f2)
+ {
+ CharSetUnicodeSequential str1 = new CharSetUnicodeSequential();
+ str1.f1 = f1;
+ str1.f2 = f2;
+ return str1;
+ }
+ //print the struct CharSetUnicodeSequential element
+ public static void PrintCharSetUnicodeSequential(CharSetUnicodeSequential str1, string name)
+ {
+ Console.WriteLine("\t{0}.f1 = {1}", name, str1.f1);
+ Console.WriteLine("\t{0}.f2 = {1}", name, str1.f2);
+ }
+ // Returns true if the two params have the same fields
+ public static bool ValidateCharSetUnicodeSequential(CharSetUnicodeSequential str1, CharSetUnicodeSequential str2, string methodName)
+ {
+ if (str1.f1 != str2.f1 || str1.f2 != str2.f2)
+ {
+ Console.WriteLine("\tFAILED! " + methodName + "did not recieve result as expected.");
+ Console.WriteLine("\tThe Actual is...");
+ PrintCharSetUnicodeSequential(str1, str1.ToString());
+ Console.WriteLine("\tThe Expected is...");
+ PrintCharSetUnicodeSequential(str2, str2.ToString());
+ return false;
+ }
+ else
+ {
+ Console.WriteLine("\tPASSED!");
+ return true;
+ }
+ }
+ #endregion
+
+ #region methods for NumberSequential struct
+ public static NumberSequential NewNumberSequential(int i32, uint ui32, short s1, ushort us1, Byte b, SByte sb,
+ Int16 i16, UInt16 ui16, Int64 i64, UInt64 ui64, Single sgl, Double d)
+ {
+ NumberSequential str1 = new NumberSequential();
+ str1.i32 = i32;
+ str1.ui32 = ui32;
+ str1.s1 = s1;
+ str1.us1 = us1;
+ str1.b = b;
+ str1.sb = sb;
+ str1.i16 = i16;
+ str1.ui16 = ui16;
+ str1.i64 = i64;
+ str1.ui64 = ui64;
+ str1.sgl = sgl;
+ str1.d = d;
+ return str1;
+ }
+ public static void PrintNumberSequential(NumberSequential str1, string name)
+ {
+ Console.WriteLine("\t{0}.i32 = {1}", name, str1.i32);
+ Console.WriteLine("\t{0}.ui32 = {1}", name, str1.ui32);
+ Console.WriteLine("\t{0}.s1 = {1}", name, str1.s1);
+ Console.WriteLine("\t{0}.us1 = {1}", name, str1.us1);
+ Console.WriteLine("\t{0}.b = {1}", name, str1.b);
+ Console.WriteLine("\t{0}.sb = {1}", name, str1.sb);
+ Console.WriteLine("\t{0}.i16 = {1}", name, str1.i16);
+ Console.WriteLine("\t{0}.ui16 = {1}", name, str1.ui16);
+ Console.WriteLine("\t{0}.i64 = {1}", name, str1.i64);
+ Console.WriteLine("\t{0}.ui64 = {1}", name, str1.ui64);
+ Console.WriteLine("\t{0}.sgl = {1}", name, str1.sgl);
+ Console.WriteLine("\t{0}.d = {1}", name, str1.d);
+ }
+ public static bool ValidateNumberSequential(NumberSequential str1, NumberSequential str2, string methodName)
+ {
+ if (str1.i32 != str2.i32 || str1.ui32 != str2.ui32 || str1.s1 != str2.s1 ||
+ str1.us1 != str2.us1 || str1.b != str2.b || str1.sb != str2.sb || str1.i16 != str2.i16 ||
+ str1.ui16 != str2.ui16 || str1.i64 != str2.i64 || str1.ui64 != str2.ui64 ||
+ str1.sgl != str2.sgl || str1.d != str2.d)
+ {
+ Console.WriteLine("\tFAILED! " + methodName + "did not recieve result as expected.");
+ Console.WriteLine("\tThe Actual is...");
+ PrintNumberSequential(str1, str1.ToString());
+ Console.WriteLine("\tThe Expected is...");
+ PrintNumberSequential(str2, str2.ToString());
+ return false;
+ }
+ else
+ {
+ Console.WriteLine("\tPASSED!");
+ return true;
+ }
+ }
+ #endregion
+
+ #region methods for S3 struct
+ public static void InitialArray(int[] iarr, int[] icarr)
+ {
+ for (int i = 0; i < iarr.Length; i++)
+ {
+ iarr[i] = i;
+ }
+
+ for (int i = 1; i < icarr.Length + 1; i++)
+ {
+ icarr[i - 1] = i;
+ }
+ }
+
+
+ public static S3 NewS3(bool flag, string str, int[] vals)
+ {
+ S3 str1 = new S3();
+ str1.flag = flag;
+ str1.str = str;
+ str1.vals = vals;
+ return str1;
+ }
+ public static void PrintS3(S3 str1, string name)
+ {
+ Console.WriteLine("\t{0}.flag = {1}", name, str1.flag);
+ Console.WriteLine("\t{0}.flag = {1}", name, str1.str);
+ for (int i = 0; i < str1.vals.Length; i++)
+ {
+ Console.WriteLine("\t{0}.vals[{1}] = {2}", name, i, str1.vals[i]);
+ }
+ }
+ public static bool ValidateS3(S3 str1, S3 str2, string methodName)
+ {
+ int iflag = 0;
+ if (str1.flag != str2.flag || str1.str != str2.str)
+ {
+ Console.WriteLine("\tFAILED! " + methodName + "did not recieve result as expected.");
+ Console.WriteLine("\tThe Actual flag field is...");
+ Console.WriteLine("\t{0}.flag = {1}", str1.ToString(), str1.flag);
+ Console.WriteLine("\t{0}.str = {1}", str1.ToString(), str1.str);
+ Console.WriteLine("\tThe Expected is...");
+ Console.WriteLine("\t{0}.flag = {1}", str2.ToString(), str2.flag);
+ Console.WriteLine("\t{0}.str = {1}", str2.ToString(), str2.str);
+ return false;
+ }
+ for (int i = 0; i < 256; i++)
+ {
+ if (str1.vals[i] != str2.vals[i])
+ {
+ Console.WriteLine("\tFAILED! " + methodName + "did not recieve result as expected.");
+ Console.WriteLine("\tThe Actual vals field is...");
+ Console.WriteLine("\t{0}.vals[{1}] = {2}", str1.ToString(), i, str1.vals[i]);
+ Console.WriteLine("\tThe Expected vals field is...");
+ Console.WriteLine("\t{0}.vals[{1}] = {2}", str2.ToString(), i, str2.vals[i]);
+ iflag++;
+ }
+ }
+ if (iflag != 0)
+ {
+ return false;
+ }
+ Console.WriteLine("\tPASSED!");
+ return true;
+ }
+ #endregion
+
+ #region methods for S5 struct
+ public static S5 NewS5(int age, string name,Enum1 ef)
+ {
+ S4 s4 = new S4();
+ s4.age = age;
+ s4.name = name;
+
+ S5 s5 = new S5();
+ s5.s4 = s4;
+ s5.ef = ef;
+
+ return s5;
+ }
+ public static void PrintS5(S5 str1, string name)
+ {
+ Console.WriteLine("\t{0}.s4.age = {1}", str1.s4.age);
+ Console.WriteLine("\t{0}.s4.name = {1}", str1.s4.name);
+ Console.WriteLine("\t{0}.ef = {1}", str1.ef.ToString());
+ }
+ public static bool ValidateS5(S5 str1, S5 str2, string methodName)
+ {
+ if (str1.s4.age != str2.s4.age || str1.s4.name != str2.s4.name)
+ {
+ Console.WriteLine("\tFAILED! " + methodName + "did not recieve result as expected.");
+ Console.WriteLine("\tThe Actual s4 field is...");
+ Console.WriteLine("\t{0}.s4.age = {1}", str1.ToString(), str1.s4.age);
+ Console.WriteLine("\t{0}.s4.name = {1}", str1.ToString(), str1.s4.name);
+ Console.WriteLine("\tThe Expected s4 field is...");
+ Console.WriteLine("\t{0}.s4.age = {1}", str2.ToString(), str2.s4.age);
+ Console.WriteLine("\t{0}.s4.name = {1}", str2.ToString(), str2.s4.name);
+ return false;
+ }
+ if (str1.ef != str2.ef)
+ {
+ Console.WriteLine("\tFAILED! " + methodName + "did not recieve result as expected.");
+ Console.WriteLine("\tThe Actual ef field is...");
+ Console.WriteLine("\t{0}.ef = {1}", str1.ToString(), str1.ef);
+ Console.WriteLine("\tThe Expected s4 field is...");
+ Console.WriteLine("\t{0}.ef = {1}", str2.ToString(), str2.ef);
+ return false;
+ }
+ Console.WriteLine("\tPASSED!");
+ return true;
+ }
+ #endregion
+
+ #region methods for StringStructSequentialAnsi struct
+ public static StringStructSequentialAnsi NewStringStructSequentialAnsi(string first, string last)
+ {
+ StringStructSequentialAnsi s6 = new StringStructSequentialAnsi();
+ s6.first = first;
+ s6.last = last;
+
+ return s6;
+ }
+ public static void PrintStringStructSequentialAnsi(StringStructSequentialAnsi str1, string name)
+ {
+ Console.WriteLine("\t{0}.first = {1}", name, str1.first);
+ Console.WriteLine("\t{0}.last = {1}", name, str1.last);
+ }
+ public static bool ValidateStringStructSequentialAnsi(StringStructSequentialAnsi str1, StringStructSequentialAnsi str2, string methodName)
+ {
+ if (str1.first != str2.first || str1.last != str2.last)
+ {
+ Console.WriteLine("\tFAILED! " + methodName + "did not recieve result as expected.");
+ Console.WriteLine("\tThe Actual is...");
+ PrintStringStructSequentialAnsi(str1, str1.ToString());
+ Console.WriteLine("\tThe Expected is...");
+ PrintStringStructSequentialAnsi(str2, str2.ToString());
+ return false;
+ }
+ else
+ {
+ Console.WriteLine("\tPASSED!");
+ return true;
+ }
+ }
+ #endregion
+
+ #region methods for StringStructSequentialUnicode struct
+ public static StringStructSequentialUnicode NewStringStructSequentialUnicode(string first, string last)
+ {
+ StringStructSequentialUnicode s7 = new StringStructSequentialUnicode();
+ s7.first = first;
+ s7.last = last;
+
+ return s7;
+ }
+ public static void PrintStringStructSequentialUnicode(StringStructSequentialUnicode str1, string name)
+ {
+ Console.WriteLine("\t{0}.first = {1}", name, str1.first);
+ Console.WriteLine("\t{0}.last = {1}", name, str1.last);
+ }
+ public static bool ValidateStringStructSequentialUnicode(StringStructSequentialUnicode str1, StringStructSequentialUnicode str2, string methodName)
+ {
+ if (str1.first != str2.first || str1.last != str2.last)
+ {
+ Console.WriteLine("\tFAILED! " + methodName + "did not recieve result as expected.");
+ Console.WriteLine("\tThe Actual is...");
+ PrintStringStructSequentialUnicode(str1, str1.ToString());
+ Console.WriteLine("\tThe Expected is...");
+ PrintStringStructSequentialUnicode(str2, str2.ToString());
+ return false;
+ }
+ else
+ {
+ Console.WriteLine("\tPASSED!");
+ return true;
+ }
+ }
+ #endregion
+
+ #region methods for S8 struct
+ public static S8 NewS8(string name, bool gender, UInt16 jobNum, int i32, uint ui32, sbyte mySByte)
+ {
+ S8 s8 = new S8();
+ s8.name = name;
+ s8.gender = gender;
+ s8.i32 = i32;
+ s8.ui32 = ui32;
+ s8.jobNum = jobNum;
+ s8.mySByte = mySByte;
+ return s8;
+ }
+ public static void PrintS8(S8 str1, string name)
+ {
+ Console.WriteLine("\t{0}.name = {1}", name, str1.name);
+ Console.WriteLine("\t{0}.gender = {1}", name, str1.gender);
+ Console.WriteLine("\t{0}.jobNum = {1}", name, str1.jobNum);
+ Console.WriteLine("\t{0}.i32 = {1}", name, str1.i32);
+ Console.WriteLine("\t{0}.ui32 = {1}", name, str1.ui32);
+ Console.WriteLine("\t{0}.mySByte = {1}", name, str1.mySByte);
+ }
+ public static bool ValidateS8(S8 str1, S8 str2, string methodName)
+ {
+ if (str1.name != str2.name || str1.gender != str2.gender ||
+ str1.jobNum != str2.jobNum ||
+ str1.i32 != str2.i32 || str1.ui32 != str2.ui32 || str1.mySByte != str2.mySByte)
+ {
+ Console.WriteLine("\tFAILED! " + methodName + "did not recieve result as expected.");
+ Console.WriteLine("\tThe Actual is...");
+ PrintS8(str1, str1.ToString());
+ Console.WriteLine("\tThe Expected is...");
+ PrintS8(str2, str2.ToString());
+ return false;
+ }
+ Console.WriteLine("\tPASSED!");
+ return true;
+
+ }
+
+ #endregion
+
+ #region methods for S9 struct
+ public static S9 NewS9(int i32, TestDelegate1 testDel1)
+ {
+ S9 s9 = new S9();
+ s9.i32 = i32;
+ s9.myDelegate1 = testDel1;
+ return s9;
+ }
+ public static bool ValidateS9(S9 str1, S9 str2, string methodName)
+ {
+ if (str1.i32 != str2.i32 || str1.myDelegate1 != str2.myDelegate1)
+ {
+ Console.WriteLine("\tFAILED! " + methodName + "did not recieve result as expected.");
+ Console.WriteLine("\tThe Actual is...");
+ Console.WriteLine("\t{0}.i32 = {1}", str1.ToString(), str1.i32);
+ Console.WriteLine("\t{0}.myDelegate1 = {1}", str1.ToString(), str1.myDelegate1);
+ Console.WriteLine("\tThe Expected is...");
+ Console.WriteLine("\t{0}.i32 = {1}", str2.ToString(), str2.i32);
+ Console.WriteLine("\t{0}.myDelegate1 = {1}", str2.ToString(), str2.myDelegate1);
+ return false;
+ }
+ Console.WriteLine("\tPASSED!");
+ return true;
+ }
+ #endregion
+
+ #region methods for IncludeOuterIntergerStructSequential struct
+ public static IncludeOuterIntergerStructSequential NewIncludeOuterIntergerStructSequential(int i321, int i322)
+ {
+ IncludeOuterIntergerStructSequential s10 = new IncludeOuterIntergerStructSequential();
+ s10.s.s_int.i = i321;
+ s10.s.i = i322;
+ return s10;
+ }
+ public static void PrintIncludeOuterIntergerStructSequential(IncludeOuterIntergerStructSequential str1, string name)
+ {
+ Console.WriteLine("\t{0}.s.s_int.i = {1}", name, str1.s.s_int.i);
+ Console.WriteLine("\t{0}.s.i = {1}", name, str1.s.i);
+ }
+ public static bool ValidateIncludeOuterIntergerStructSequential(IncludeOuterIntergerStructSequential str1, IncludeOuterIntergerStructSequential str2, string methodName)
+ {
+ if (str1.s.s_int.i != str2.s.s_int.i || str1.s.i != str2.s.i)
+ {
+ Console.WriteLine("\tFAILED! " + methodName + "did not recieve result as expected.");
+ Console.WriteLine("\tThe Actual is...");
+ PrintIncludeOuterIntergerStructSequential(str1, str1.ToString());
+ Console.WriteLine("\tThe Expected is...");
+ PrintIncludeOuterIntergerStructSequential(str2, str2.ToString());
+ return false;
+ }
+ else
+ {
+ Console.WriteLine("\tPASSED!");
+ return true;
+ }
+ }
+ #endregion
+
+ #region methods for S11 struct
+ unsafe public static void PrintS11(S11 str1, string name)
+ {
+ Console.WriteLine("\t{0}.i32 = {1}", name, (int)(str1.i32));
+ Console.WriteLine("\t{0}.i = {1}", name, str1.i);
+ }
+ unsafe public static S11 NewS11(int* i32, int i)
+ {
+ S11 s11 = new S11();
+ s11.i32 = i32;
+ s11.i = i;
+ return s11;
+ }
+ unsafe public static bool ValidateS11(S11 str1, S11 str2, string methodName)
+ {
+ if (str1.i32 != str2.i32 || str1.i != str2.i)
+ {
+ Console.WriteLine("\tFAILED! " + methodName + "did not recieve result as expected.");
+ Console.WriteLine("\tThe Actual is...");
+ PrintS11(str1, str1.ToString());
+ Console.WriteLine("\tThe Expected is...");
+ PrintS11(str2, str2.ToString());
+ return false;
+ }
+ Console.WriteLine("\tPASSED!");
+ return true;
+ }
+ #endregion
+
+ #region methods for U struct
+ public static U NewU(int i32, uint ui32, IntPtr iPtr, UIntPtr uiPtr, short s, ushort us, byte b, sbyte sb, long l, ulong ul, float f, double d)
+ {
+ U u = new U();
+ u.i32 = i32;
+ u.ui32 = ui32;
+ u.iPtr = iPtr;
+ u.uiPtr = uiPtr;
+ u.s = s;
+ u.us = us;
+ u.b = b;
+ u.sb = sb;
+ u.l = l;
+ u.ul = ul;
+ u.f = f;
+ u.d = d;
+
+ return u;
+ }
+ public static void PrintU(U str1, string name)
+ {
+ Console.WriteLine("\t{0}.i32 = {1}", name, str1.i32);
+ Console.WriteLine("\t{0}.ui32 = {1}", name, str1.ui32);
+ Console.WriteLine("\t{0}.iPtr = {1}", name, str1.iPtr);
+ Console.WriteLine("\t{0}.uiPtr = {1}", name, str1.uiPtr);
+ Console.WriteLine("\t{0}.s = {1}", name, str1.s);
+ Console.WriteLine("\t{0}.us = {1}", name, str1.us);
+ Console.WriteLine("\t{0}.b = {1}", name, str1.b);
+ Console.WriteLine("\t{0}.sb = {1}", name, str1.sb);
+ Console.WriteLine("\t{0}.l = {1}", name, str1.l);
+ Console.WriteLine("\t{0}.ul = {1}", name, str1.ul);
+ Console.WriteLine("\t{0}.f = {1}", name, str1.f);
+ Console.WriteLine("\t{0}.d = {1}", name, str1.d);
+ }
+ public static bool ValidateU(U str1, U str2, string methodName)
+ {
+ if (str1.i32 != str2.i32 || str1.ui32 != str2.ui32 || str1.iPtr != str2.iPtr ||
+ str1.uiPtr != str2.uiPtr || str1.s != str2.s || str1.us != str2.us ||
+ str1.b != str2.b || str1.sb != str2.sb || str1.l != str2.l || str1.ul != str2.ul ||
+ str1.f != str2.f || str1.d != str2.d)
+ {
+ Console.WriteLine("\tFAILED! " + methodName + "did not recieve result as expected.");
+ Console.WriteLine("\tThe Actual is...");
+ PrintU(str1, str1.ToString());
+ Console.WriteLine("\tThe Expected is...");
+ PrintU(str2, str2.ToString());
+ return false;
+ }
+ Console.WriteLine("\tPASSED!");
+ return true;
+ }
+ #endregion
+
+ #region methods for ByteStructPack2Explicit struct
+ public static ByteStructPack2Explicit NewByteStructPack2Explicit(byte b1, byte b2)
+ {
+ ByteStructPack2Explicit u1 = new ByteStructPack2Explicit();
+ u1.b1 = b1;
+ u1.b2 = b2;
+
+ return u1;
+ }
+ public static void PrintByteStructPack2Explicit(ByteStructPack2Explicit str1, string name)
+ {
+ Console.WriteLine("\t{0}.b1 = {1}", name, str1.b1);
+ Console.WriteLine("\t{0}.b2 = {1}", name, str1.b2);
+ }
+ public static bool ValidateByteStructPack2Explicit(ByteStructPack2Explicit str1, ByteStructPack2Explicit str2, string methodName)
+ {
+ if (str1.b1 != str2.b1 || str1.b2 != str2.b2)
+ {
+ Console.WriteLine("\tFAILED! " + methodName + "did not recieve result as expected.");
+ Console.WriteLine("\tThe Actual is...");
+ PrintByteStructPack2Explicit(str1, str1.ToString());
+ Console.WriteLine("\tThe Expected is...");
+ PrintByteStructPack2Explicit(str2, str2.ToString());
+ return false;
+ }
+ else
+ {
+ Console.WriteLine("\tPASSED!");
+ return true;
+ }
+ }
+ #endregion
+
+ #region methods for ShortStructPack4Explicit struct
+ public static ShortStructPack4Explicit NewShortStructPack4Explicit(short s1, short s2)
+ {
+ ShortStructPack4Explicit u2 = new ShortStructPack4Explicit();
+ u2.s1 = s1;
+ u2.s2 = s2;
+
+ return u2;
+ }
+ public static void PrintShortStructPack4Explicit(ShortStructPack4Explicit str1, string name)
+ {
+ Console.WriteLine("\t{0}.s1 = {1}", name, str1.s1);
+ Console.WriteLine("\t{0}.s2 = {1}", name, str1.s2);
+ }
+ public static bool ValidateShortStructPack4Explicit(ShortStructPack4Explicit str1, ShortStructPack4Explicit str2, string methodName)
+ {
+ if (str1.s1 != str2.s1 || str1.s2 != str2.s2)
+ {
+ Console.WriteLine("\tFAILED! " + methodName + "did not recieve result as expected.");
+ Console.WriteLine("\tThe Actual is...");
+ PrintShortStructPack4Explicit(str1, str1.ToString());
+ Console.WriteLine("\tThe Expected is...");
+ PrintShortStructPack4Explicit(str2, str2.ToString());
+ return false;
+ }
+ else
+ {
+ Console.WriteLine("\tPASSED!");
+ return true;
+ }
+ }
+ #endregion
+
+ #region methods for IntStructPack8Explicit struct
+ public static IntStructPack8Explicit NewIntStructPack8Explicit(int i1, int i2)
+ {
+ IntStructPack8Explicit u3 = new IntStructPack8Explicit();
+ u3.i1 = i1;
+ u3.i2 = i2;
+
+ return u3;
+ }
+ public static void PrintIntStructPack8Explicit(IntStructPack8Explicit str1, string name)
+ {
+ Console.WriteLine("\t{0}.i1 = {1}", name, str1.i1);
+ Console.WriteLine("\t{0}.i2 = {1}", name, str1.i2);
+ }
+ public static bool ValidateIntStructPack8Explicit(IntStructPack8Explicit str1, IntStructPack8Explicit str2, string methodName)
+ {
+ if (str1.i1 != str2.i1 || str1.i2 != str2.i2)
+ {
+ Console.WriteLine("\tFAILED! " + methodName + "did not recieve result as expected.");
+ Console.WriteLine("\tThe Actual is...");
+ PrintIntStructPack8Explicit(str1, str1.ToString());
+ Console.WriteLine("\tThe Expected is...");
+ PrintIntStructPack8Explicit(str2, str2.ToString());
+ return false;
+ }
+ else
+ {
+ Console.WriteLine("\tPASSED!");
+ return true;
+ }
+ }
+ #endregion
+
+ #region methods for LongStructPack16Explicit struct
+ public static LongStructPack16Explicit NewLongStructPack16Explicit(long l1, long l2)
+ {
+ LongStructPack16Explicit u4 = new LongStructPack16Explicit();
+ u4.l1 = l1;
+ u4.l2 = l2;
+
+ return u4;
+ }
+ public static void PrintLongStructPack16Explicit(LongStructPack16Explicit str1, string name)
+ {
+ Console.WriteLine("\t{0}.l1 = {1}", name, str1.l1);
+ Console.WriteLine("\t{0}.l2 = {1}", name, str1.l2);
+ }
+ public static bool ValidateLongStructPack16Explicit(LongStructPack16Explicit str1, LongStructPack16Explicit str2, string methodName)
+ {
+ if (str1.l1 != str2.l1 || str1.l2 != str2.l2)
+ {
+ Console.WriteLine("\tFAILED! " + methodName + "did not recieve result as expected.");
+ Console.WriteLine("\tThe Actual is...");
+ PrintLongStructPack16Explicit(str1, str1.ToString());
+ Console.WriteLine("\tThe Expected is...");
+ PrintLongStructPack16Explicit(str2, str2.ToString());
+ return false;
+ }
+ else
+ {
+ Console.WriteLine("\tPASSED!");
+ return true;
+ }
+ }
+ #endregion
+
+} \ No newline at end of file
diff --git a/tests/src/Interop/StructMarshalling/PInvoke/MarshalStructAsLayoutExp.cs b/tests/src/Interop/StructMarshalling/PInvoke/MarshalStructAsLayoutExp.cs
new file mode 100644
index 0000000000..43492d7c49
--- /dev/null
+++ b/tests/src/Interop/StructMarshalling/PInvoke/MarshalStructAsLayoutExp.cs
@@ -0,0 +1,1570 @@
+using System;
+using System.Runtime.InteropServices;
+using System.Security;
+
+public class Managed
+{
+ static int failures = 0;
+ enum StructID
+ {
+ INNER2Id,
+ InnerExplicitId,
+ InnerArrayExplicitId,
+ OUTER3Id,
+ UId,
+ ByteStructPack2ExplicitId,
+ ShortStructPack4ExplicitId,
+ IntStructPack8ExplicitId,
+ LongStructPack16ExplicitId
+ }
+
+ [SecuritySafeCritical]
+ public static int Main()
+ {
+ RunMarshalStructAsParamAsExpByVal();
+ RunMarshalStructAsParamAsExpByRef();
+ RunMarshalStructAsParamAsExpByValIn();
+ RunMarshalStructAsParamAsExpByRefIn();
+ RunMarshalStructAsParamAsExpByValOut();
+ RunMarshalStructAsParamAsExpByRefOut();
+ RunMarshalStructAsParamAsExpByValInOut();
+ RunMarshalStructAsParamAsExpByRefInOut();
+
+ if (failures > 0)
+ {
+ Console.WriteLine("\nTEST FAILED!");
+ return 101;
+ }
+ else
+ {
+ Console.WriteLine("\nTEST PASSED!");
+ return 100;
+ }
+ }
+
+ #region Struct with Layout Explicit scenario1
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsExpByValINNER2(INNER2 str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsExpByRefINNER2(ref INNER2 str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsExpByValINNER2")]
+ static extern bool MarshalStructAsParam_AsExpByValInINNER2([In] INNER2 str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsExpByRefInINNER2([In] ref INNER2 str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsExpByValINNER2")]
+ static extern bool MarshalStructAsParam_AsExpByValOutINNER2([Out] INNER2 str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsExpByRefOutINNER2(out INNER2 str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsExpByValINNER2")]
+ static extern bool MarshalStructAsParam_AsExpByValInOutINNER2([In, Out] INNER2 str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsExpByRefINNER2")]
+ static extern bool MarshalStructAsParam_AsExpByRefInOutINNER2([In, Out] ref INNER2 str1);
+ #endregion
+ #region Struct with Layout Explicit scenario2
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsExpByValInnerExplicit")]
+ static extern bool MarshalStructAsParam_AsExpByValInnerExplicit(InnerExplicit str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsExpByRefInnerExplicit")]
+ static extern bool MarshalStructAsParam_AsExpByRefInnerExplicit(ref InnerExplicit str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsExpByValInnerExplicit")]
+ static extern bool MarshalStructAsParam_AsExpByValInInnerExplicit([In] InnerExplicit str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsExpByRefInInnerExplicit")]
+ static extern bool MarshalStructAsParam_AsExpByRefInInnerExplicit([In] ref InnerExplicit str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsExpByValInnerExplicit")]
+ static extern bool MarshalStructAsParam_AsExpByValOutInnerExplicit([Out] InnerExplicit str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsExpByRefOutInnerExplicit")]
+ static extern bool MarshalStructAsParam_AsExpByRefOutInnerExplicit(out InnerExplicit str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsExpByValInnerExplicit")]
+ static extern bool MarshalStructAsParam_AsExpByValInOutInnerExplicit([In, Out] InnerExplicit str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsExpByRefInnerExplicit")]
+ static extern bool MarshalStructAsParam_AsExpByRefInOutInnerExplicit([In, Out] ref InnerExplicit str1);
+ #endregion
+ #region Struct with Layout Explicit scenario3
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsExpByValInnerArrayExplicit(InnerArrayExplicit str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsExpByRefInnerArrayExplicit(ref InnerArrayExplicit str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsExpByValInnerArrayExplicit")]
+ static extern bool MarshalStructAsParam_AsExpByValInInnerArrayExplicit([In] InnerArrayExplicit str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsExpByRefInInnerArrayExplicit([In] ref InnerArrayExplicit str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsExpByValInnerArrayExplicit")]
+ static extern bool MarshalStructAsParam_AsExpByValOutInnerArrayExplicit([Out] InnerArrayExplicit str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsExpByRefOutInnerArrayExplicit(out InnerArrayExplicit str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsExpByValInnerArrayExplicit")]
+ static extern bool MarshalStructAsParam_AsExpByValInOutInnerArrayExplicit([In, Out] InnerArrayExplicit str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsExpByRefInnerArrayExplicit")]
+ static extern bool MarshalStructAsParam_AsExpByRefInOutInnerArrayExplicit([In, Out] ref InnerArrayExplicit str1);
+ #endregion
+ #region Struct with Layout Explicit scenario4
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsExpByValOUTER3(OUTER3 str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsExpByRefOUTER3(ref OUTER3 str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsExpByValOUTER3")]
+ static extern bool MarshalStructAsParam_AsExpByValInOUTER3([In] OUTER3 str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsExpByRefInOUTER3([In] ref OUTER3 str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsExpByValOUTER3")]
+ static extern bool MarshalStructAsParam_AsExpByValOutOUTER3([Out] OUTER3 str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsExpByRefOutOUTER3(out OUTER3 str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsExpByValOUTER3")]
+ static extern bool MarshalStructAsParam_AsExpByValInOutOUTER3([In, Out] OUTER3 str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsExpByRefOUTER3")]
+ static extern bool MarshalStructAsParam_AsExpByRefInOutOUTER3([In, Out] ref OUTER3 str1);
+ #endregion
+ #region Struct(U) with Layout Explicit scenario5
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsExpByValU(U str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsExpByRefU(ref U str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsExpByValU")]
+ static extern bool MarshalStructAsParam_AsExpByValInU([In] U str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsExpByRefInU([In] ref U str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsExpByValU")]
+ static extern bool MarshalStructAsParam_AsExpByValOutU([Out] U str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsExpByRefOutU(out U str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsExpByValU")]
+ static extern bool MarshalStructAsParam_AsExpByValInOutU([In, Out] U str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsExpByRefU")]
+ static extern bool MarshalStructAsParam_AsExpByRefInOutU([In, Out] ref U str1);
+ #endregion
+
+ #region Struct(ByteStructPack2Explicit) with Layout Explicit scenario6
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsExpByValByteStructPack2Explicit(ByteStructPack2Explicit str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsExpByRefByteStructPack2Explicit(ref ByteStructPack2Explicit str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsExpByValByteStructPack2Explicit")]
+ static extern bool MarshalStructAsParam_AsExpByValInByteStructPack2Explicit([In] ByteStructPack2Explicit str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsExpByRefInByteStructPack2Explicit([In] ref ByteStructPack2Explicit str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsExpByValByteStructPack2Explicit")]
+ static extern bool MarshalStructAsParam_AsExpByValOutByteStructPack2Explicit([Out] ByteStructPack2Explicit str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsExpByRefOutByteStructPack2Explicit(out ByteStructPack2Explicit str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsExpByValByteStructPack2Explicit")]
+ static extern bool MarshalStructAsParam_AsExpByValInOutByteStructPack2Explicit([In, Out] ByteStructPack2Explicit str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsExpByRefByteStructPack2Explicit")]
+ static extern bool MarshalStructAsParam_AsExpByRefInOutByteStructPack2Explicit([In, Out] ref ByteStructPack2Explicit str1);
+ #endregion
+ #region Struct(ShortStructPack4Explicit) with Layout Explicit scenario7
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsExpByValShortStructPack4Explicit(ShortStructPack4Explicit str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsExpByRefShortStructPack4Explicit(ref ShortStructPack4Explicit str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsExpByValShortStructPack4Explicit")]
+ static extern bool MarshalStructAsParam_AsExpByValInShortStructPack4Explicit([In] ShortStructPack4Explicit str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsExpByRefInShortStructPack4Explicit([In] ref ShortStructPack4Explicit str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsExpByValShortStructPack4Explicit")]
+ static extern bool MarshalStructAsParam_AsExpByValOutShortStructPack4Explicit([Out] ShortStructPack4Explicit str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsExpByRefOutShortStructPack4Explicit(out ShortStructPack4Explicit str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsExpByValShortStructPack4Explicit")]
+ static extern bool MarshalStructAsParam_AsExpByValInOutShortStructPack4Explicit([In, Out] ShortStructPack4Explicit str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsExpByRefShortStructPack4Explicit")]
+ static extern bool MarshalStructAsParam_AsExpByRefInOutShortStructPack4Explicit([In, Out] ref ShortStructPack4Explicit str1);
+ #endregion
+ #region Struct(IntStructPack8Explicit) with Layout Explicit scenario8
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsExpByValIntStructPack8Explicit(IntStructPack8Explicit str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsExpByRefIntStructPack8Explicit(ref IntStructPack8Explicit str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsExpByValIntStructPack8Explicit")]
+ static extern bool MarshalStructAsParam_AsExpByValInIntStructPack8Explicit([In] IntStructPack8Explicit str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsExpByRefInIntStructPack8Explicit([In] ref IntStructPack8Explicit str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsExpByValIntStructPack8Explicit")]
+ static extern bool MarshalStructAsParam_AsExpByValOutIntStructPack8Explicit([Out] IntStructPack8Explicit str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsExpByRefOutIntStructPack8Explicit(out IntStructPack8Explicit str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsExpByValIntStructPack8Explicit")]
+ static extern bool MarshalStructAsParam_AsExpByValInOutIntStructPack8Explicit([In, Out] IntStructPack8Explicit str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsExpByRefIntStructPack8Explicit")]
+ static extern bool MarshalStructAsParam_AsExpByRefInOutIntStructPack8Explicit([In, Out] ref IntStructPack8Explicit str1);
+ #endregion
+ #region Struct(LongStructPack16Explicit) with Layout Explicit scenario9
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsExpByValLongStructPack16Explicit(LongStructPack16Explicit str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsExpByRefLongStructPack16Explicit(ref LongStructPack16Explicit str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsExpByValLongStructPack16Explicit")]
+ static extern bool MarshalStructAsParam_AsExpByValInLongStructPack16Explicit([In] LongStructPack16Explicit str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsExpByRefInLongStructPack16Explicit([In] ref LongStructPack16Explicit str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsExpByValLongStructPack16Explicit")]
+ static extern bool MarshalStructAsParam_AsExpByValOutLongStructPack16Explicit([Out] LongStructPack16Explicit str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsExpByRefOutLongStructPack16Explicit(out LongStructPack16Explicit str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsExpByValLongStructPack16Explicit")]
+ static extern bool MarshalStructAsParam_AsExpByValInOutLongStructPack16Explicit([In, Out] LongStructPack16Explicit str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsExpByRefLongStructPack16Explicit")]
+ static extern bool MarshalStructAsParam_AsExpByRefInOutLongStructPack16Explicit([In, Out] ref LongStructPack16Explicit str1);
+ #endregion
+
+ #region Marshal Explicit struct method
+ [SecuritySafeCritical]
+ private static void MarshalStructAsParam_AsExpByVal(StructID id)
+ {
+ try
+ {
+ switch (id)
+ {
+ case StructID.INNER2Id:
+ INNER2 sourceINNER2 = Helper.NewINNER2(1, 1.0F, "some string");
+ INNER2 cloneINNER2 = Helper.NewINNER2(1, 1.0F, "some string");
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByValINNER2...");
+ if (!MarshalStructAsParam_AsExpByValINNER2(sourceINNER2))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByValINNER2.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateINNER2(sourceINNER2, cloneINNER2, "MarshalStructAsParam_AsExpByValINNER2"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.InnerExplicitId:
+ InnerExplicit sourceInnerExplicit = new InnerExplicit();
+ sourceInnerExplicit.f1 = 1;
+ sourceInnerExplicit.f3 = "some string";
+ InnerExplicit cloneInnerExplicit = new InnerExplicit();
+ cloneInnerExplicit.f1 = 1;
+ cloneInnerExplicit.f3 = "some string";
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByValInnerExplicit...");
+ if (!MarshalStructAsParam_AsExpByValInnerExplicit(sourceInnerExplicit))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByValInnerExplicit.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateInnerExplicit(sourceInnerExplicit, cloneInnerExplicit, "MarshalStructAsParam_AsExpByValInnerExplicit"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.InnerArrayExplicitId:
+ InnerArrayExplicit sourceInnerArrayExplicit = Helper.NewInnerArrayExplicit(1, 1.0F, "some string1", "some string2");
+ InnerArrayExplicit cloneInnerArrayExplicit = Helper.NewInnerArrayExplicit(1, 1.0F, "some string1", "some string2");
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByValInnerArrayExplicit...");
+ if (!MarshalStructAsParam_AsExpByValInnerArrayExplicit(sourceInnerArrayExplicit))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByValInnerArrayExplicit.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateInnerArrayExplicit(sourceInnerArrayExplicit, cloneInnerArrayExplicit, "MarshalStructAsParam_AsExpByValInnerArrayExplicit"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.OUTER3Id:
+ OUTER3 sourceOUTER3 = Helper.NewOUTER3(1, 1.0F, "some string", "some string");
+ OUTER3 cloneOUTER3 = Helper.NewOUTER3(1, 1.0F, "some string", "some string");
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByValOUTER3...");
+ if (!MarshalStructAsParam_AsExpByValOUTER3(sourceOUTER3))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByValOUTER3.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateOUTER3(sourceOUTER3, cloneOUTER3, "MarshalStructAsParam_AsExpByValOUTER3"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.UId:
+ U sourceU = Helper.NewU(Int32.MinValue, UInt32.MaxValue, new IntPtr(-32), new UIntPtr(32), short.MinValue, ushort.MaxValue, byte.MinValue, sbyte.MaxValue, long.MinValue, ulong.MaxValue, 32.0F, 3.2);
+ U cloneU = Helper.NewU(Int32.MinValue, UInt32.MaxValue, new IntPtr(-32), new UIntPtr(32), short.MinValue, ushort.MaxValue, byte.MinValue, sbyte.MaxValue, long.MinValue, ulong.MaxValue, 32.0F, 3.2);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByValU...");
+ if (!MarshalStructAsParam_AsExpByValU(sourceU))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByValU.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateU(sourceU, cloneU, "MarshalStructAsParam_AsExpByValU"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.ByteStructPack2ExplicitId:
+ ByteStructPack2Explicit source_bspe = Helper.NewByteStructPack2Explicit(32, 32);
+ ByteStructPack2Explicit clone_bspe = Helper.NewByteStructPack2Explicit(32, 32);
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByValByteStructPack2Explicit...");
+ if (!MarshalStructAsParam_AsExpByValByteStructPack2Explicit(source_bspe))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByValByteStructPack2Explicit.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateByteStructPack2Explicit(source_bspe, clone_bspe, "MarshalStructAsParam_AsExpByValByteStructPack2Explicit"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.ShortStructPack4ExplicitId:
+ ShortStructPack4Explicit source_sspe = Helper.NewShortStructPack4Explicit(32, 32);
+ ShortStructPack4Explicit clone_sspe = Helper.NewShortStructPack4Explicit(32, 32);
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByValShortStructPack4Explicit...");
+ if (!MarshalStructAsParam_AsExpByValShortStructPack4Explicit(source_sspe))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByValShortStructPack4Explicit.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateShortStructPack4Explicit(source_sspe, clone_sspe, "MarshalStructAsParam_AsExpByValShortStructPack4Explicit"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.IntStructPack8ExplicitId:
+ IntStructPack8Explicit source_ispe = Helper.NewIntStructPack8Explicit(32, 32);
+ IntStructPack8Explicit clone_ispe = Helper.NewIntStructPack8Explicit(32, 32);
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByValIntStructPack8Explicit...");
+ if (!MarshalStructAsParam_AsExpByValIntStructPack8Explicit(source_ispe))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByValIntStructPack8Explicit.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateIntStructPack8Explicit(source_ispe, clone_ispe, "MarshalStructAsParam_AsExpByValIntStructPack8Explicit"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.LongStructPack16ExplicitId:
+ LongStructPack16Explicit sourceLongStructPack16Explicit = Helper.NewLongStructPack16Explicit(32, 32);
+ LongStructPack16Explicit cloneLongStructPack16Explicit = Helper.NewLongStructPack16Explicit(32, 32);
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByValLongStructPack16Explicit...");
+ if (!MarshalStructAsParam_AsExpByValLongStructPack16Explicit(sourceLongStructPack16Explicit))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByValLongStructPack16Explicit.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateLongStructPack16Explicit(sourceLongStructPack16Explicit, cloneLongStructPack16Explicit, "MarshalStructAsParam_AsExpByValLongStructPack16Explicit"))
+ {
+ failures++;
+ }
+ break;
+ default:
+ Console.WriteLine("\tThere is not the struct id");
+ failures++;
+ break;
+ }
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine("Unexpected Exception:" + e.ToString());
+ failures++;
+ }
+ }
+
+ [SecuritySafeCritical]
+ private static void MarshalStructAsParam_AsExpByRef(StructID id)
+ {
+ try
+ {
+ switch (id)
+ {
+ case StructID.INNER2Id:
+ INNER2 sourceINNER2 = Helper.NewINNER2(1, 1.0F, "some string");
+ INNER2 changeINNER2 = Helper.NewINNER2(77, 77.0F, "changed string");
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByRefINNER2...");
+ if (!MarshalStructAsParam_AsExpByRefINNER2(ref sourceINNER2))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByRefINNER2.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateINNER2(sourceINNER2, changeINNER2, "MarshalStructAsParam_AsExpByRefINNER2"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.InnerExplicitId:
+ InnerExplicit sourceInnerExplicit = new InnerExplicit();
+ sourceInnerExplicit.f1 = 1;
+ sourceInnerExplicit.f3 = "some string";
+ InnerExplicit changeInnerExplicit = new InnerExplicit();
+ changeInnerExplicit.f1 = 77;
+ changeInnerExplicit.f3 = "changed string";
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByRefInnerExplicit...");
+ if (!MarshalStructAsParam_AsExpByRefInnerExplicit(ref sourceInnerExplicit))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByRefInnerExplicit.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateInnerExplicit(sourceInnerExplicit, changeInnerExplicit, "MarshalStructAsParam_AsExpByRefInnerExplicit"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.InnerArrayExplicitId:
+ InnerArrayExplicit sourceInnerArrayExplicit = Helper.NewInnerArrayExplicit(1, 1.0F, "some string1", "some string2");
+ InnerArrayExplicit changeInnerArrayExplicit = Helper.NewInnerArrayExplicit(77, 77.0F, "change string1", "change string2");
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByRefInnerArrayExplicit...");
+ if (!MarshalStructAsParam_AsExpByRefInnerArrayExplicit(ref sourceInnerArrayExplicit))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByRefInnerArrayExplicit.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateInnerArrayExplicit(sourceInnerArrayExplicit, changeInnerArrayExplicit, "MarshalStructAsParam_AsExpByRefInnerArrayExplicit"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.OUTER3Id:
+ OUTER3 sourceOUTER3 = Helper.NewOUTER3(1, 1.0F, "some string", "some string");
+ OUTER3 changeOUTER3 = Helper.NewOUTER3(77, 77.0F, "changed string", "changed string");
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByRefOUTER3...");
+ if (!MarshalStructAsParam_AsExpByRefOUTER3(ref sourceOUTER3))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByRefOUTER3.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateOUTER3(sourceOUTER3, changeOUTER3, "MarshalStructAsParam_AsExpByRefOUTER3"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.UId:
+ U sourceU = Helper.NewU(Int32.MinValue, UInt32.MaxValue, new IntPtr(-32), new UIntPtr(32), short.MinValue, ushort.MaxValue, byte.MinValue, sbyte.MaxValue, long.MinValue, ulong.MaxValue, 32.0F, 3.2);
+ U changeU = Helper.NewU(Int32.MaxValue, UInt32.MinValue, new IntPtr(-64), new UIntPtr(64), short.MaxValue, ushort.MinValue, byte.MaxValue, sbyte.MinValue, long.MaxValue, ulong.MinValue, 64.0F, 6.4);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByRefU...");
+ if (!MarshalStructAsParam_AsExpByRefU(ref sourceU))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByRefU.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateU(sourceU, changeU, "MarshalStructAsParam_AsExpByRefU"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.ByteStructPack2ExplicitId:
+ ByteStructPack2Explicit source_bspe = Helper.NewByteStructPack2Explicit(32, 32);
+ ByteStructPack2Explicit change_bspe = Helper.NewByteStructPack2Explicit(64, 64);
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByRefByteStructPack2Explicit...");
+ if (!MarshalStructAsParam_AsExpByRefByteStructPack2Explicit(ref source_bspe))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByRefByteStructPack2Explicit.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateByteStructPack2Explicit(source_bspe, change_bspe, "MarshalStructAsParam_AsExpByRefByteStructPack2Explicit"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.ShortStructPack4ExplicitId:
+ ShortStructPack4Explicit source_sspe = Helper.NewShortStructPack4Explicit(32, 32);
+ ShortStructPack4Explicit change_sspe = Helper.NewShortStructPack4Explicit(64, 64);
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByRefShortStructPack4Explicit...");
+ if (!MarshalStructAsParam_AsExpByRefShortStructPack4Explicit(ref source_sspe))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByRefShortStructPack4Explicit.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateShortStructPack4Explicit(source_sspe, change_sspe, "MarshalStructAsParam_AsExpByRefShortStructPack4Explicit"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.IntStructPack8ExplicitId:
+ IntStructPack8Explicit source_ispe = Helper.NewIntStructPack8Explicit(32, 32);
+ IntStructPack8Explicit change_ispe = Helper.NewIntStructPack8Explicit(64, 64);
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByRefIntStructPack8Explicit...");
+ if (!MarshalStructAsParam_AsExpByRefIntStructPack8Explicit(ref source_ispe))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByRefIntStructPack8Explicit.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateIntStructPack8Explicit(source_ispe, change_ispe, "MarshalStructAsParam_AsExpByRefIntStructPack8Explicit"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.LongStructPack16ExplicitId:
+ LongStructPack16Explicit sourceLongStructPack16Explicit = Helper.NewLongStructPack16Explicit(32, 32);
+ LongStructPack16Explicit changeLongStructPack16Explicit = Helper.NewLongStructPack16Explicit(64, 64);
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByRefLongStructPack16Explicit...");
+ if (!MarshalStructAsParam_AsExpByRefLongStructPack16Explicit(ref sourceLongStructPack16Explicit))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByRefLongStructPack16Explicit.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateLongStructPack16Explicit(sourceLongStructPack16Explicit, changeLongStructPack16Explicit, "MarshalStructAsParam_AsExpByRefLongStructPack16Explicit"))
+ {
+ failures++;
+ }
+ break;
+ default:
+ Console.WriteLine("\tThere is not the struct id");
+ failures++;
+ break;
+ }
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine("Unexpected Exception:" + e.ToString());
+ failures++;
+ }
+ }
+
+ [SecuritySafeCritical]
+ private static void MarshalStructAsParam_AsExpByValIn(StructID id)
+ {
+ try
+ {
+ switch (id)
+ {
+ case StructID.INNER2Id:
+ INNER2 sourceINNER2 = Helper.NewINNER2(1, 1.0F, "some string");
+ INNER2 cloneINNER2 = Helper.NewINNER2(1, 1.0F, "some string");
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByValInINNER2...");
+ if (!MarshalStructAsParam_AsExpByValInINNER2(sourceINNER2))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByValInINNER2.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateINNER2(sourceINNER2, cloneINNER2, "MarshalStructAsParam_AsExpByValInINNER2"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.InnerExplicitId:
+ InnerExplicit sourceInnerExplicit = new InnerExplicit();
+ sourceInnerExplicit.f1 = 1;
+ sourceInnerExplicit.f3 = "some string";
+ InnerExplicit cloneInnerExplicit = new InnerExplicit();
+ cloneInnerExplicit.f1 = 1;
+ cloneInnerExplicit.f3 = "some string";
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByValInInnerExplicit...");
+ if (!MarshalStructAsParam_AsExpByValInInnerExplicit(sourceInnerExplicit))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByValInInnerExplicit.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateInnerExplicit(sourceInnerExplicit, cloneInnerExplicit, "MarshalStructAsParam_AsExpByValInInnerExplicit"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.InnerArrayExplicitId:
+ InnerArrayExplicit sourceInnerArrayExplicit = Helper.NewInnerArrayExplicit(1, 1.0F, "some string1", "some string2");
+ InnerArrayExplicit cloneInnerArrayExplicit = Helper.NewInnerArrayExplicit(1, 1.0F, "some string1", "some string2");
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByValInInnerArrayExplicit...");
+ if (!MarshalStructAsParam_AsExpByValInInnerArrayExplicit(sourceInnerArrayExplicit))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByValInInnerArrayExplicit.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateInnerArrayExplicit(sourceInnerArrayExplicit, cloneInnerArrayExplicit, "MarshalStructAsParam_AsExpByValInInnerArrayExplicit"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.OUTER3Id:
+ OUTER3 sourceOUTER3 = Helper.NewOUTER3(1, 1.0F, "some string", "some string");
+ OUTER3 cloneOUTER3 = Helper.NewOUTER3(1, 1.0F, "some string", "some string");
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByValInOUTER3...");
+ if (!MarshalStructAsParam_AsExpByValInOUTER3(sourceOUTER3))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByValInOUTER3.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateOUTER3(sourceOUTER3, cloneOUTER3, "MarshalStructAsParam_AsExpByValInOUTER3"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.UId:
+ U sourceU = Helper.NewU(Int32.MinValue, UInt32.MaxValue, new IntPtr(-32), new UIntPtr(32), short.MinValue, ushort.MaxValue, byte.MinValue, sbyte.MaxValue, long.MinValue, ulong.MaxValue, 32.0F, 3.2);
+ U cloneU = Helper.NewU(Int32.MinValue, UInt32.MaxValue, new IntPtr(-32), new UIntPtr(32), short.MinValue, ushort.MaxValue, byte.MinValue, sbyte.MaxValue, long.MinValue, ulong.MaxValue, 32.0F, 3.2);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByValInU...");
+ if (!MarshalStructAsParam_AsExpByValInU(sourceU))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByValInU.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateU(sourceU, cloneU, "MarshalStructAsParam_AsExpByValInU"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.ByteStructPack2ExplicitId:
+ ByteStructPack2Explicit source_bspe = Helper.NewByteStructPack2Explicit(32, 32);
+ ByteStructPack2Explicit clone_bspe = Helper.NewByteStructPack2Explicit(32, 32);
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByValInByteStructPack2Explicit...");
+ if (!MarshalStructAsParam_AsExpByValInByteStructPack2Explicit(source_bspe))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByValInByteStructPack2Explicit.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateByteStructPack2Explicit(source_bspe, clone_bspe, "MarshalStructAsParam_AsExpByValInByteStructPack2Explicit"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.ShortStructPack4ExplicitId:
+ ShortStructPack4Explicit source_sspe = Helper.NewShortStructPack4Explicit(32, 32);
+ ShortStructPack4Explicit clone_sspe = Helper.NewShortStructPack4Explicit(32, 32);
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByValInShortStructPack4Explicit...");
+ if (!MarshalStructAsParam_AsExpByValInShortStructPack4Explicit(source_sspe))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByValInShortStructPack4Explicit.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateShortStructPack4Explicit(source_sspe, clone_sspe, "MarshalStructAsParam_AsExpByValInShortStructPack4Explicit"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.IntStructPack8ExplicitId:
+ IntStructPack8Explicit source_ispe = Helper.NewIntStructPack8Explicit(32, 32);
+ IntStructPack8Explicit clone_ispe = Helper.NewIntStructPack8Explicit(32, 32);
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByValInIntStructPack8Explicit...");
+ if (!MarshalStructAsParam_AsExpByValInIntStructPack8Explicit(source_ispe))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByValInIntStructPack8Explicit.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateIntStructPack8Explicit(source_ispe, clone_ispe, "MarshalStructAsParam_AsExpByValInIntStructPack8Explicit"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.LongStructPack16ExplicitId:
+ LongStructPack16Explicit sourceLongStructPack16Explicit = Helper.NewLongStructPack16Explicit(32, 32);
+ LongStructPack16Explicit cloneLongStructPack16Explicit = Helper.NewLongStructPack16Explicit(32, 32);
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByValInLongStructPack16Explicit...");
+ if (!MarshalStructAsParam_AsExpByValInLongStructPack16Explicit(sourceLongStructPack16Explicit))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByValInLongStructPack16Explicit.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateLongStructPack16Explicit(sourceLongStructPack16Explicit, cloneLongStructPack16Explicit, "MarshalStructAsParam_AsExpByValInLongStructPack16Explicit"))
+ {
+ failures++;
+ }
+ break;
+ default:
+ Console.WriteLine("\tThere is not the struct id");
+ failures++;
+ break;
+ }
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine("Unexpected Exception:" + e.ToString());
+ failures++;
+ }
+ }
+
+ [SecuritySafeCritical]
+ private static void MarshalStructAsParam_AsExpByRefIn(StructID id)
+ {
+ try
+ {
+ switch (id)
+ {
+ case StructID.INNER2Id:
+ INNER2 sourceINNER2 = Helper.NewINNER2(1, 1.0F, "some string");
+ INNER2 changeINNER2 = Helper.NewINNER2(1, 1.0F, "some string");
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByRefInINNER2...");
+ if (!MarshalStructAsParam_AsExpByRefInINNER2(ref sourceINNER2))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByRefInINNER2.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateINNER2(sourceINNER2, changeINNER2, "MarshalStructAsParam_AsExpByRefInINNER2"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.InnerExplicitId:
+ InnerExplicit sourceInnerExplicit = new InnerExplicit();
+ sourceInnerExplicit.f1 = 1;
+ sourceInnerExplicit.f3 = "some string";
+ InnerExplicit changeInnerExplicit = new InnerExplicit();
+ changeInnerExplicit.f1 = 1;
+ changeInnerExplicit.f3 = "some string";
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByRefInInnerExplicit...");
+ if (!MarshalStructAsParam_AsExpByRefInInnerExplicit(ref sourceInnerExplicit))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByRefInInnerExplicit.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateInnerExplicit(sourceInnerExplicit, changeInnerExplicit, "MarshalStructAsParam_AsExpByRefInInnerExplicit"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.InnerArrayExplicitId:
+ InnerArrayExplicit sourceInnerArrayExplicit = Helper.NewInnerArrayExplicit(1, 1.0F, "some string1", "some string2");
+ InnerArrayExplicit changeInnerArrayExplicit = Helper.NewInnerArrayExplicit(1, 1.0F, "some string1", "some string2");
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByRefInInnerArrayExplicit...");
+ if (!MarshalStructAsParam_AsExpByRefInInnerArrayExplicit(ref sourceInnerArrayExplicit))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByRefInInnerArrayExplicit.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateInnerArrayExplicit(sourceInnerArrayExplicit, changeInnerArrayExplicit, "MarshalStructAsParam_AsExpByRefInInnerArrayExplicit"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.OUTER3Id:
+ OUTER3 sourceOUTER3 = Helper.NewOUTER3(1, 1.0F, "some string", "some string");
+ OUTER3 changeOUTER3 = Helper.NewOUTER3(1, 1.0F, "some string", "some string");
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByRefInOUTER3...");
+ if (!MarshalStructAsParam_AsExpByRefInOUTER3(ref sourceOUTER3))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByRefInOUTER3.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateOUTER3(sourceOUTER3, changeOUTER3, "MarshalStructAsParam_AsExpByRefInOUTER3"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.UId:
+ U sourceU = Helper.NewU(Int32.MinValue, UInt32.MaxValue, new IntPtr(-32), new UIntPtr(32), short.MinValue, ushort.MaxValue, byte.MinValue, sbyte.MaxValue, long.MinValue, ulong.MaxValue, 32.0F, 3.2);
+ U changeU = Helper.NewU(Int32.MaxValue, UInt32.MinValue, new IntPtr(-64), new UIntPtr(64), short.MaxValue, ushort.MinValue, byte.MaxValue, sbyte.MinValue, long.MaxValue, ulong.MinValue, 64.0F, 6.4);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByRefInU...");
+ if (!MarshalStructAsParam_AsExpByRefInU(ref sourceU))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByRefInU.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateU(sourceU, changeU, "MarshalStructAsParam_AsExpByRefInU"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.ByteStructPack2ExplicitId:
+ ByteStructPack2Explicit source_bspe = Helper.NewByteStructPack2Explicit(32, 32);
+ ByteStructPack2Explicit change_bspe = Helper.NewByteStructPack2Explicit(64, 64);
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByRefInByteStructPack2Explicit...");
+ if (!MarshalStructAsParam_AsExpByRefInByteStructPack2Explicit(ref source_bspe))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByRefInByteStructPack2Explicit.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateByteStructPack2Explicit(source_bspe, change_bspe, "MarshalStructAsParam_AsExpByRefInByteStructPack2Explicit"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.ShortStructPack4ExplicitId:
+ ShortStructPack4Explicit source_sspe = Helper.NewShortStructPack4Explicit(32, 32);
+ ShortStructPack4Explicit change_sspe = Helper.NewShortStructPack4Explicit(64, 64);
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByRefInShortStructPack4Explicit...");
+ if (!MarshalStructAsParam_AsExpByRefInShortStructPack4Explicit(ref source_sspe))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByRefInShortStructPack4Explicit.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateShortStructPack4Explicit(source_sspe, change_sspe, "MarshalStructAsParam_AsExpByRefInShortStructPack4Explicit"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.IntStructPack8ExplicitId:
+ IntStructPack8Explicit source_ispe = Helper.NewIntStructPack8Explicit(32, 32);
+ IntStructPack8Explicit change_ispe = Helper.NewIntStructPack8Explicit(64, 64);
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByRefInIntStructPack8Explicit...");
+ if (!MarshalStructAsParam_AsExpByRefInIntStructPack8Explicit(ref source_ispe))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByRefInIntStructPack8Explicit.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateIntStructPack8Explicit(source_ispe, change_ispe, "MarshalStructAsParam_AsExpByRefInIntStructPack8Explicit"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.LongStructPack16ExplicitId:
+ LongStructPack16Explicit sourceLongStructPack16Explicit = Helper.NewLongStructPack16Explicit(32, 32);
+ LongStructPack16Explicit changeLongStructPack16Explicit = Helper.NewLongStructPack16Explicit(64, 64);
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByRefInLongStructPack16Explicit...");
+ if (!MarshalStructAsParam_AsExpByRefInLongStructPack16Explicit(ref sourceLongStructPack16Explicit))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByRefInLongStructPack16Explicit.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateLongStructPack16Explicit(sourceLongStructPack16Explicit, changeLongStructPack16Explicit, "MarshalStructAsParam_AsExpByRefInLongStructPack16Explicit"))
+ {
+ failures++;
+ }
+ break;
+ default:
+ Console.WriteLine("\tThere is not the struct id");
+ failures++;
+ break;
+ }
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine("Unexpected Exception:" + e.ToString());
+ failures++;
+ }
+ }
+
+ [SecuritySafeCritical]
+ private static void MarshalStructAsParam_AsExpByValOut(StructID id)
+ {
+ try
+ {
+ switch (id)
+ {
+ case StructID.INNER2Id:
+ INNER2 sourceINNER2 = Helper.NewINNER2(1, 1.0F, "some string");
+ INNER2 cloneINNER2 = Helper.NewINNER2(1, 1.0F, "some string");
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByValOutINNER2...");
+ if (!MarshalStructAsParam_AsExpByValOutINNER2(sourceINNER2))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByValOutINNER2.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateINNER2(sourceINNER2, cloneINNER2, "MarshalStructAsParam_AsExpByValOutINNER2"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.InnerExplicitId:
+ InnerExplicit sourceInnerExplicit = new InnerExplicit();
+ sourceInnerExplicit.f1 = 1;
+ sourceInnerExplicit.f3 = "some string";
+ InnerExplicit cloneInnerExplicit = new InnerExplicit();
+ cloneInnerExplicit.f1 = 1;
+ cloneInnerExplicit.f3 = "some string";
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByValOutInnerExplicit...");
+ if (!MarshalStructAsParam_AsExpByValOutInnerExplicit(sourceInnerExplicit))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByValOutInnerExplicit.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateInnerExplicit(sourceInnerExplicit, cloneInnerExplicit, "MarshalStructAsParam_AsExpByValOutInnerExplicit"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.InnerArrayExplicitId:
+ InnerArrayExplicit sourceInnerArrayExplicit = Helper.NewInnerArrayExplicit(1, 1.0F, "some string1", "some string2");
+ InnerArrayExplicit cloneInnerArrayExplicit = Helper.NewInnerArrayExplicit(1, 1.0F, "some string1", "some string2");
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByValOutInnerArrayExplicit...");
+ if (!MarshalStructAsParam_AsExpByValOutInnerArrayExplicit(sourceInnerArrayExplicit))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByValOutInnerArrayExplicit.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateInnerArrayExplicit(sourceInnerArrayExplicit, cloneInnerArrayExplicit, "MarshalStructAsParam_AsExpByValOutInnerArrayExplicit"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.OUTER3Id:
+ OUTER3 sourceOUTER3 = Helper.NewOUTER3(1, 1.0F, "some string", "some string");
+ OUTER3 cloneOUTER3 = Helper.NewOUTER3(1, 1.0F, "some string", "some string");
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByValOutOUTER3...");
+ if (!MarshalStructAsParam_AsExpByValOutOUTER3(sourceOUTER3))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByValOutOUTER3.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateOUTER3(sourceOUTER3, cloneOUTER3, "MarshalStructAsParam_AsExpByValOutOUTER3"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.UId:
+ U sourceU = Helper.NewU(Int32.MinValue, UInt32.MaxValue, new IntPtr(-32), new UIntPtr(32), short.MinValue, ushort.MaxValue, byte.MinValue, sbyte.MaxValue, long.MinValue, ulong.MaxValue, 32.0F, 3.2);
+ U cloneU = Helper.NewU(Int32.MinValue, UInt32.MaxValue, new IntPtr(-32), new UIntPtr(32), short.MinValue, ushort.MaxValue, byte.MinValue, sbyte.MaxValue, long.MinValue, ulong.MaxValue, 32.0F, 3.2);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByValOutU...");
+ if (!MarshalStructAsParam_AsExpByValOutU(sourceU))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByValOutU.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateU(sourceU, cloneU, "MarshalStructAsParam_AsExpByValOutU"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.ByteStructPack2ExplicitId:
+ ByteStructPack2Explicit source_bspe = Helper.NewByteStructPack2Explicit(32, 32);
+ ByteStructPack2Explicit clone_bspe = Helper.NewByteStructPack2Explicit(32, 32);
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByValOutByteStructPack2Explicit...");
+ if (!MarshalStructAsParam_AsExpByValOutByteStructPack2Explicit(source_bspe))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByValOutByteStructPack2Explicit.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateByteStructPack2Explicit(source_bspe, clone_bspe, "MarshalStructAsParam_AsExpByValOutByteStructPack2Explicit"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.ShortStructPack4ExplicitId:
+ ShortStructPack4Explicit source_sspe = Helper.NewShortStructPack4Explicit(32, 32);
+ ShortStructPack4Explicit clone_sspe = Helper.NewShortStructPack4Explicit(32, 32);
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByValOutShortStructPack4Explicit...");
+ if (!MarshalStructAsParam_AsExpByValOutShortStructPack4Explicit(source_sspe))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByValOutShortStructPack4Explicit.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateShortStructPack4Explicit(source_sspe, clone_sspe, "MarshalStructAsParam_AsExpByValOutShortStructPack4Explicit"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.IntStructPack8ExplicitId:
+ IntStructPack8Explicit source_ispe = Helper.NewIntStructPack8Explicit(32, 32);
+ IntStructPack8Explicit clone_ispe = Helper.NewIntStructPack8Explicit(32, 32);
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByValOutIntStructPack8Explicit...");
+ if (!MarshalStructAsParam_AsExpByValOutIntStructPack8Explicit(source_ispe))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByValOutIntStructPack8Explicit.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateIntStructPack8Explicit(source_ispe, clone_ispe, "MarshalStructAsParam_AsExpByValOutIntStructPack8Explicit"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.LongStructPack16ExplicitId:
+ LongStructPack16Explicit sourceLongStructPack16Explicit = Helper.NewLongStructPack16Explicit(32, 32);
+ LongStructPack16Explicit cloneLongStructPack16Explicit = Helper.NewLongStructPack16Explicit(32, 32);
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByValOutLongStructPack16Explicit...");
+ if (!MarshalStructAsParam_AsExpByValOutLongStructPack16Explicit(sourceLongStructPack16Explicit))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByValOutLongStructPack16Explicit.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateLongStructPack16Explicit(sourceLongStructPack16Explicit, cloneLongStructPack16Explicit, "MarshalStructAsParam_AsExpByValOutLongStructPack16Explicit"))
+ {
+ failures++;
+ }
+ break;
+ default:
+ Console.WriteLine("\tThere is not the struct id");
+ failures++;
+ break;
+ }
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine("Unexpected Exception:" + e.ToString());
+ failures++;
+ }
+ }
+
+ [SecuritySafeCritical]
+ private static void MarshalStructAsParam_AsExpByRefOut(StructID id)
+ {
+ try
+ {
+ switch (id)
+ {
+ case StructID.INNER2Id:
+ INNER2 sourceINNER2 = Helper.NewINNER2(1, 1.0F, "some string");
+ INNER2 changeINNER2 = Helper.NewINNER2(77, 77.0F, "changed string");
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByRefOutINNER2...");
+ if (!MarshalStructAsParam_AsExpByRefOutINNER2(out sourceINNER2))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByRefOutINNER2.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateINNER2(sourceINNER2, changeINNER2, "MarshalStructAsParam_AsExpByRefOutINNER2"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.InnerExplicitId:
+ InnerExplicit sourceInnerExplicit = new InnerExplicit();
+ sourceInnerExplicit.f1 = 1;
+ sourceInnerExplicit.f3 = "some string";
+ InnerExplicit changeInnerExplicit = new InnerExplicit();
+ changeInnerExplicit.f1 = 77;
+ changeInnerExplicit.f3 = "changed string";
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByRefOutInnerExplicit...");
+ if (!MarshalStructAsParam_AsExpByRefOutInnerExplicit(out sourceInnerExplicit))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByRefOutInnerExplicit.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateInnerExplicit(sourceInnerExplicit, changeInnerExplicit, "MarshalStructAsParam_AsExpByRefOutInnerExplicit"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.InnerArrayExplicitId:
+ InnerArrayExplicit sourceInnerArrayExplicit = Helper.NewInnerArrayExplicit(1, 1.0F, "some string1", "some string2");
+ InnerArrayExplicit changeInnerArrayExplicit = Helper.NewInnerArrayExplicit(77, 77.0F, "change string1", "change string2");
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByRefOutInnerArrayExplicit...");
+ if (!MarshalStructAsParam_AsExpByRefOutInnerArrayExplicit(out sourceInnerArrayExplicit))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByRefOutInnerArrayExplicit.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateInnerArrayExplicit(sourceInnerArrayExplicit, changeInnerArrayExplicit, "MarshalStructAsParam_AsExpByRefOutInnerArrayExplicit"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.OUTER3Id:
+ OUTER3 sourceOUTER3 = Helper.NewOUTER3(1, 1.0F, "some string", "some string");
+ OUTER3 changeOUTER3 = Helper.NewOUTER3(77, 77.0F, "changed string", "changed string");
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByRefOutOUTER3...");
+ if (!MarshalStructAsParam_AsExpByRefOutOUTER3(out sourceOUTER3))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByRefOutOUTER3.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateOUTER3(sourceOUTER3, changeOUTER3, "MarshalStructAsParam_AsExpByRefOutOUTER3"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.UId:
+ U sourceU = Helper.NewU(Int32.MinValue, UInt32.MaxValue, new IntPtr(-32), new UIntPtr(32), short.MinValue, ushort.MaxValue, byte.MinValue, sbyte.MaxValue, long.MinValue, ulong.MaxValue, 32.0F, 3.2);
+ U changeU = Helper.NewU(Int32.MaxValue, UInt32.MinValue, new IntPtr(-64), new UIntPtr(64), short.MaxValue, ushort.MinValue, byte.MaxValue, sbyte.MinValue, long.MaxValue, ulong.MinValue, 64.0F, 6.4);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByRefOutU...");
+ if (!MarshalStructAsParam_AsExpByRefOutU(out sourceU))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByRefOutU.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateU(sourceU, changeU, "MarshalStructAsParam_AsExpByRefOutU"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.ByteStructPack2ExplicitId:
+ ByteStructPack2Explicit source_bspe = Helper.NewByteStructPack2Explicit(32, 32);
+ ByteStructPack2Explicit change_bspe = Helper.NewByteStructPack2Explicit(64, 64);
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByRefOutByteStructPack2Explicit...");
+ if (!MarshalStructAsParam_AsExpByRefOutByteStructPack2Explicit(out source_bspe))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByRefOutByteStructPack2Explicit.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateByteStructPack2Explicit(source_bspe, change_bspe, "MarshalStructAsParam_AsExpByRefOutByteStructPack2Explicit"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.ShortStructPack4ExplicitId:
+ ShortStructPack4Explicit source_sspe = Helper.NewShortStructPack4Explicit(32, 32);
+ ShortStructPack4Explicit change_sspe = Helper.NewShortStructPack4Explicit(64, 64);
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByRefOutShortStructPack4Explicit...");
+ if (!MarshalStructAsParam_AsExpByRefOutShortStructPack4Explicit(out source_sspe))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByRefOutShortStructPack4Explicit.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateShortStructPack4Explicit(source_sspe, change_sspe, "MarshalStructAsParam_AsExpByRefOutShortStructPack4Explicit"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.IntStructPack8ExplicitId:
+ IntStructPack8Explicit source_ispe = Helper.NewIntStructPack8Explicit(32, 32);
+ IntStructPack8Explicit change_ispe = Helper.NewIntStructPack8Explicit(64, 64);
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByRefOutIntStructPack8Explicit...");
+ if (!MarshalStructAsParam_AsExpByRefOutIntStructPack8Explicit(out source_ispe))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByRefOutIntStructPack8Explicit.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateIntStructPack8Explicit(source_ispe, change_ispe, "MarshalStructAsParam_AsExpByRefOutIntStructPack8Explicit"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.LongStructPack16ExplicitId:
+ LongStructPack16Explicit sourceLongStructPack16Explicit = Helper.NewLongStructPack16Explicit(32, 32);
+ LongStructPack16Explicit changeLongStructPack16Explicit = Helper.NewLongStructPack16Explicit(64, 64);
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByRefOutLongStructPack16Explicit...");
+ if (!MarshalStructAsParam_AsExpByRefOutLongStructPack16Explicit(out sourceLongStructPack16Explicit))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByRefOutLongStructPack16Explicit.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateLongStructPack16Explicit(sourceLongStructPack16Explicit, changeLongStructPack16Explicit, "MarshalStructAsParam_AsExpByRefOutLongStructPack16Explicit"))
+ {
+ failures++;
+ }
+ break;
+ default:
+ Console.WriteLine("\tThere is not the struct id");
+ failures++;
+ break;
+ }
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine("Unexpected Exception:" + e.ToString());
+ failures++;
+ }
+ }
+
+ [SecuritySafeCritical]
+ private static void MarshalStructAsParam_AsExpByValInOut(StructID id)
+ {
+ try
+ {
+ switch (id)
+ {
+ case StructID.INNER2Id:
+ INNER2 sourceINNER2 = Helper.NewINNER2(1, 1.0F, "some string");
+ INNER2 cloneINNER2 = Helper.NewINNER2(1, 1.0F, "some string");
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByValInOutINNER2...");
+ if (!MarshalStructAsParam_AsExpByValInOutINNER2(sourceINNER2))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByValInOutINNER2.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateINNER2(sourceINNER2, cloneINNER2, "MarshalStructAsParam_AsExpByValInOutINNER2"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.InnerExplicitId:
+ InnerExplicit sourceInnerExplicit = new InnerExplicit();
+ sourceInnerExplicit.f1 = 1;
+ sourceInnerExplicit.f3 = "some string";
+ InnerExplicit cloneInnerExplicit = new InnerExplicit();
+ cloneInnerExplicit.f1 = 1;
+ cloneInnerExplicit.f3 = "some string";
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByValInOutInnerExplicit...");
+ if (!MarshalStructAsParam_AsExpByValInOutInnerExplicit(sourceInnerExplicit))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByValInOutInnerExplicit.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateInnerExplicit(sourceInnerExplicit, cloneInnerExplicit, "MarshalStructAsParam_AsExpByValInOutInnerExplicit"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.InnerArrayExplicitId:
+ InnerArrayExplicit sourceInnerArrayExplicit = Helper.NewInnerArrayExplicit(1, 1.0F, "some string1", "some string2");
+ InnerArrayExplicit cloneInnerArrayExplicit = Helper.NewInnerArrayExplicit(1, 1.0F, "some string1", "some string2");
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByValInOutInnerArrayExplicit...");
+ if (!MarshalStructAsParam_AsExpByValInOutInnerArrayExplicit(sourceInnerArrayExplicit))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByValInOutInnerArrayExplicit.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateInnerArrayExplicit(sourceInnerArrayExplicit, cloneInnerArrayExplicit, "MarshalStructAsParam_AsExpByValInOutInnerArrayExplicit"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.OUTER3Id:
+ OUTER3 sourceOUTER3 = Helper.NewOUTER3(1, 1.0F, "some string", "some string");
+ OUTER3 cloneOUTER3 = Helper.NewOUTER3(1, 1.0F, "some string", "some string");
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByValInOutOUTER3...");
+ if (!MarshalStructAsParam_AsExpByValInOutOUTER3(sourceOUTER3))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByValInOutOUTER3.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateOUTER3(sourceOUTER3, cloneOUTER3, "MarshalStructAsParam_AsExpByValInOutOUTER3"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.UId:
+ U sourceU = Helper.NewU(Int32.MinValue, UInt32.MaxValue, new IntPtr(-32), new UIntPtr(32), short.MinValue, ushort.MaxValue, byte.MinValue, sbyte.MaxValue, long.MinValue, ulong.MaxValue, 32.0F, 3.2);
+ U cloneU = Helper.NewU(Int32.MinValue, UInt32.MaxValue, new IntPtr(-32), new UIntPtr(32), short.MinValue, ushort.MaxValue, byte.MinValue, sbyte.MaxValue, long.MinValue, ulong.MaxValue, 32.0F, 3.2);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByValInOutU...");
+ if (!MarshalStructAsParam_AsExpByValInOutU(sourceU))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByValInOutU.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateU(sourceU, cloneU, "MarshalStructAsParam_AsExpByValInOutU"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.ByteStructPack2ExplicitId:
+ ByteStructPack2Explicit source_bspe = Helper.NewByteStructPack2Explicit(32, 32);
+ ByteStructPack2Explicit clone_bspe = Helper.NewByteStructPack2Explicit(32, 32);
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByValInOutByteStructPack2Explicit...");
+ if (!MarshalStructAsParam_AsExpByValInOutByteStructPack2Explicit(source_bspe))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByValInOutByteStructPack2Explicit.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateByteStructPack2Explicit(source_bspe, clone_bspe, "MarshalStructAsParam_AsExpByValInOutByteStructPack2Explicit"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.ShortStructPack4ExplicitId:
+ ShortStructPack4Explicit source_sspe = Helper.NewShortStructPack4Explicit(32, 32);
+ ShortStructPack4Explicit clone_sspe = Helper.NewShortStructPack4Explicit(32, 32);
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByValInOutShortStructPack4Explicit...");
+ if (!MarshalStructAsParam_AsExpByValInOutShortStructPack4Explicit(source_sspe))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByValInOutShortStructPack4Explicit.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateShortStructPack4Explicit(source_sspe, clone_sspe, "MarshalStructAsParam_AsExpByValInOutShortStructPack4Explicit"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.IntStructPack8ExplicitId:
+ IntStructPack8Explicit source_ispe = Helper.NewIntStructPack8Explicit(32, 32);
+ IntStructPack8Explicit clone_ispe = Helper.NewIntStructPack8Explicit(32, 32);
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByValInOutIntStructPack8Explicit...");
+ if (!MarshalStructAsParam_AsExpByValInOutIntStructPack8Explicit(source_ispe))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByValInOutIntStructPack8Explicit.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateIntStructPack8Explicit(source_ispe, clone_ispe, "MarshalStructAsParam_AsExpByValInOutIntStructPack8Explicit"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.LongStructPack16ExplicitId:
+ LongStructPack16Explicit sourceLongStructPack16Explicit = Helper.NewLongStructPack16Explicit(32, 32);
+ LongStructPack16Explicit cloneLongStructPack16Explicit = Helper.NewLongStructPack16Explicit(32, 32);
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByValInOutLongStructPack16Explicit...");
+ if (!MarshalStructAsParam_AsExpByValInOutLongStructPack16Explicit(sourceLongStructPack16Explicit))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByValInOutLongStructPack16Explicit.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateLongStructPack16Explicit(sourceLongStructPack16Explicit, cloneLongStructPack16Explicit, "MarshalStructAsParam_AsExpByValInOutLongStructPack16Explicit"))
+ {
+ failures++;
+ }
+ break;
+ default:
+ Console.WriteLine("\tThere is not the struct id");
+ failures++;
+ break;
+ }
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine("Unexpected Exception:" + e.ToString());
+ failures++;
+ }
+ }
+
+ [SecuritySafeCritical]
+ private static void MarshalStructAsParam_AsExpByRefInOut(StructID id)
+ {
+ try
+ {
+ switch (id)
+ {
+ case StructID.INNER2Id:
+ INNER2 sourceINNER2 = Helper.NewINNER2(1, 1.0F, "some string");
+ INNER2 changeINNER2 = Helper.NewINNER2(77, 77.0F, "changed string");
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByRefInOutINNER2...");
+ if (!MarshalStructAsParam_AsExpByRefInOutINNER2(ref sourceINNER2))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByRefInOutINNER2.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateINNER2(sourceINNER2, changeINNER2, "MarshalStructAsParam_AsExpByRefInOutINNER2"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.InnerExplicitId:
+ InnerExplicit sourceInnerExplicit = new InnerExplicit();
+ sourceInnerExplicit.f1 = 1;
+ sourceInnerExplicit.f3 = "some string";
+ InnerExplicit changeInnerExplicit = new InnerExplicit();
+ changeInnerExplicit.f1 = 77;
+ changeInnerExplicit.f3 = "changed string";
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByRefInOutInnerExplicit...");
+ if (!MarshalStructAsParam_AsExpByRefInOutInnerExplicit(ref sourceInnerExplicit))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByRefInOutInnerExplicit.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateInnerExplicit(sourceInnerExplicit, changeInnerExplicit, "MarshalStructAsParam_AsExpByRefInOutInnerExplicit"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.InnerArrayExplicitId:
+ InnerArrayExplicit sourceInnerArrayExplicit = Helper.NewInnerArrayExplicit(1, 1.0F, "some string1", "some string2");
+ InnerArrayExplicit changeInnerArrayExplicit = Helper.NewInnerArrayExplicit(77, 77.0F, "change string1", "change string2");
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByRefInOutInnerArrayExplicit...");
+ if (!MarshalStructAsParam_AsExpByRefInOutInnerArrayExplicit(ref sourceInnerArrayExplicit))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByRefInOutInnerArrayExplicit.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateInnerArrayExplicit(sourceInnerArrayExplicit, changeInnerArrayExplicit, "MarshalStructAsParam_AsExpByRefInOutInnerArrayExplicit"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.OUTER3Id:
+ OUTER3 sourceOUTER3 = Helper.NewOUTER3(1, 1.0F, "some string", "some string");
+ OUTER3 changeOUTER3 = Helper.NewOUTER3(77, 77.0F, "changed string", "changed string");
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByRefInOutOUTER3...");
+ if (!MarshalStructAsParam_AsExpByRefInOutOUTER3(ref sourceOUTER3))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByRefInOutOUTER3.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateOUTER3(sourceOUTER3, changeOUTER3, "MarshalStructAsParam_AsExpByRefInOutOUTER3"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.UId:
+ U sourceU = Helper.NewU(Int32.MinValue, UInt32.MaxValue, new IntPtr(-32), new UIntPtr(32), short.MinValue, ushort.MaxValue, byte.MinValue, sbyte.MaxValue, long.MinValue, ulong.MaxValue, 32.0F, 3.2);
+ U changeU = Helper.NewU(Int32.MaxValue, UInt32.MinValue, new IntPtr(-64), new UIntPtr(64), short.MaxValue, ushort.MinValue, byte.MaxValue, sbyte.MinValue, long.MaxValue, ulong.MinValue, 64.0F, 6.4);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByRefInOutU...");
+ if (!MarshalStructAsParam_AsExpByRefInOutU(ref sourceU))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByRefInOutU.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateU(sourceU, changeU, "MarshalStructAsParam_AsExpByRefInOutU"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.ByteStructPack2ExplicitId:
+ ByteStructPack2Explicit source_bspe = Helper.NewByteStructPack2Explicit(32, 32);
+ ByteStructPack2Explicit change_bspe = Helper.NewByteStructPack2Explicit(64, 64);
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByRefInOutByteStructPack2Explicit...");
+ if (!MarshalStructAsParam_AsExpByRefInOutByteStructPack2Explicit(ref source_bspe))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByRefInOutByteStructPack2Explicit.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateByteStructPack2Explicit(source_bspe, change_bspe, "MarshalStructAsParam_AsExpByRefInOutByteStructPack2Explicit"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.ShortStructPack4ExplicitId:
+ ShortStructPack4Explicit source_sspe = Helper.NewShortStructPack4Explicit(32, 32);
+ ShortStructPack4Explicit change_sspe = Helper.NewShortStructPack4Explicit(64, 64);
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByRefInOutShortStructPack4Explicit...");
+ if (!MarshalStructAsParam_AsExpByRefInOutShortStructPack4Explicit(ref source_sspe))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByRefInOutShortStructPack4Explicit.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateShortStructPack4Explicit(source_sspe, change_sspe, "MarshalStructAsParam_AsExpByRefInOutShortStructPack4Explicit"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.IntStructPack8ExplicitId:
+ IntStructPack8Explicit source_ispe = Helper.NewIntStructPack8Explicit(32, 32);
+ IntStructPack8Explicit change_ispe = Helper.NewIntStructPack8Explicit(64, 64);
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByRefInOutIntStructPack8Explicit...");
+ if (!MarshalStructAsParam_AsExpByRefInOutIntStructPack8Explicit(ref source_ispe))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByRefInOutIntStructPack8Explicit.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateIntStructPack8Explicit(source_ispe, change_ispe, "MarshalStructAsParam_AsExpByRefInOutIntStructPack8Explicit"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.LongStructPack16ExplicitId:
+ LongStructPack16Explicit sourceLongStructPack16Explicit = Helper.NewLongStructPack16Explicit(32, 32);
+ LongStructPack16Explicit changeLongStructPack16Explicit = Helper.NewLongStructPack16Explicit(64, 64);
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsExpByRefInOutLongStructPack16Explicit...");
+ if (!MarshalStructAsParam_AsExpByRefInOutLongStructPack16Explicit(ref sourceLongStructPack16Explicit))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsExpByRefInOutLongStructPack16Explicit.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateLongStructPack16Explicit(sourceLongStructPack16Explicit, changeLongStructPack16Explicit, "MarshalStructAsParam_AsExpByRefInOutLongStructPack16Explicit"))
+ {
+ failures++;
+ }
+ break;
+ default:
+ Console.WriteLine("\tThere is not the struct id");
+ failures++;
+ break;
+ }
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine("Unexpected Exception:" + e.ToString());
+ failures++;
+ }
+ }
+ #endregion
+
+ [SecuritySafeCritical]
+ private static void RunMarshalStructAsParamAsExpByVal()
+ {
+ Console.WriteLine("\nVerify marshal Explicit layout struct as param as ByVal");
+ MarshalStructAsParam_AsExpByVal(StructID.INNER2Id);
+ MarshalStructAsParam_AsExpByVal(StructID.InnerExplicitId);
+ MarshalStructAsParam_AsExpByVal(StructID.InnerArrayExplicitId);
+ MarshalStructAsParam_AsExpByVal(StructID.OUTER3Id);
+ MarshalStructAsParam_AsExpByVal(StructID.UId);
+ MarshalStructAsParam_AsExpByVal(StructID.ByteStructPack2ExplicitId);
+ MarshalStructAsParam_AsExpByVal(StructID.ShortStructPack4ExplicitId);
+ MarshalStructAsParam_AsExpByVal(StructID.IntStructPack8ExplicitId);
+ MarshalStructAsParam_AsExpByVal(StructID.LongStructPack16ExplicitId);
+ }
+
+ [SecuritySafeCritical]
+ private static void RunMarshalStructAsParamAsExpByRef()
+ {
+ Console.WriteLine("\nVerify marshal Explicit layout struct as param as ByRef");
+ MarshalStructAsParam_AsExpByRef(StructID.INNER2Id);
+ MarshalStructAsParam_AsExpByRef(StructID.InnerExplicitId);
+ MarshalStructAsParam_AsExpByRef(StructID.InnerArrayExplicitId);
+ MarshalStructAsParam_AsExpByRef(StructID.OUTER3Id);
+ MarshalStructAsParam_AsExpByRef(StructID.UId);
+ MarshalStructAsParam_AsExpByRef(StructID.ByteStructPack2ExplicitId);
+ MarshalStructAsParam_AsExpByRef(StructID.ShortStructPack4ExplicitId);
+ MarshalStructAsParam_AsExpByRef(StructID.IntStructPack8ExplicitId);
+ MarshalStructAsParam_AsExpByRef(StructID.LongStructPack16ExplicitId);
+ }
+
+ [SecuritySafeCritical]
+ private static void RunMarshalStructAsParamAsExpByValIn()
+ {
+ Console.WriteLine("\nVerify marshal Explicit layout struct as param as ByValIn");
+ MarshalStructAsParam_AsExpByValIn(StructID.INNER2Id);
+ MarshalStructAsParam_AsExpByValIn(StructID.InnerExplicitId);
+ MarshalStructAsParam_AsExpByValIn(StructID.InnerArrayExplicitId);
+ MarshalStructAsParam_AsExpByValIn(StructID.OUTER3Id);
+ MarshalStructAsParam_AsExpByValIn(StructID.UId);
+ MarshalStructAsParam_AsExpByValIn(StructID.ByteStructPack2ExplicitId);
+ MarshalStructAsParam_AsExpByValIn(StructID.ShortStructPack4ExplicitId);
+ MarshalStructAsParam_AsExpByValIn(StructID.IntStructPack8ExplicitId);
+ MarshalStructAsParam_AsExpByValIn(StructID.LongStructPack16ExplicitId);
+ }
+
+ [SecuritySafeCritical]
+ private static void RunMarshalStructAsParamAsExpByRefIn()
+ {
+ Console.WriteLine("\nVerify marshal Explicit layout struct as param as ByRefIn");
+ MarshalStructAsParam_AsExpByRefIn(StructID.INNER2Id);
+ MarshalStructAsParam_AsExpByRefIn(StructID.InnerExplicitId);
+ MarshalStructAsParam_AsExpByRefIn(StructID.InnerArrayExplicitId);
+ MarshalStructAsParam_AsExpByRefIn(StructID.OUTER3Id);
+ MarshalStructAsParam_AsExpByRefIn(StructID.UId);
+ MarshalStructAsParam_AsExpByRefIn(StructID.ByteStructPack2ExplicitId);
+ MarshalStructAsParam_AsExpByRefIn(StructID.ShortStructPack4ExplicitId);
+ MarshalStructAsParam_AsExpByRefIn(StructID.IntStructPack8ExplicitId);
+ MarshalStructAsParam_AsExpByRefIn(StructID.LongStructPack16ExplicitId);
+ }
+
+ [SecuritySafeCritical]
+ private static void RunMarshalStructAsParamAsExpByValOut()
+ {
+ Console.WriteLine("\nVerify marshal Explicit layout struct as param as ByValOut");
+ MarshalStructAsParam_AsExpByValOut(StructID.INNER2Id);
+ MarshalStructAsParam_AsExpByValOut(StructID.InnerExplicitId);
+ MarshalStructAsParam_AsExpByValOut(StructID.InnerArrayExplicitId);
+ MarshalStructAsParam_AsExpByValOut(StructID.OUTER3Id);
+ MarshalStructAsParam_AsExpByValOut(StructID.UId);
+ MarshalStructAsParam_AsExpByValOut(StructID.ByteStructPack2ExplicitId);
+ MarshalStructAsParam_AsExpByValOut(StructID.ShortStructPack4ExplicitId);
+ MarshalStructAsParam_AsExpByValOut(StructID.IntStructPack8ExplicitId);
+ MarshalStructAsParam_AsExpByValOut(StructID.LongStructPack16ExplicitId);
+ }
+
+ [SecuritySafeCritical]
+ private static void RunMarshalStructAsParamAsExpByRefOut()
+ {
+ Console.WriteLine("\nVerify marshal Explicit layout struct as param as ByRefOut");
+ MarshalStructAsParam_AsExpByRefOut(StructID.INNER2Id);
+ MarshalStructAsParam_AsExpByRefOut(StructID.InnerExplicitId);
+ MarshalStructAsParam_AsExpByRefOut(StructID.InnerArrayExplicitId);
+ MarshalStructAsParam_AsExpByRefOut(StructID.OUTER3Id);
+ MarshalStructAsParam_AsExpByRefOut(StructID.UId);
+ MarshalStructAsParam_AsExpByRefOut(StructID.ByteStructPack2ExplicitId);
+ MarshalStructAsParam_AsExpByRefOut(StructID.ShortStructPack4ExplicitId);
+ MarshalStructAsParam_AsExpByRefOut(StructID.IntStructPack8ExplicitId);
+ MarshalStructAsParam_AsExpByRefOut(StructID.LongStructPack16ExplicitId);
+ }
+
+ [SecuritySafeCritical]
+ private static void RunMarshalStructAsParamAsExpByValInOut()
+ {
+ Console.WriteLine("\nVerify marshal Explicit layout struct as param as ByValInOut");
+ MarshalStructAsParam_AsExpByValInOut(StructID.INNER2Id);
+ MarshalStructAsParam_AsExpByValInOut(StructID.InnerExplicitId);
+ MarshalStructAsParam_AsExpByValInOut(StructID.InnerArrayExplicitId);
+ MarshalStructAsParam_AsExpByValInOut(StructID.OUTER3Id);
+ MarshalStructAsParam_AsExpByValInOut(StructID.UId);
+ MarshalStructAsParam_AsExpByValInOut(StructID.ByteStructPack2ExplicitId);
+ MarshalStructAsParam_AsExpByValInOut(StructID.ShortStructPack4ExplicitId);
+ MarshalStructAsParam_AsExpByValInOut(StructID.IntStructPack8ExplicitId);
+ MarshalStructAsParam_AsExpByValInOut(StructID.LongStructPack16ExplicitId);
+ }
+
+ [SecuritySafeCritical]
+ private static void RunMarshalStructAsParamAsExpByRefInOut()
+ {
+ Console.WriteLine("\nVerify marshal Explicit layout struct as param as ByRefInOut");
+ MarshalStructAsParam_AsExpByRefInOut(StructID.INNER2Id);
+ MarshalStructAsParam_AsExpByRefInOut(StructID.InnerExplicitId);
+ MarshalStructAsParam_AsExpByRefInOut(StructID.InnerArrayExplicitId);
+ MarshalStructAsParam_AsExpByRefInOut(StructID.OUTER3Id);
+ MarshalStructAsParam_AsExpByRefInOut(StructID.UId);
+ MarshalStructAsParam_AsExpByRefInOut(StructID.ByteStructPack2ExplicitId);
+ MarshalStructAsParam_AsExpByRefInOut(StructID.ShortStructPack4ExplicitId);
+ MarshalStructAsParam_AsExpByRefInOut(StructID.IntStructPack8ExplicitId);
+ MarshalStructAsParam_AsExpByRefInOut(StructID.LongStructPack16ExplicitId);
+ }
+} \ No newline at end of file
diff --git a/tests/src/Interop/StructMarshalling/PInvoke/MarshalStructAsLayoutExp.csproj b/tests/src/Interop/StructMarshalling/PInvoke/MarshalStructAsLayoutExp.csproj
new file mode 100644
index 0000000000..a7da67fb29
--- /dev/null
+++ b/tests/src/Interop/StructMarshalling/PInvoke/MarshalStructAsLayoutExp.csproj
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>MarshalStructAsLayoutExp</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{F1E66554-8C8E-4141-85CF-D0CD6A0CD0B0}</ProjectGuid>
+ <OutputType>exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ <DefineConstants>$(DefineConstants);STATIC</DefineConstants>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="MarshalStructAsLayoutExp.cs" />
+ <Compile Include="Struct.cs" />
+ <Compile Include="Helper.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="project.json" />
+ </ItemGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\..\..\Common\CoreCLRTestLibrary\CoreCLRTestLibrary.csproj">
+ <Project>{c8c0dc74-fac4-45b1-81fe-70c4808366e0}</Project>
+ <Name>CoreCLRTestLibrary</Name>
+ </ProjectReference>
+ <ProjectReference Include="CMakeLists.txt">
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+</Project> \ No newline at end of file
diff --git a/tests/src/Interop/StructMarshalling/PInvoke/MarshalStructAsLayoutSeq.cs b/tests/src/Interop/StructMarshalling/PInvoke/MarshalStructAsLayoutSeq.cs
new file mode 100644
index 0000000000..51b6db2f08
--- /dev/null
+++ b/tests/src/Interop/StructMarshalling/PInvoke/MarshalStructAsLayoutSeq.cs
@@ -0,0 +1,2271 @@
+using System;
+using System.Runtime.InteropServices;
+using System.Security;
+
+public class Managed
+{
+ static int failures = 0;
+ private static string strOne;
+ private static string strTwo;
+
+ enum StructID
+ {
+ InnerSequentialId,
+ InnerArraySequentialId,
+ CharSetAnsiSequentialId,
+ CharSetUnicodeSequentialId,
+ NumberSequentialId,
+ S3Id,
+ S5Id,
+ StringStructSequentialAnsiId,
+ StringStructSequentialUnicodeId,
+ S8Id,
+ S9Id,
+ IncludeOuterIntergerStructSequentialId,
+ S11Id
+ }
+
+ private static void InitialArray(int[] iarr, int[] icarr)
+ {
+ for (int i = 0; i < iarr.Length; i++)
+ {
+ iarr[i] = i;
+ }
+
+ for (int i = 1; i < icarr.Length + 1; i++)
+ {
+ icarr[i - 1] = i;
+ }
+ }
+
+ [SecuritySafeCritical]
+ private static void testMethod(S9 s9)
+ {
+ Console.WriteLine("\tThe first field of s9 is:", s9.i32);
+ }
+
+ [SecuritySafeCritical]
+ public static int Main()
+ {
+ RunMarshalSeqStructAsParamByVal();
+ RunMarshalSeqStructAsParamByRef();
+ RunMarshalSeqStructAsParamByValIn();
+ RunMarshalSeqStructAsParamByRefIn();
+ RunMarshalSeqStructAsParamByValOut();
+ RunMarshalSeqStructAsParamByRefOut();
+ RunMarshalSeqStructAsParamByValInOut();
+ RunMarshalSeqStructAsParamByRefInOut();
+
+ if (failures > 0)
+ {
+ Console.WriteLine("\nTEST FAILED!");
+ return 101;
+ }
+ else
+ {
+ Console.WriteLine("\nTEST PASSED!");
+ return 100;
+ }
+ }
+
+ #region Struct with Layout Sequential scenario1
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByVal(InnerSequential str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByRef(ref InnerSequential str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsSeqByVal")]
+ static extern bool MarshalStructAsParam_AsSeqByValIn([In] InnerSequential str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByRefIn([In] ref InnerSequential str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByValOut([Out] InnerSequential str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByRefOut(out InnerSequential str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsSeqByVal")]
+ static extern bool MarshalStructAsParam_AsSeqByValInOut([In, Out] InnerSequential str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsSeqByRef")]
+ static extern bool MarshalStructAsParam_AsSeqByRefInOut([In, Out] ref InnerSequential str1);
+ #endregion
+ #region Struct with Layout Sequential scenario2
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByVal2(InnerArraySequential str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByRef2(ref InnerArraySequential str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsSeqByVal2")]
+ static extern bool MarshalStructAsParam_AsSeqByValIn2([In] InnerArraySequential str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByRefIn2([In] ref InnerArraySequential str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByValOut2([Out] InnerArraySequential str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByRefOut2(out InnerArraySequential str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsSeqByVal2")]
+ static extern bool MarshalStructAsParam_AsSeqByValInOut2([In, Out] InnerArraySequential str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsSeqByRef2")]
+ static extern bool MarshalStructAsParam_AsSeqByRefInOut2([In, Out] ref InnerArraySequential str1);
+ #endregion
+ #region Struct with Layout Sequential scenario3
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByVal3(CharSetAnsiSequential str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByRef3(ref CharSetAnsiSequential str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsSeqByVal3")]
+ static extern bool MarshalStructAsParam_AsSeqByValIn3([In] CharSetAnsiSequential str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByRefIn3([In] ref CharSetAnsiSequential str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByValOut3([Out] CharSetAnsiSequential str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByRefOut3(out CharSetAnsiSequential str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsSeqByVal3")]
+ static extern bool MarshalStructAsParam_AsSeqByValInOut3([In, Out] CharSetAnsiSequential str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsSeqByRef3")]
+ static extern bool MarshalStructAsParam_AsSeqByRefInOut3([In, Out] ref CharSetAnsiSequential str1);
+ #endregion
+ #region Struct with Layout Sequential scenario4
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByVal4(CharSetUnicodeSequential str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByRef4(ref CharSetUnicodeSequential str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsSeqByVal4")]
+ static extern bool MarshalStructAsParam_AsSeqByValIn4([In] CharSetUnicodeSequential str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByRefIn4([In] ref CharSetUnicodeSequential str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByValOut4([Out] CharSetUnicodeSequential str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByRefOut4(out CharSetUnicodeSequential str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsSeqByVal4")]
+ static extern bool MarshalStructAsParam_AsSeqByValInOut4([In, Out] CharSetUnicodeSequential str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsSeqByRef4")]
+ static extern bool MarshalStructAsParam_AsSeqByRefInOut4([In, Out] ref CharSetUnicodeSequential str1);
+ #endregion
+ #region Struct with Layout Sequential scenario5
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByVal6(NumberSequential str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByRef6(ref NumberSequential str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsSeqByVal6")]
+ static extern bool MarshalStructAsParam_AsSeqByValIn6([In] NumberSequential str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByRefIn6([In] ref NumberSequential str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByValOut6([Out] NumberSequential str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByRefOut6(out NumberSequential str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsSeqByVal6")]
+ static extern bool MarshalStructAsParam_AsSeqByValInOut6([In, Out] NumberSequential str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsSeqByRef6")]
+ static extern bool MarshalStructAsParam_AsSeqByRefInOut6([In, Out] ref NumberSequential str1);
+ #endregion
+ #region Struct with Layout Sequential scenario6
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByVal7(S3 str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByRef7(ref S3 str1);
+ [DllImport("MarshalStructAsParam",EntryPoint = "MarshalStructAsParam_AsSeqByVal7")]
+ static extern bool MarshalStructAsParam_AsSeqByValIn7([In] S3 str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByRefIn7([In] ref S3 str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByRefOut7(out S3 str1);
+ [DllImport("MarshalStructAsParam",EntryPoint = "MarshalStructAsParam_AsSeqByRef7")]
+ static extern bool MarshalStructAsParam_AsSeqByRefInOut7([In,Out] ref S3 str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByValOut7([Out] S3 str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsSeqByVal7")]
+ static extern bool MarshalStructAsParam_AsSeqByValInOut7([In, Out] S3 str1);
+ #endregion
+ #region Struct with Layout Sequential scenario7
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByVal8(S5 str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByRef8(ref S5 str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsSeqByVal8")]
+ static extern bool MarshalStructAsParam_AsSeqByValIn8([In] S5 str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByRefIn8([In] ref S5 str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsSeqByVal8")]
+ static extern bool MarshalStructAsParam_AsSeqByValOut8([Out] S5 str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByRefOut8(out S5 str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsSeqByVal8")]
+ static extern bool MarshalStructAsParam_AsSeqByValInOut8([In, Out] S5 str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsSeqByRef8")]
+ static extern bool MarshalStructAsParam_AsSeqByRefInOut8([In, Out] ref S5 str1);
+ #endregion
+ #region Struct with Layout Sequential scenario8
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByVal9(StringStructSequentialAnsi str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByRef9(ref StringStructSequentialAnsi str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsSeqByVal9")]
+ static extern bool MarshalStructAsParam_AsSeqByValIn9([In] StringStructSequentialAnsi str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByRefIn9([In] ref StringStructSequentialAnsi str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByValOut9([Out] StringStructSequentialAnsi str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByRefOut9(out StringStructSequentialAnsi str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsSeqByVal9")]
+ static extern bool MarshalStructAsParam_AsSeqByValInOut9([In, Out] StringStructSequentialAnsi str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsSeqByRef9")]
+ static extern bool MarshalStructAsParam_AsSeqByRefInOut9([In, Out] ref StringStructSequentialAnsi str1);
+ #endregion
+ #region Struct with Layout Sequential scenario9
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByVal10(StringStructSequentialUnicode str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByRef10(ref StringStructSequentialUnicode str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsSeqByVal10")]
+ static extern bool MarshalStructAsParam_AsSeqByValIn10([In] StringStructSequentialUnicode str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByRefIn10([In] ref StringStructSequentialUnicode str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByValOut10([Out] StringStructSequentialUnicode str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByRefOut10(out StringStructSequentialUnicode str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsSeqByVal10")]
+ static extern bool MarshalStructAsParam_AsSeqByValInOut10([In, Out] StringStructSequentialUnicode str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsSeqByRef10")]
+ static extern bool MarshalStructAsParam_AsSeqByRefInOut10([In, Out] ref StringStructSequentialUnicode str1);
+ #endregion
+ #region Struct with Layout Sequential scenario10
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByVal11(S8 str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByRef11(ref S8 str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsSeqByVal11")]
+ static extern bool MarshalStructAsParam_AsSeqByValIn11([In] S8 str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByRefIn11([In] ref S8 str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByValOut11([Out] S8 str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByRefOut11(out S8 str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsSeqByVal11")]
+ static extern bool MarshalStructAsParam_AsSeqByValInOut11([In, Out] S8 str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsSeqByRef11")]
+ static extern bool MarshalStructAsParam_AsSeqByRefInOut11([In, Out] ref S8 str1);
+ #endregion
+ #region Struct with Layout Sequential scenario11
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByVal12(S9 str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByRef12(ref S9 str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsSeqByVal12")]
+ static extern bool MarshalStructAsParam_AsSeqByValIn12(S9 str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsSeqByRef12")]
+ static extern bool MarshalStructAsParam_AsSeqByRefIn12([In] ref S9 str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByValOut12([Out] S9 str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByRefOut12(out S9 str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsSeqByVal12")]
+ static extern bool MarshalStructAsParam_AsSeqByValInOut12([In, Out] S9 str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsSeqByRef12")]
+ static extern bool MarshalStructAsParam_AsSeqByRefInOut12([In, Out] ref S9 str1);
+ #endregion
+ #region Struct with Layout Sequential scenario12
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByVal13(IncludeOuterIntergerStructSequential str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByRef13(ref IncludeOuterIntergerStructSequential str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsSeqByVal13")]
+ static extern bool MarshalStructAsParam_AsSeqByValIn13([In] IncludeOuterIntergerStructSequential str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByRefIn13([In] ref IncludeOuterIntergerStructSequential str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByValOut13([Out] IncludeOuterIntergerStructSequential str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByRefOut13(out IncludeOuterIntergerStructSequential str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsSeqByVal13")]
+ static extern bool MarshalStructAsParam_AsSeqByValInOut13([In, Out] IncludeOuterIntergerStructSequential str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsSeqByRef13")]
+ static extern bool MarshalStructAsParam_AsSeqByRefInOut13([In, Out] ref IncludeOuterIntergerStructSequential str1);
+ #endregion
+ #region Struct with Layout Sequential scenario13
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByVal14(S11 str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByRef14(ref S11 str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsSeqByVal14")]
+ static extern bool MarshalStructAsParam_AsSeqByValIn14([In] S11 str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByRefIn14([In] ref S11 str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsSeqByValOut14")]
+ static extern bool MarshalStructAsParam_AsSeqByValOut14([Out] S11 str1);
+ [DllImport("MarshalStructAsParam")]
+ static extern bool MarshalStructAsParam_AsSeqByRefOut14(out S11 str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsSeqByVal14")]
+ static extern bool MarshalStructAsParam_AsSeqByValInOut14([In, Out] S11 str1);
+ [DllImport("MarshalStructAsParam", EntryPoint = "MarshalStructAsParam_AsSeqByRef14")]
+ static extern bool MarshalStructAsParam_AsSeqByRefInOut14([In, Out] ref S11 str1);
+ #endregion
+
+ #region Marshal struct method in PInvoke
+ [SecuritySafeCritical]
+ unsafe private static void MarshalStructAsParam_AsSeqByVal(StructID id)
+ {
+ try
+ {
+ switch (id)
+ {
+ case StructID.InnerSequentialId:
+ InnerSequential source_is = Helper.NewInnerSequential(1, 1.0F, "some string");
+ InnerSequential clone_is = Helper.NewInnerSequential(1, 1.0F, "some string");
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByVal...");
+ if (!MarshalStructAsParam_AsSeqByVal(source_is))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByVal.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateInnerSequential(source_is, clone_is, "MarshalStructAsParam_AsSeqByVal"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.InnerArraySequentialId:
+ InnerArraySequential source_ias = Helper.NewInnerArraySequential(1, 1.0F, "some string");
+ InnerArraySequential clone_ias = Helper.NewInnerArraySequential(1, 1.0F, "some string");
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByVal2...");
+ if (!MarshalStructAsParam_AsSeqByVal2(source_ias))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByVal2.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateInnerArraySequential(source_ias, clone_ias, "MarshalStructAsParam_AsSeqByVal2"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.CharSetAnsiSequentialId:
+ CharSetAnsiSequential source_csas = Helper.NewCharSetAnsiSequential("some string", 'c');
+ CharSetAnsiSequential clone_csas = Helper.NewCharSetAnsiSequential("some string", 'c');
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByVal3...");
+ if (!MarshalStructAsParam_AsSeqByVal3(source_csas))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByVal3.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateCharSetAnsiSequential(source_csas, clone_csas, "MarshalStructAsParam_AsSeqByVal3"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.CharSetUnicodeSequentialId:
+ CharSetUnicodeSequential source_csus = Helper.NewCharSetUnicodeSequential("some string", 'c');
+ CharSetUnicodeSequential clone_csus = Helper.NewCharSetUnicodeSequential("some string", 'c');
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByVal4...");
+ if (!MarshalStructAsParam_AsSeqByVal4(source_csus))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByVal4.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateCharSetUnicodeSequential(source_csus, clone_csus, "MarshalStructAsParam_AsSeqByVal4"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.NumberSequentialId:
+ NumberSequential source_ns = Helper.NewNumberSequential(Int32.MinValue, UInt32.MaxValue, short.MinValue, ushort.MaxValue, byte.MinValue, sbyte.MaxValue, Int16.MinValue, UInt16.MaxValue, -1234567890, 1234567890, 32.0F, 3.2);
+ NumberSequential clone_ns = Helper.NewNumberSequential(Int32.MinValue, UInt32.MaxValue, short.MinValue, ushort.MaxValue, byte.MinValue, sbyte.MaxValue, Int16.MinValue, UInt16.MaxValue, -1234567890, 1234567890, 32.0F, 3.2);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByVal6...");
+ if (!MarshalStructAsParam_AsSeqByVal6(source_ns))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByVal6.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateNumberSequential(source_ns, clone_ns, "MarshalStructAsParam_AsSeqByVal6"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.S3Id:
+ int[] iarr = new int[256];
+ int[] icarr = new int[256];
+ InitialArray(iarr, icarr);
+
+ S3 sourceS3 = Helper.NewS3(true, "some string", iarr);
+ S3 cloneS3 = Helper.NewS3(true, "some string", iarr);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByVal7...");
+ if (!MarshalStructAsParam_AsSeqByVal7(sourceS3))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByVal7.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateS3(sourceS3, cloneS3, "MarshalStructAsParam_AsSeqByVal7"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.S5Id:
+ Enum1 enums = Enum1.e1;
+ Enum1 enumcl = Enum1.e1;
+
+ S5 sourceS5 = Helper.NewS5(32, "some string", enums);
+ S5 cloneS5 = Helper.NewS5(32, "some string", enumcl);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByVal8...");
+ if (!MarshalStructAsParam_AsSeqByVal8(sourceS5))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByVal8.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateS5(sourceS5, cloneS5, "MarshalStructAsParam_AsSeqByVal8"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.StringStructSequentialAnsiId:
+ strOne = new String('a', 512);
+ strTwo = new String('b', 512);
+ StringStructSequentialAnsi source_sssa = Helper.NewStringStructSequentialAnsi(strOne, strTwo);
+ StringStructSequentialAnsi clone_sssa = Helper.NewStringStructSequentialAnsi(strOne, strTwo);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByVal9...");
+ if (!MarshalStructAsParam_AsSeqByVal9(source_sssa))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByVal9.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateStringStructSequentialAnsi(source_sssa, clone_sssa, "MarshalStructAsParam_AsSeqByVal9"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.StringStructSequentialUnicodeId:
+ strOne = new String('a', 256);
+ strTwo = new String('b', 256);
+ StringStructSequentialUnicode source_sssu = Helper.NewStringStructSequentialUnicode(strOne, strTwo);
+ StringStructSequentialUnicode clone_sssu = Helper.NewStringStructSequentialUnicode(strOne, strTwo);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByVal10...");
+ if (!MarshalStructAsParam_AsSeqByVal10(source_sssu))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByVal10.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateStringStructSequentialUnicode(source_sssu, clone_sssu, "MarshalStructAsParam_AsSeqByVal10"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.S8Id:
+ S8 sourceS8 = Helper.NewS8("hello", true, 10, 128, 128, 32);
+ S8 cloneS8 = Helper.NewS8("hello", true, 10, 128, 128, 32);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByVal11...");
+ if (!MarshalStructAsParam_AsSeqByVal11(sourceS8))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByVal11.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateS8(sourceS8, cloneS8, "MarshalStructAsParam_AsSeqByVal11"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.S9Id:
+ S9 sourceS9 = Helper.NewS9(128, new TestDelegate1(testMethod));
+ S9 cloneS9 = Helper.NewS9(128, new TestDelegate1(testMethod));
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByVal12...");
+ if (!MarshalStructAsParam_AsSeqByVal12(sourceS9))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByVal12.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateS9(sourceS9, cloneS9, "MarshalStructAsParam_AsSeqByVal12"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.IncludeOuterIntergerStructSequentialId:
+ IncludeOuterIntergerStructSequential sourceIncludeOuterIntergerStructSequential = Helper.NewIncludeOuterIntergerStructSequential(32, 32);
+ IncludeOuterIntergerStructSequential cloneIncludeOuterIntergerStructSequential = Helper.NewIncludeOuterIntergerStructSequential(32, 32);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByVal13...");
+ if (!MarshalStructAsParam_AsSeqByVal13(sourceIncludeOuterIntergerStructSequential))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByVal13.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateIncludeOuterIntergerStructSequential(sourceIncludeOuterIntergerStructSequential, cloneIncludeOuterIntergerStructSequential, "MarshalStructAsParam_AsSeqByVal13"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.S11Id:
+ S11 sourceS11 = Helper.NewS11((int*)new Int32(), 32);
+ S11 cloneS11 = Helper.NewS11((int*)new Int64(), 32);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByVal14...");
+ if (!MarshalStructAsParam_AsSeqByVal14(sourceS11))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByVal14.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateS11(sourceS11, cloneS11, "MarshalStructAsParam_AsSeqByVal14"))
+ {
+ failures++;
+ }
+ break;
+
+ default:
+ Console.WriteLine("\tThere is not the struct id");
+ failures++;
+ break;
+ }
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine("Unexpected Exception:" + e.ToString());
+ failures++;
+ }
+
+ }
+
+ [SecuritySafeCritical]
+ unsafe private static void MarshalStructAsParam_AsSeqByRef(StructID id)
+ {
+ try
+ {
+ switch (id)
+ {
+ case StructID.InnerSequentialId:
+ InnerSequential source_is = Helper.NewInnerSequential(1, 1.0F, "some string");
+ InnerSequential change_is = Helper.NewInnerSequential(77, 77.0F, "changed string");
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRef...");
+ if (!MarshalStructAsParam_AsSeqByRef(ref source_is))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRef.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateInnerSequential(source_is, change_is, "MarshalStructAsParam_AsSeqByRef"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.InnerArraySequentialId:
+ InnerArraySequential source_ias = Helper.NewInnerArraySequential(1, 1.0F, "some string");
+ InnerArraySequential change_ias = Helper.NewInnerArraySequential(77, 77.0F, "changed string");
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRef2...");
+ if (!MarshalStructAsParam_AsSeqByRef2(ref source_ias))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRef2.Expected:True;Actual:False");
+ }
+ if (!Helper.ValidateInnerArraySequential(source_ias, change_ias, "MarshalStructAsParam_AsSeqByRef2"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.CharSetAnsiSequentialId:
+ CharSetAnsiSequential source_csas = Helper.NewCharSetAnsiSequential("some string", 'c');
+ CharSetAnsiSequential changeStr1 = Helper.NewCharSetAnsiSequential("change string", 'n');
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRef3...");
+ if (!MarshalStructAsParam_AsSeqByRef3(ref source_csas))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRef3.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateCharSetAnsiSequential(source_csas, changeStr1, "MarshalStructAsParam_AsSeqByRef3"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.CharSetUnicodeSequentialId:
+ CharSetUnicodeSequential source_csus = Helper.NewCharSetUnicodeSequential("some string", 'c');
+ CharSetUnicodeSequential change_csus = Helper.NewCharSetUnicodeSequential("change string", 'n');
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRef4...");
+ if (!MarshalStructAsParam_AsSeqByRef4(ref source_csus))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRef4.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateCharSetUnicodeSequential(source_csus, change_csus, "MarshalStructAsParam_AsSeqByRef4"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.NumberSequentialId:
+ NumberSequential source_ns = Helper.NewNumberSequential(Int32.MinValue, UInt32.MaxValue, short.MinValue, ushort.MaxValue, byte.MinValue, sbyte.MaxValue, Int16.MinValue, UInt16.MaxValue, -1234567890, 1234567890, 32.0F, 3.2);
+ NumberSequential change_ns = Helper.NewNumberSequential(0, 32, 0, 16, 0, 8, 0, 16, 0, 64, 64.0F, 6.4);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRef6...");
+ if (!MarshalStructAsParam_AsSeqByRef6(ref source_ns))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRef6.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateNumberSequential(source_ns, change_ns, "MarshalStructAsParam_AsSeqByRef6"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.S3Id:
+ int[] iarr = new int[256];
+ int[] icarr = new int[256];
+ InitialArray(iarr, icarr);
+
+ S3 sourceS3 = Helper.NewS3(true, "some string", iarr);
+ S3 changeS3 = Helper.NewS3(false, "change string", icarr);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRef7...");
+ if (!MarshalStructAsParam_AsSeqByRef7(ref sourceS3))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRef7.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateS3(sourceS3, changeS3, "MarshalStructAsParam_AsSeqByRef7"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.S5Id:
+ Enum1 enums = Enum1.e1;
+ Enum1 enumch = Enum1.e2;
+ S5 sourceS5 = Helper.NewS5(32, "some string", enums);
+ S5 changeS5 = Helper.NewS5(64, "change string", enumch);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRef8...");
+ if (!MarshalStructAsParam_AsSeqByRef8(ref sourceS5))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRef8.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateS5(sourceS5, changeS5, "MarshalStructAsParam_AsSeqByRef8"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.StringStructSequentialAnsiId:
+ strOne = new String('a', 512);
+ strTwo = new String('b', 512);
+ StringStructSequentialAnsi source_sssa = Helper.NewStringStructSequentialAnsi(strOne, strTwo);
+ StringStructSequentialAnsi change_sssa = Helper.NewStringStructSequentialAnsi(strTwo, strOne);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRef9...");
+ if (!MarshalStructAsParam_AsSeqByRef9(ref source_sssa))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRef9.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateStringStructSequentialAnsi(source_sssa, change_sssa, "MarshalStructAsParam_AsSeqByRef9"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.StringStructSequentialUnicodeId:
+ strOne = new String('a', 256);
+ strTwo = new String('b', 256);
+ StringStructSequentialUnicode source_sssu = Helper.NewStringStructSequentialUnicode(strOne, strTwo);
+ StringStructSequentialUnicode change_sssu = Helper.NewStringStructSequentialUnicode(strTwo, strOne);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRef10...");
+ if (!MarshalStructAsParam_AsSeqByRef10(ref source_sssu))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRef10.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateStringStructSequentialUnicode(source_sssu, change_sssu, "MarshalStructAsParam_AsSeqByRef10"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.S8Id:
+ S8 sourceS8 = Helper.NewS8("hello", true, 10, 128, 128, 32);
+ S8 changeS8 = Helper.NewS8("world", false, 1, 256, 256, 64);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRef11...");
+ if (!MarshalStructAsParam_AsSeqByRef11(ref sourceS8))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRef11.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateS8(sourceS8, changeS8, "MarshalStructAsParam_AsSeqByRef11"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.S9Id:
+ S9 sourceS9 = Helper.NewS9(128, new TestDelegate1(testMethod));
+ S9 changeS9 = Helper.NewS9(256, null);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRef12...");
+ if (!MarshalStructAsParam_AsSeqByRef12(ref sourceS9))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRef12.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateS9(sourceS9, changeS9, "MarshalStructAsParam_AsSeqByRef12"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.IncludeOuterIntergerStructSequentialId:
+ IncludeOuterIntergerStructSequential sourceIncludeOuterIntergerStructSequential = Helper.NewIncludeOuterIntergerStructSequential(32, 32);
+ IncludeOuterIntergerStructSequential changeIncludeOuterIntergerStructSequential = Helper.NewIncludeOuterIntergerStructSequential(64, 64);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRef13...");
+ if (!MarshalStructAsParam_AsSeqByRef13(ref sourceIncludeOuterIntergerStructSequential))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRef13.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateIncludeOuterIntergerStructSequential(sourceIncludeOuterIntergerStructSequential, changeIncludeOuterIntergerStructSequential, "MarshalStructAsParam_AsSeqByRef13"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.S11Id:
+ S11 sourceS11 = Helper.NewS11((int*)new Int32(), 32);
+ S11 changeS11 = Helper.NewS11((int*)(32), 64);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRef14...");
+ if (!MarshalStructAsParam_AsSeqByRef14(ref sourceS11))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRef14.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateS11(sourceS11, changeS11, "MarshalStructAsParam_AsSeqByRef14"))
+ {
+ failures++;
+ }
+ break;
+ default:
+ Console.WriteLine("\tThere is not the struct id");
+ failures++;
+ break;
+ }
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine("Unexpected Exception:" + e.ToString());
+ failures++;
+ }
+ }
+
+ [SecuritySafeCritical]
+ unsafe private static void MarshalStructAsParam_AsSeqByValIn(StructID id)
+ {
+ try
+ {
+ switch (id)
+ {
+ case StructID.InnerSequentialId:
+ InnerSequential source_is = Helper.NewInnerSequential(1, 1.0F, "some string");
+ InnerSequential clone_is = Helper.NewInnerSequential(1, 1.0F, "some string");
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByValIn...");
+ if (!MarshalStructAsParam_AsSeqByValIn(source_is))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByValIn.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateInnerSequential(source_is, clone_is, "MarshalStructAsParam_AsSeqByValIn"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.InnerArraySequentialId:
+ InnerArraySequential source_ias = Helper.NewInnerArraySequential(1, 1.0F, "some string");
+ InnerArraySequential clone_ias = Helper.NewInnerArraySequential(1, 1.0F, "some string");
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByValIn2...");
+ if (!MarshalStructAsParam_AsSeqByValIn2(source_ias))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByValIn2.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateInnerArraySequential(source_ias, clone_ias, "MarshalStructAsParam_AsSeqByValIn2"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.CharSetAnsiSequentialId:
+ CharSetAnsiSequential source_csas = Helper.NewCharSetAnsiSequential("some string", 'c');
+ CharSetAnsiSequential clone_csas = Helper.NewCharSetAnsiSequential("some string", 'c');
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByValIn3...");
+ if (!MarshalStructAsParam_AsSeqByValIn3(source_csas))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByValIn3.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateCharSetAnsiSequential(source_csas, clone_csas, "MarshalStructAsParam_AsSeqByValIn3"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.CharSetUnicodeSequentialId:
+ CharSetUnicodeSequential source_csus = Helper.NewCharSetUnicodeSequential("some string", 'c');
+ CharSetUnicodeSequential clone_csus = Helper.NewCharSetUnicodeSequential("some string", 'c');
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByValIn4...");
+ if (!MarshalStructAsParam_AsSeqByValIn4(source_csus))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByValIn4.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateCharSetUnicodeSequential(source_csus, clone_csus, "MarshalStructAsParam_AsSeqByValIn4"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.NumberSequentialId:
+ NumberSequential source_ns = Helper.NewNumberSequential(Int32.MinValue, UInt32.MaxValue, short.MinValue, ushort.MaxValue, byte.MinValue, sbyte.MaxValue, Int16.MinValue, UInt16.MaxValue, -1234567890, 1234567890, 32.0F, 3.2);
+ NumberSequential clone_ns = Helper.NewNumberSequential(Int32.MinValue, UInt32.MaxValue, short.MinValue, ushort.MaxValue, byte.MinValue, sbyte.MaxValue, Int16.MinValue, UInt16.MaxValue, -1234567890, 1234567890, 32.0F, 3.2);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByValIn6...");
+ if (!MarshalStructAsParam_AsSeqByValIn6(source_ns))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByValIn6.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateNumberSequential(source_ns, clone_ns, "MarshalStructAsParam_AsSeqByValIn6"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.S3Id:
+ int[] iarr = new int[256];
+ int[] icarr = new int[256];
+ InitialArray(iarr, icarr);
+
+ S3 sourceS3 = Helper.NewS3(true, "some string", iarr);
+ S3 cloneS3 = Helper.NewS3(true, "some string", iarr);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByValIn7...");
+ if (!MarshalStructAsParam_AsSeqByValIn7(sourceS3))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByValIn7.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateS3(sourceS3, cloneS3, "MarshalStructAsParam_AsSeqByValIn7"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.S5Id:
+ Enum1 enums = Enum1.e1;
+ Enum1 enumcl = Enum1.e1;
+ S5 sourceS5 = Helper.NewS5(32, "some string", enums);
+ S5 cloneS5 = Helper.NewS5(32, "some string", enumcl);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByValIn8...");
+ if (!MarshalStructAsParam_AsSeqByValIn8(sourceS5))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByValIn8.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateS5(sourceS5, cloneS5, "MarshalStructAsParam_AsSeqByValIn8"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.StringStructSequentialAnsiId:
+ strOne = new String('a', 512);
+ strTwo = new String('b', 512);
+ StringStructSequentialAnsi source_sssa = Helper.NewStringStructSequentialAnsi(strOne, strTwo);
+ StringStructSequentialAnsi clone_sssa = Helper.NewStringStructSequentialAnsi(strOne, strTwo);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByValIn9...");
+ if (!MarshalStructAsParam_AsSeqByValIn9(source_sssa))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByValIn9.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateStringStructSequentialAnsi(source_sssa, clone_sssa, "MarshalStructAsParam_AsSeqByValIn9"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.StringStructSequentialUnicodeId:
+ strOne = new String('a', 256);
+ strTwo = new String('b', 256);
+ StringStructSequentialUnicode source_sssu = Helper.NewStringStructSequentialUnicode(strOne, strTwo);
+ StringStructSequentialUnicode clone_sssu = Helper.NewStringStructSequentialUnicode(strOne, strTwo);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByValIn10...");
+ if (!MarshalStructAsParam_AsSeqByValIn10(source_sssu))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByValIn10.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateStringStructSequentialUnicode(source_sssu, clone_sssu, "MarshalStructAsParam_AsSeqByValIn10"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.S8Id:
+ S8 sourceS8 = Helper.NewS8("hello", true, 10, 128, 128, 32);
+ S8 cloneS8 = Helper.NewS8("hello", true, 10, 128, 128, 32);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByValIn11...");
+ if (!MarshalStructAsParam_AsSeqByValIn11(sourceS8))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByValIn11.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateS8(sourceS8, cloneS8, "MarshalStructAsParam_AsSeqByValIn11"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.S9Id:
+ S9 sourceS9 = Helper.NewS9(128, new TestDelegate1(testMethod));
+ S9 cloneS9 = Helper.NewS9(128, new TestDelegate1(testMethod));
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByValIn12...");
+ if (!MarshalStructAsParam_AsSeqByValIn12(sourceS9))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByValIn12.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateS9(sourceS9, cloneS9, "MarshalStructAsParam_AsSeqByValIn12"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.IncludeOuterIntergerStructSequentialId:
+ IncludeOuterIntergerStructSequential sourceIncludeOuterIntergerStructSequential = Helper.NewIncludeOuterIntergerStructSequential(32, 32);
+ IncludeOuterIntergerStructSequential cloneIncludeOuterIntergerStructSequential = Helper.NewIncludeOuterIntergerStructSequential(32, 32);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByValIn13...");
+ if (!MarshalStructAsParam_AsSeqByValIn13(sourceIncludeOuterIntergerStructSequential))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByValIn13.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateIncludeOuterIntergerStructSequential(sourceIncludeOuterIntergerStructSequential, cloneIncludeOuterIntergerStructSequential, "MarshalStructAsParam_AsSeqByValIn13"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.S11Id:
+ S11 sourceS11 = Helper.NewS11((int*)new Int32(), 32);
+ S11 cloneS11 = Helper.NewS11((int*)new Int64(), 32);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByValIn14...");
+ if (!MarshalStructAsParam_AsSeqByValIn14(sourceS11))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByValIn14.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateS11(sourceS11, cloneS11, "MarshalStructAsParam_AsSeqByValIn14"))
+ {
+ failures++;
+ }
+ break;
+
+ default:
+ Console.WriteLine("\tThere is not the struct id");
+ failures++;
+ break;
+ }
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine("Unexpected Exception:" + e.ToString());
+ failures++;
+ }
+ }
+
+ [SecuritySafeCritical]
+ unsafe private static void MarshalStructAsParam_AsSeqByRefIn(StructID id)
+ {
+ try
+ {
+ switch (id)
+ {
+ case StructID.InnerSequentialId:
+ InnerSequential source_is = Helper.NewInnerSequential(1, 1.0F, "some string");
+ InnerSequential clone_is = Helper.NewInnerSequential(1, 1.0F, "some string");
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRefIn...");
+ if (!MarshalStructAsParam_AsSeqByRefIn(ref source_is))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRefIn.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateInnerSequential(source_is, clone_is, "MarshalStructAsParam_AsSeqByRefIn"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.InnerArraySequentialId:
+ InnerArraySequential source_ias = Helper.NewInnerArraySequential(1, 1.0F, "some string");
+ InnerArraySequential clone_ias = Helper.NewInnerArraySequential(1, 1.0F, "some string");
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRefIn2...");
+ if (!MarshalStructAsParam_AsSeqByRefIn2(ref source_ias))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRefIn2.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateInnerArraySequential(source_ias, clone_ias, "MarshalStructAsParam_AsSeqByRefIn2"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.CharSetAnsiSequentialId:
+ CharSetAnsiSequential source_csas = Helper.NewCharSetAnsiSequential("some string", 'c');
+ CharSetAnsiSequential clone_csas = Helper.NewCharSetAnsiSequential("some string", 'c');
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRefIn3...");
+ if (!MarshalStructAsParam_AsSeqByRefIn3(ref source_csas))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRefIn3.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateCharSetAnsiSequential(source_csas, clone_csas, "MarshalStructAsParam_AsSeqByRefIn3"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.CharSetUnicodeSequentialId:
+ CharSetUnicodeSequential source_csus = Helper.NewCharSetUnicodeSequential("some string", 'c');
+ CharSetUnicodeSequential clone_csus = Helper.NewCharSetUnicodeSequential("some string", 'c');
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRefIn4...");
+ if (!MarshalStructAsParam_AsSeqByRefIn4(ref source_csus))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRefIn4.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateCharSetUnicodeSequential(source_csus, clone_csus, "MarshalStructAsParam_AsSeqByRefIn4"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.NumberSequentialId:
+ NumberSequential source_ns = Helper.NewNumberSequential(Int32.MinValue, UInt32.MaxValue, short.MinValue, ushort.MaxValue, byte.MinValue, sbyte.MaxValue, Int16.MinValue, UInt16.MaxValue, -1234567890, 1234567890, 32.0F, 3.2);
+ NumberSequential change_ns = Helper.NewNumberSequential(0, 32, 0, 16, 0, 8, 0, 16, 0, 64, 64.0F, 6.4);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRefIn6...");
+ if (!MarshalStructAsParam_AsSeqByRefIn6(ref source_ns))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRefIn6.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateNumberSequential(source_ns, change_ns, "MarshalStructAsParam_AsSeqByRefIn6"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.S3Id:
+ int[] iarr = new int[256];
+ int[] icarr = new int[256];
+ InitialArray(iarr, icarr);
+
+ S3 sourceS3 = Helper.NewS3(true, "some string", iarr);
+ S3 cloneS3 = Helper.NewS3(true, "some string", iarr);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRefIn7...");
+ if (!MarshalStructAsParam_AsSeqByRefIn7(ref sourceS3))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRefIn7.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateS3(sourceS3, cloneS3, "MarshalStructAsParam_AsSeqByRefIn7"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.S5Id:
+ Enum1 enums = Enum1.e1;
+ Enum1 enumcl = Enum1.e1;
+ S5 sourceS5 = Helper.NewS5(32, "some string", enums);
+ S5 cloneS5 = Helper.NewS5(32, "some string", enumcl);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRefIn8...");
+ if (!MarshalStructAsParam_AsSeqByRefIn8(ref sourceS5))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRefIn8.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateS5(sourceS5, cloneS5, "MarshalStructAsParam_AsSeqByRefIn8"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.StringStructSequentialAnsiId:
+ strOne = new String('a', 512);
+ strTwo = new String('b', 512);
+ StringStructSequentialAnsi source_sssa = Helper.NewStringStructSequentialAnsi(strOne, strTwo);
+ StringStructSequentialAnsi clone_sssa = Helper.NewStringStructSequentialAnsi(strOne, strTwo);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRefIn9...");
+ if (!MarshalStructAsParam_AsSeqByRefIn9(ref source_sssa))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRefIn9.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateStringStructSequentialAnsi(source_sssa, clone_sssa, "MarshalStructAsParam_AsSeqByRefIn9"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.StringStructSequentialUnicodeId:
+ strOne = new String('a', 256);
+ strTwo = new String('b', 256);
+ StringStructSequentialUnicode source_sssu = Helper.NewStringStructSequentialUnicode(strOne, strTwo);
+ StringStructSequentialUnicode clone_sssu = Helper.NewStringStructSequentialUnicode(strOne, strTwo);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRefIn10...");
+ if (!MarshalStructAsParam_AsSeqByRefIn10(ref source_sssu))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRefIn10.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateStringStructSequentialUnicode(source_sssu, clone_sssu, "MarshalStructAsParam_AsSeqByRefIn10"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.S8Id:
+ S8 sourceS8 = Helper.NewS8("hello", true, 10, 128, 128, 32);
+ S8 cloneS8 = Helper.NewS8("hello", true, 10, 128, 128, 32);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRefIn11...");
+ if (!MarshalStructAsParam_AsSeqByRefIn11(ref sourceS8))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRefIn11.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateS8(sourceS8, cloneS8, "MarshalStructAsParam_AsSeqByRefIn11"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.S9Id:
+ S9 sourceS9 = Helper.NewS9(128, new TestDelegate1(testMethod));
+ S9 cloneS9 = Helper.NewS9(128, new TestDelegate1(testMethod));
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRefIn12...");
+ if (!MarshalStructAsParam_AsSeqByRefIn12(ref sourceS9))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRefIn12.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateS9(sourceS9, cloneS9, "MarshalStructAsParam_AsSeqByRefIn12"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.IncludeOuterIntergerStructSequentialId:
+ IncludeOuterIntergerStructSequential sourceIncludeOuterIntergerStructSequential = Helper.NewIncludeOuterIntergerStructSequential(32, 32);
+ IncludeOuterIntergerStructSequential changeIncludeOuterIntergerStructSequential = Helper.NewIncludeOuterIntergerStructSequential(64, 64);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRefIn13...");
+ if (!MarshalStructAsParam_AsSeqByRefIn13(ref sourceIncludeOuterIntergerStructSequential))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRefIn13.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateIncludeOuterIntergerStructSequential(sourceIncludeOuterIntergerStructSequential, changeIncludeOuterIntergerStructSequential, "MarshalStructAsParam_AsSeqByRefIn13"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.S11Id:
+ S11 sourceS11 = Helper.NewS11((int*)new Int32(), 32);
+ S11 changeS11 = Helper.NewS11((int*)(32), 64);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRefIn14...");
+ if (!MarshalStructAsParam_AsSeqByRefIn14(ref sourceS11))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRefIn14.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateS11(sourceS11, changeS11, "MarshalStructAsParam_AsSeqByRefIn14"))
+ {
+ failures++;
+ }
+ break;
+ default:
+ Console.WriteLine("\tThere is not the struct id");
+ failures++;
+ break;
+ }
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine("Unexpected Exception:" + e.ToString());
+ failures++;
+ }
+ }
+
+ [SecuritySafeCritical]
+ unsafe private static void MarshalStructAsParam_AsSeqByValOut(StructID id)
+ {
+ try
+ {
+ switch (id)
+ {
+ case StructID.InnerSequentialId:
+ InnerSequential source_is = Helper.NewInnerSequential(1, 1.0F, "some string");
+ InnerSequential clone_is = Helper.NewInnerSequential(1, 1.0F, "some string");
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByValOut...");
+ if (!MarshalStructAsParam_AsSeqByValOut(source_is))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByValOut.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateInnerSequential(source_is, clone_is, "MarshalStructAsParam_AsSeqByValOut"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.InnerArraySequentialId:
+ InnerArraySequential source_ias = Helper.NewInnerArraySequential(1, 1.0F, "some string");
+ InnerArraySequential clone_ias = Helper.NewInnerArraySequential(1, 1.0F, "some string");
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByValOut2...");
+ if (!MarshalStructAsParam_AsSeqByValOut2(source_ias))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByValOut2.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateInnerArraySequential(source_ias, clone_ias, "MarshalStructAsParam_AsSeqByValOut2"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.CharSetAnsiSequentialId:
+ CharSetAnsiSequential source_csas = Helper.NewCharSetAnsiSequential("some string", 'c');
+ CharSetAnsiSequential clone_csas = Helper.NewCharSetAnsiSequential("some string", 'c');
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByValOut3...");
+ if (!MarshalStructAsParam_AsSeqByValOut3(source_csas))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByValOut3.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateCharSetAnsiSequential(source_csas, clone_csas, "MarshalStructAsParam_AsSeqByValOut3"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.CharSetUnicodeSequentialId:
+ CharSetUnicodeSequential source_csus = Helper.NewCharSetUnicodeSequential("some string", 'c');
+ CharSetUnicodeSequential clone_csus = Helper.NewCharSetUnicodeSequential("some string", 'c');
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByValOut4...");
+ if (!MarshalStructAsParam_AsSeqByValOut4(source_csus))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByValOut4.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateCharSetUnicodeSequential(source_csus, clone_csus, "MarshalStructAsParam_AsSeqByValOut4"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.NumberSequentialId:
+ NumberSequential source_ns = Helper.NewNumberSequential(Int32.MinValue, UInt32.MaxValue, short.MinValue, ushort.MaxValue, byte.MinValue, sbyte.MaxValue, Int16.MinValue, UInt16.MaxValue, -1234567890, 1234567890, 32.0F, 3.2);
+ NumberSequential clone_ns = Helper.NewNumberSequential(Int32.MinValue, UInt32.MaxValue, short.MinValue, ushort.MaxValue, byte.MinValue, sbyte.MaxValue, Int16.MinValue, UInt16.MaxValue, -1234567890, 1234567890, 32.0F, 3.2);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByValOut6...");
+ if (!MarshalStructAsParam_AsSeqByValOut6(source_ns))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByValOut6.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateNumberSequential(source_ns, clone_ns, "MarshalStructAsParam_AsSeqByValOut6"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.S3Id:
+ int[] iarr = new int[256];
+ int[] icarr = new int[256];
+ InitialArray(iarr, icarr);
+
+ S3 sourceS3 = Helper.NewS3(true, "some string", iarr);
+ S3 cloneS3 = Helper.NewS3(true, "some string", iarr);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByValOut7...");
+ if (!MarshalStructAsParam_AsSeqByValOut7(sourceS3))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByValOut7.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateS3(sourceS3, cloneS3, "MarshalStructAsParam_AsSeqByValOut7"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.S5Id:
+ Enum1 enums = Enum1.e1;
+ Enum1 enumcl = Enum1.e1;
+ S5 sourceS5 = Helper.NewS5(32, "some string", enums);
+ S5 cloneS5 = Helper.NewS5(32, "some string", enumcl);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByValOut8...");
+ if (!MarshalStructAsParam_AsSeqByValOut8(sourceS5))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByValOut8.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateS5(sourceS5, cloneS5, "MarshalStructAsParam_AsSeqByValOut8"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.StringStructSequentialAnsiId:
+ strOne = new String('a', 512);
+ strTwo = new String('b', 512);
+ StringStructSequentialAnsi source_sssa = Helper.NewStringStructSequentialAnsi(strOne, strTwo);
+ StringStructSequentialAnsi clone_sssa = Helper.NewStringStructSequentialAnsi(strOne, strTwo);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByValOut9...");
+ if (!MarshalStructAsParam_AsSeqByValOut9(source_sssa))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByValOut9.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateStringStructSequentialAnsi(source_sssa, clone_sssa, "MarshalStructAsParam_AsSeqByValOut9"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.StringStructSequentialUnicodeId:
+ strOne = new String('a', 256);
+ strTwo = new String('b', 256);
+ StringStructSequentialUnicode source_sssu = Helper.NewStringStructSequentialUnicode(strOne, strTwo);
+ StringStructSequentialUnicode clone_sssu = Helper.NewStringStructSequentialUnicode(strOne, strTwo);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByValOut10...");
+ if (!MarshalStructAsParam_AsSeqByValOut10(source_sssu))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByValOut10.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateStringStructSequentialUnicode(source_sssu, clone_sssu, "MarshalStructAsParam_AsSeqByValOut10"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.S8Id:
+ S8 sourceS8 = Helper.NewS8("hello", true, 10, 128, 128, 32);
+ S8 cloneS8 = Helper.NewS8("hello", true, 10, 128, 128, 32);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByValOut11...");
+ if (!MarshalStructAsParam_AsSeqByValOut11(sourceS8))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByValOut11.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateS8(sourceS8, cloneS8, "MarshalStructAsParam_AsSeqByValOut11"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.S9Id:
+ S9 sourceS9 = Helper.NewS9(128, new TestDelegate1(testMethod));
+ S9 cloneS9 = Helper.NewS9(128, new TestDelegate1(testMethod));
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByValOut12...");
+ if (!MarshalStructAsParam_AsSeqByValOut12(sourceS9))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByValOut12.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateS9(sourceS9, cloneS9, "MarshalStructAsParam_AsSeqByValOut12"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.IncludeOuterIntergerStructSequentialId:
+ IncludeOuterIntergerStructSequential sourceIncludeOuterIntergerStructSequential = Helper.NewIncludeOuterIntergerStructSequential(32, 32);
+ IncludeOuterIntergerStructSequential cloneIncludeOuterIntergerStructSequential = Helper.NewIncludeOuterIntergerStructSequential(32, 32);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByValOut13...");
+ if (!MarshalStructAsParam_AsSeqByValOut13(sourceIncludeOuterIntergerStructSequential))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByValOut13.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateIncludeOuterIntergerStructSequential(sourceIncludeOuterIntergerStructSequential, cloneIncludeOuterIntergerStructSequential, "MarshalStructAsParam_AsSeqByValOut13"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.S11Id:
+ S11 sourceS11 = Helper.NewS11((int*)32, 32);
+ S11 cloneS11 = Helper.NewS11((int*)32, 32);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByValOut14...");
+ if (!MarshalStructAsParam_AsSeqByValOut14(sourceS11))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByValOut14.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateS11(sourceS11, cloneS11, "MarshalStructAsParam_AsSeqByValOut14"))
+ {
+ failures++;
+ }
+ break;
+ default:
+ Console.WriteLine("\tThere is not the struct id");
+ failures++;
+ break;
+ }
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine("Unexpected Exception:" + e.ToString());
+ failures++;
+ }
+
+ }
+
+ [SecuritySafeCritical]
+ unsafe private static void MarshalStructAsParam_AsSeqByRefOut(StructID id)
+ {
+ try
+ {
+ switch (id)
+ {
+ case StructID.InnerSequentialId:
+ InnerSequential source_is = Helper.NewInnerSequential(1, 1.0F, "some string");
+ InnerSequential change_is = Helper.NewInnerSequential(77, 77.0F, "changed string");
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRefOut...");
+ if (!MarshalStructAsParam_AsSeqByRefOut(out source_is))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRefOut.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateInnerSequential(source_is, change_is, "MarshalStructAsParam_AsSeqByRefOut"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.InnerArraySequentialId:
+ InnerArraySequential source_ias = Helper.NewInnerArraySequential(1, 1.0F, "some string");
+ InnerArraySequential change_ias = Helper.NewInnerArraySequential(77, 77.0F, "changed string");
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRefOut2...");
+ if (!MarshalStructAsParam_AsSeqByRefOut2(out source_ias))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRefOut2.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateInnerArraySequential(source_ias, change_ias, "MarshalStructAsParam_AsSeqByRefOut2"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.CharSetAnsiSequentialId:
+ CharSetAnsiSequential source_csas = Helper.NewCharSetAnsiSequential("some string", 'c');
+ CharSetAnsiSequential changeStr1 = Helper.NewCharSetAnsiSequential("change string", 'n');
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRefOut3...");
+ if (!MarshalStructAsParam_AsSeqByRefOut3(out source_csas))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRefOut3.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateCharSetAnsiSequential(source_csas, changeStr1, "MarshalStructAsParam_AsSeqByRefOut3"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.CharSetUnicodeSequentialId:
+ CharSetUnicodeSequential source_csus = Helper.NewCharSetUnicodeSequential("some string", 'c');
+ CharSetUnicodeSequential change_csus = Helper.NewCharSetUnicodeSequential("change string", 'n');
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRefOut4...");
+ if (!MarshalStructAsParam_AsSeqByRefOut4(out source_csus))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRefOut4.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateCharSetUnicodeSequential(source_csus, change_csus, "MarshalStructAsParam_AsSeqByRefOut4"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.NumberSequentialId:
+ NumberSequential source_ns = Helper.NewNumberSequential(Int32.MinValue, UInt32.MaxValue, short.MinValue, ushort.MaxValue, byte.MinValue, sbyte.MaxValue, Int16.MinValue, UInt16.MaxValue, -1234567890, 1234567890, 32.0F, 3.2);
+ NumberSequential change_ns = Helper.NewNumberSequential(0, 32, 0, 16, 0, 8, 0, 16, 0, 64, 64.0F, 6.4);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRefOut6...");
+ if (!MarshalStructAsParam_AsSeqByRefOut6(out source_ns))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRefOut6.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateNumberSequential(source_ns, change_ns, "MarshalStructAsParam_AsSeqByRefOut6"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.S3Id:
+ int[] iarr = new int[256];
+ int[] icarr = new int[256];
+ InitialArray(iarr, icarr);
+
+ S3 sourceS3 = Helper.NewS3(true, "some string", iarr);
+ S3 changeS3 = Helper.NewS3(false, "change string", icarr);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRefOut7...");
+ if (!MarshalStructAsParam_AsSeqByRefOut7(out sourceS3))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRefOut7.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateS3(sourceS3, changeS3, "MarshalStructAsParam_AsSeqByRefOut7"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.S5Id:
+ Enum1 enums = Enum1.e1;
+ Enum1 enumch = Enum1.e2;
+ S5 sourceS5 = Helper.NewS5(32, "some string", enums);
+ S5 changeS5 = Helper.NewS5(64, "change string", enumch);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRefOut8...");
+ if (!MarshalStructAsParam_AsSeqByRefOut8(out sourceS5))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRefOut8.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateS5(sourceS5, changeS5, "MarshalStructAsParam_AsSeqByRefOut8"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.StringStructSequentialAnsiId:
+ strOne = new String('a', 512);
+ strTwo = new String('b', 512);
+ StringStructSequentialAnsi source_sssa = Helper.NewStringStructSequentialAnsi(strOne, strTwo);
+ StringStructSequentialAnsi change_sssa = Helper.NewStringStructSequentialAnsi(strTwo, strOne);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRefOut9...");
+ if (!MarshalStructAsParam_AsSeqByRefOut9(out source_sssa))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRefOut9.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateStringStructSequentialAnsi(source_sssa, change_sssa, "MarshalStructAsParam_AsSeqByRefOut9"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.StringStructSequentialUnicodeId:
+ strOne = new String('a', 256);
+ strTwo = new String('b', 256);
+ StringStructSequentialUnicode source_sssu = Helper.NewStringStructSequentialUnicode(strOne, strTwo);
+ StringStructSequentialUnicode change_sssu = Helper.NewStringStructSequentialUnicode(strTwo, strOne);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRefOut10...");
+ if (!MarshalStructAsParam_AsSeqByRefOut10(out source_sssu))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRefOut10.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateStringStructSequentialUnicode(source_sssu, change_sssu, "MarshalStructAsParam_AsSeqByRefOut10"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.S8Id:
+ S8 sourceS8 = Helper.NewS8("hello", true, 10, 128, 128, 32);
+ S8 changeS8 = Helper.NewS8("world", false, 1, 256, 256, 64);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRefOut11...");
+ if (!MarshalStructAsParam_AsSeqByRefOut11(out sourceS8))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRefOut11.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateS8(sourceS8, changeS8, "MarshalStructAsParam_AsSeqByRefOut11"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.S9Id:
+ S9 sourceS9 = Helper.NewS9(128, new TestDelegate1(testMethod));
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRefOut12...");
+ if (!MarshalStructAsParam_AsSeqByRefOut12(out sourceS9))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRefOut12.Expected:True;Actual:False");
+ failures++;
+ }
+ else if (sourceS9.i32 != 256 || sourceS9.myDelegate1 == null)
+ {
+ Console.WriteLine("\tFAILED! Native to Managed failed in MarshalStructAsParam_AsSeqByRefOut12.");
+ failures++;
+ }
+ else
+ {
+ Console.WriteLine("\tPASSED!");
+ }
+ break;
+ case StructID.IncludeOuterIntergerStructSequentialId:
+ IncludeOuterIntergerStructSequential sourceIncludeOuterIntergerStructSequential = Helper.NewIncludeOuterIntergerStructSequential(32, 32);
+ IncludeOuterIntergerStructSequential changeIncludeOuterIntergerStructSequential = Helper.NewIncludeOuterIntergerStructSequential(64, 64);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRefOut13...");
+ if (!MarshalStructAsParam_AsSeqByRefOut13(out sourceIncludeOuterIntergerStructSequential))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRefOut13.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateIncludeOuterIntergerStructSequential(sourceIncludeOuterIntergerStructSequential, changeIncludeOuterIntergerStructSequential, "MarshalStructAsParam_AsSeqByRefOut13"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.S11Id:
+ S11 sourceS11 = Helper.NewS11((int*)new Int32(), 32);
+ S11 changeS11 = Helper.NewS11((int*)(32), 64);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRefOut14...");
+ if (!MarshalStructAsParam_AsSeqByRefOut14(out sourceS11))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRefOut14.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateS11(sourceS11, changeS11, "MarshalStructAsParam_AsSeqByRefOut14"))
+ {
+ failures++;
+ }
+ break;
+ default:
+ Console.WriteLine("\tThere is not the struct id");
+ failures++;
+ break;
+ }
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine("Unexpected Exception:" + e.ToString());
+ failures++;
+ }
+ }
+
+ [SecuritySafeCritical]
+ unsafe private static void MarshalStructAsParam_AsSeqByValInOut(StructID id)
+ {
+ try
+ {
+ switch (id)
+ {
+ case StructID.InnerSequentialId:
+ InnerSequential source_is = Helper.NewInnerSequential(1, 1.0F, "some string");
+ InnerSequential clone_is = Helper.NewInnerSequential(1, 1.0F, "some string");
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByValInOut...");
+ if (!MarshalStructAsParam_AsSeqByValInOut(source_is))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByValInOut.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateInnerSequential(source_is, clone_is, "MarshalStructAsParam_AsSeqByValInOut"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.InnerArraySequentialId:
+ InnerArraySequential source_ias = Helper.NewInnerArraySequential(1, 1.0F, "some string");
+ InnerArraySequential clone_ias = Helper.NewInnerArraySequential(1, 1.0F, "some string");
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByValInOut2...");
+ if (!MarshalStructAsParam_AsSeqByValInOut2(source_ias))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByValInOut2.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateInnerArraySequential(source_ias, clone_ias, "MarshalStructAsParam_AsSeqByValInOut2"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.CharSetAnsiSequentialId:
+ CharSetAnsiSequential source_csas = Helper.NewCharSetAnsiSequential("some string", 'c');
+ CharSetAnsiSequential clone_csas = Helper.NewCharSetAnsiSequential("some string", 'c');
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByValInOut3...");
+ if (!MarshalStructAsParam_AsSeqByValInOut3(source_csas))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByValInOut3.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateCharSetAnsiSequential(source_csas, clone_csas, "MarshalStructAsParam_AsSeqByValInOut3"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.CharSetUnicodeSequentialId:
+ CharSetUnicodeSequential source_csus = Helper.NewCharSetUnicodeSequential("some string", 'c');
+ CharSetUnicodeSequential clone_csus = Helper.NewCharSetUnicodeSequential("some string", 'c');
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByValInOut4...");
+ if (!MarshalStructAsParam_AsSeqByValInOut4(source_csus))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByValInOut4.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateCharSetUnicodeSequential(source_csus, clone_csus, "MarshalStructAsParam_AsSeqByValInOut4"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.NumberSequentialId:
+ NumberSequential source_ns = Helper.NewNumberSequential(Int32.MinValue, UInt32.MaxValue, short.MinValue, ushort.MaxValue, byte.MinValue, sbyte.MaxValue, Int16.MinValue, UInt16.MaxValue, -1234567890, 1234567890, 32.0F, 3.2);
+ NumberSequential clone_ns = Helper.NewNumberSequential(Int32.MinValue, UInt32.MaxValue, short.MinValue, ushort.MaxValue, byte.MinValue, sbyte.MaxValue, Int16.MinValue, UInt16.MaxValue, -1234567890, 1234567890, 32.0F, 3.2);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByValInOut6...");
+ if (!MarshalStructAsParam_AsSeqByValInOut6(source_ns))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByValInOut6.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateNumberSequential(source_ns, clone_ns, "MarshalStructAsParam_AsSeqByValInOut6"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.S3Id:
+ int[] iarr = new int[256];
+ int[] icarr = new int[256];
+ InitialArray(iarr, icarr);
+
+ S3 sourceS3 = Helper.NewS3(true, "some string", iarr);
+ S3 cloneS3 = Helper.NewS3(true, "some string", iarr);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByValInOut7...");
+ if (!MarshalStructAsParam_AsSeqByValInOut7(sourceS3))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByValInOut7.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateS3(sourceS3, cloneS3, "MarshalStructAsParam_AsSeqByValInOut7"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.S5Id:
+ Enum1 enums = Enum1.e1;
+ Enum1 enumcl = Enum1.e1;
+ S5 sourceS5 = Helper.NewS5(32, "some string", enums);
+ S5 cloneS5 = Helper.NewS5(32, "some string", enumcl);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByValInOut8...");
+ if (!MarshalStructAsParam_AsSeqByValInOut8(sourceS5))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByValInOut8.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateS5(sourceS5, cloneS5, "MarshalStructAsParam_AsSeqByValInOut8"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.StringStructSequentialAnsiId:
+ strOne = new String('a', 512);
+ strTwo = new String('b', 512);
+ StringStructSequentialAnsi source_sssa = Helper.NewStringStructSequentialAnsi(strOne, strTwo);
+ StringStructSequentialAnsi clone_sssa = Helper.NewStringStructSequentialAnsi(strOne, strTwo);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByValInOut9...");
+ if (!MarshalStructAsParam_AsSeqByValInOut9(source_sssa))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByValInOut9.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateStringStructSequentialAnsi(source_sssa, clone_sssa, "MarshalStructAsParam_AsSeqByValInOut9"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.StringStructSequentialUnicodeId:
+ strOne = new String('a', 256);
+ strTwo = new String('b', 256);
+ StringStructSequentialUnicode source_sssu = Helper.NewStringStructSequentialUnicode(strOne, strTwo);
+ StringStructSequentialUnicode clone_sssu = Helper.NewStringStructSequentialUnicode(strOne, strTwo);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByValInOut10...");
+ if (!MarshalStructAsParam_AsSeqByValInOut10(source_sssu))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByValInOut10.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateStringStructSequentialUnicode(source_sssu, clone_sssu, "MarshalStructAsParam_AsSeqByValInOut10"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.S8Id:
+ S8 sourceS8 = Helper.NewS8("hello", true, 10, 128, 128, 32);
+ S8 cloneS8 = Helper.NewS8("hello", true, 10, 128, 128, 32);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByValInOut11...");
+ if (!MarshalStructAsParam_AsSeqByValInOut11(sourceS8))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByValInOut11.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateS8(sourceS8, cloneS8, "MarshalStructAsParam_AsSeqByValInOut11"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.S9Id:
+ S9 sourceS9 = Helper.NewS9(128, new TestDelegate1(testMethod));
+ S9 cloneS9 = Helper.NewS9(128, new TestDelegate1(testMethod));
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByValInOut12...");
+ if (!MarshalStructAsParam_AsSeqByValInOut12(sourceS9))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByValInOut12.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateS9(sourceS9, cloneS9, "MarshalStructAsParam_AsSeqByValInOut12"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.IncludeOuterIntergerStructSequentialId:
+ IncludeOuterIntergerStructSequential sourceIncludeOuterIntergerStructSequential = Helper.NewIncludeOuterIntergerStructSequential(32, 32);
+ IncludeOuterIntergerStructSequential cloneIncludeOuterIntergerStructSequential = Helper.NewIncludeOuterIntergerStructSequential(32, 32);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByValInOut13...");
+ if (!MarshalStructAsParam_AsSeqByValInOut13(sourceIncludeOuterIntergerStructSequential))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByValInOut13.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateIncludeOuterIntergerStructSequential(sourceIncludeOuterIntergerStructSequential, cloneIncludeOuterIntergerStructSequential, "MarshalStructAsParam_AsSeqByValInOut13"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.S11Id:
+ S11 sourceS11 = Helper.NewS11((int*)new Int32(), 32);
+ S11 cloneS11 = Helper.NewS11((int*)new Int64(), 32);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByValInOut14...");
+ if (!MarshalStructAsParam_AsSeqByValInOut14(sourceS11))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByValInOut14.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateS11(sourceS11, cloneS11, "MarshalStructAsParam_AsSeqByValInOut14"))
+ {
+ failures++;
+ }
+ break;
+ default:
+ Console.WriteLine("\tThere is not the struct id");
+ failures++;
+ break;
+ }
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine("Unexpected Exception:" + e.ToString());
+ failures++;
+ }
+
+ }
+
+ [SecuritySafeCritical]
+ unsafe private static void MarshalStructAsParam_AsSeqByRefInOut(StructID id)
+ {
+ try
+ {
+ switch (id)
+ {
+ case StructID.InnerSequentialId:
+ InnerSequential source_is = Helper.NewInnerSequential(1, 1.0F, "some string");
+ InnerSequential change_is = Helper.NewInnerSequential(77, 77.0F, "changed string");
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRefInOut...");
+ if (!MarshalStructAsParam_AsSeqByRefInOut(ref source_is))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRefInOut.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateInnerSequential(source_is, change_is, "MarshalStructAsParam_AsSeqByRefInOut"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.InnerArraySequentialId:
+ InnerArraySequential source_ias = Helper.NewInnerArraySequential(1, 1.0F, "some string");
+ InnerArraySequential change_ias = Helper.NewInnerArraySequential(77, 77.0F, "changed string");
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRefInOut2...");
+ if (!MarshalStructAsParam_AsSeqByRefInOut2(ref source_ias))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRefInOut2.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateInnerArraySequential(source_ias, change_ias, "MarshalStructAsParam_AsSeqByRefInOut2"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.CharSetAnsiSequentialId:
+ CharSetAnsiSequential source_csas = Helper.NewCharSetAnsiSequential("some string", 'c');
+ CharSetAnsiSequential changeStr1 = Helper.NewCharSetAnsiSequential("change string", 'n');
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRefInOut3...");
+ if (!MarshalStructAsParam_AsSeqByRefInOut3(ref source_csas))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRefInOut3.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateCharSetAnsiSequential(source_csas, changeStr1, "MarshalStructAsParam_AsSeqByRefInOut3"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.CharSetUnicodeSequentialId:
+ CharSetUnicodeSequential source_csus = Helper.NewCharSetUnicodeSequential("some string", 'c');
+ CharSetUnicodeSequential change_csus = Helper.NewCharSetUnicodeSequential("change string", 'n');
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRefInOut4...");
+ if (!MarshalStructAsParam_AsSeqByRefInOut4(ref source_csus))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRefInOut4.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateCharSetUnicodeSequential(source_csus, change_csus, "MarshalStructAsParam_AsSeqByRefInOut4"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.NumberSequentialId:
+ NumberSequential source_ns = Helper.NewNumberSequential(Int32.MinValue, UInt32.MaxValue, short.MinValue, ushort.MaxValue, byte.MinValue, sbyte.MaxValue, Int16.MinValue, UInt16.MaxValue, -1234567890, 1234567890, 32.0F, 3.2);
+ NumberSequential change_ns = Helper.NewNumberSequential(0, 32, 0, 16, 0, 8, 0, 16, 0, 64, 64.0F, 6.4);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRefInOut6...");
+ if (!MarshalStructAsParam_AsSeqByRefInOut6(ref source_ns))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRefInOut6.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateNumberSequential(source_ns, change_ns, "MarshalStructAsParam_AsSeqByRefInOut6"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.S3Id:
+ int[] iarr = new int[256];
+ int[] icarr = new int[256];
+ InitialArray(iarr, icarr);
+
+ S3 sourceS3 = Helper.NewS3(true, "some string", iarr);
+ S3 changeS3 = Helper.NewS3(false, "change string", icarr);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRefInOut7...");
+ if (!MarshalStructAsParam_AsSeqByRefInOut7(ref sourceS3))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRefInOut7.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateS3(sourceS3, changeS3, "MarshalStructAsParam_AsSeqByRefInOut7"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.S5Id:
+ Enum1 enums = Enum1.e1;
+ Enum1 enumch = Enum1.e2;
+ S5 sourceS5 = Helper.NewS5(32, "some string", enums);
+ S5 changeS5 = Helper.NewS5(64, "change string", enumch);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRefInOut8...");
+ if (!MarshalStructAsParam_AsSeqByRefInOut8(ref sourceS5))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRefInOut8.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateS5(sourceS5, changeS5, "MarshalStructAsParam_AsSeqByRefInOut8"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.StringStructSequentialAnsiId:
+ strOne = new String('a', 512);
+ strTwo = new String('b', 512);
+ StringStructSequentialAnsi source_sssa = Helper.NewStringStructSequentialAnsi(strOne, strTwo);
+ StringStructSequentialAnsi change_sssa = Helper.NewStringStructSequentialAnsi(strTwo, strOne);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRefInOut9...");
+ if (!MarshalStructAsParam_AsSeqByRefInOut9(ref source_sssa))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRefInOut9.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateStringStructSequentialAnsi(source_sssa, change_sssa, "MarshalStructAsParam_AsSeqByRefInOut9"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.StringStructSequentialUnicodeId:
+ strOne = new String('a', 256);
+ strTwo = new String('b', 256);
+ StringStructSequentialUnicode source_sssu = Helper.NewStringStructSequentialUnicode(strOne, strTwo);
+ StringStructSequentialUnicode change_sssu = Helper.NewStringStructSequentialUnicode(strTwo, strOne);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRefInOut10...");
+ if (!MarshalStructAsParam_AsSeqByRefInOut10(ref source_sssu))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRefInOut10.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateStringStructSequentialUnicode(source_sssu, change_sssu, "MarshalStructAsParam_AsSeqByRefInOut10"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.S8Id:
+ S8 sourceS8 = Helper.NewS8("hello", true, 10, 128, 128, 32);
+ S8 changeS8 = Helper.NewS8("world", false, 1, 256, 256, 64);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRefInOut11...");
+ if (!MarshalStructAsParam_AsSeqByRefInOut11(ref sourceS8))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRefInOut11.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateS8(sourceS8, changeS8, "MarshalStructAsParam_AsSeqByRefInOut11"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.S9Id:
+ S9 sourceS9 = Helper.NewS9(128, new TestDelegate1(testMethod));
+ S9 changeS9 = Helper.NewS9(256, null);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRefInOut12...");
+ if (!MarshalStructAsParam_AsSeqByRefInOut12(ref sourceS9))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRefInOut12.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateS9(sourceS9, changeS9, "MarshalStructAsParam_AsSeqByRefInOut12"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.IncludeOuterIntergerStructSequentialId:
+ IncludeOuterIntergerStructSequential sourceIncludeOuterIntergerStructSequential = Helper.NewIncludeOuterIntergerStructSequential(32, 32);
+ IncludeOuterIntergerStructSequential changeIncludeOuterIntergerStructSequential = Helper.NewIncludeOuterIntergerStructSequential(64, 64);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRefInOut13...");
+ if (!MarshalStructAsParam_AsSeqByRefInOut13(ref sourceIncludeOuterIntergerStructSequential))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRefInOut13.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateIncludeOuterIntergerStructSequential(sourceIncludeOuterIntergerStructSequential, changeIncludeOuterIntergerStructSequential, "MarshalStructAsParam_AsSeqByRefInOut13"))
+ {
+ failures++;
+ }
+ break;
+ case StructID.S11Id:
+ S11 sourceS11 = Helper.NewS11((int*)new Int32(), 32);
+ S11 changeS11 = Helper.NewS11((int*)(32), 64);
+
+ Console.WriteLine("\tCalling MarshalStructAsParam_AsSeqByRefInOut14...");
+ if (!MarshalStructAsParam_AsSeqByRefInOut14(ref sourceS11))
+ {
+ Console.WriteLine("\tFAILED! Managed to Native failed in MarshalStructAsParam_AsSeqByRefInOut14.Expected:True;Actual:False");
+ failures++;
+ }
+ if (!Helper.ValidateS11(sourceS11, changeS11, "MarshalStructAsParam_AsSeqByRefInOut14"))
+ {
+ failures++;
+ }
+ break;
+ default:
+ Console.WriteLine("\tThere is not the struct id");
+ failures++;
+ break;
+ }
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine("Unexpected Exception:" + e.ToString());
+ failures++;
+ }
+ }
+ #endregion
+
+ [SecuritySafeCritical]
+ private static void RunMarshalSeqStructAsParamByVal()
+ {
+ Console.WriteLine("\nVerify marshal sequential layout struct as param as ByVal");
+ MarshalStructAsParam_AsSeqByVal(StructID.InnerSequentialId);
+ MarshalStructAsParam_AsSeqByVal(StructID.InnerArraySequentialId);
+ MarshalStructAsParam_AsSeqByVal(StructID.CharSetAnsiSequentialId);
+ MarshalStructAsParam_AsSeqByVal(StructID.CharSetUnicodeSequentialId);
+ MarshalStructAsParam_AsSeqByVal(StructID.NumberSequentialId);
+ MarshalStructAsParam_AsSeqByVal(StructID.S3Id);
+ MarshalStructAsParam_AsSeqByVal(StructID.S5Id);
+ MarshalStructAsParam_AsSeqByVal(StructID.StringStructSequentialAnsiId);
+ MarshalStructAsParam_AsSeqByVal(StructID.StringStructSequentialUnicodeId);
+ MarshalStructAsParam_AsSeqByVal(StructID.S8Id);
+ MarshalStructAsParam_AsSeqByVal(StructID.S9Id);
+ MarshalStructAsParam_AsSeqByVal(StructID.IncludeOuterIntergerStructSequentialId);
+ MarshalStructAsParam_AsSeqByVal(StructID.S11Id);
+ }
+
+ [SecuritySafeCritical]
+ private static void RunMarshalSeqStructAsParamByRef()
+ {
+ Console.WriteLine("\nVerify marshal sequential layout struct as param as ByRef");
+ MarshalStructAsParam_AsSeqByRef(StructID.InnerSequentialId);
+ MarshalStructAsParam_AsSeqByRef(StructID.InnerArraySequentialId);
+ MarshalStructAsParam_AsSeqByRef(StructID.CharSetAnsiSequentialId);
+ MarshalStructAsParam_AsSeqByRef(StructID.CharSetUnicodeSequentialId);
+ MarshalStructAsParam_AsSeqByRef(StructID.NumberSequentialId);
+ MarshalStructAsParam_AsSeqByRef(StructID.S3Id);
+ MarshalStructAsParam_AsSeqByRef(StructID.S5Id);
+ MarshalStructAsParam_AsSeqByRef(StructID.StringStructSequentialAnsiId);
+ MarshalStructAsParam_AsSeqByRef(StructID.StringStructSequentialUnicodeId);
+ MarshalStructAsParam_AsSeqByRef(StructID.S8Id);
+ MarshalStructAsParam_AsSeqByRef(StructID.S9Id);
+ MarshalStructAsParam_AsSeqByRef(StructID.IncludeOuterIntergerStructSequentialId);
+ MarshalStructAsParam_AsSeqByRef(StructID.S11Id);
+ }
+
+ [SecuritySafeCritical]
+ private static void RunMarshalSeqStructAsParamByValIn()
+ {
+ Console.WriteLine("\nVerify marshal sequential layout struct as param as ByValIn");
+ MarshalStructAsParam_AsSeqByValIn(StructID.InnerSequentialId);
+ MarshalStructAsParam_AsSeqByValIn(StructID.InnerArraySequentialId);
+ MarshalStructAsParam_AsSeqByValIn(StructID.CharSetAnsiSequentialId);
+ MarshalStructAsParam_AsSeqByValIn(StructID.CharSetUnicodeSequentialId);
+ MarshalStructAsParam_AsSeqByValIn(StructID.NumberSequentialId);
+ MarshalStructAsParam_AsSeqByValIn(StructID.S3Id);
+ MarshalStructAsParam_AsSeqByValIn(StructID.S5Id);
+ MarshalStructAsParam_AsSeqByValIn(StructID.StringStructSequentialAnsiId);
+ MarshalStructAsParam_AsSeqByValIn(StructID.StringStructSequentialUnicodeId);
+ MarshalStructAsParam_AsSeqByValIn(StructID.S8Id);
+ MarshalStructAsParam_AsSeqByValIn(StructID.S9Id);
+ MarshalStructAsParam_AsSeqByValIn(StructID.IncludeOuterIntergerStructSequentialId);
+ MarshalStructAsParam_AsSeqByValIn(StructID.S11Id);
+ }
+
+ [SecuritySafeCritical]
+ private static void RunMarshalSeqStructAsParamByRefIn()
+ {
+ Console.WriteLine("\nVerify marshal sequential layout struct as param as ByRefIn");
+ MarshalStructAsParam_AsSeqByRefIn(StructID.InnerSequentialId);
+ MarshalStructAsParam_AsSeqByRefIn(StructID.InnerArraySequentialId);
+ MarshalStructAsParam_AsSeqByRefIn(StructID.CharSetAnsiSequentialId);
+ MarshalStructAsParam_AsSeqByRefIn(StructID.CharSetUnicodeSequentialId);
+ MarshalStructAsParam_AsSeqByRefIn(StructID.NumberSequentialId);
+ MarshalStructAsParam_AsSeqByRefIn(StructID.S3Id);
+ MarshalStructAsParam_AsSeqByRefIn(StructID.S5Id);
+ MarshalStructAsParam_AsSeqByRefIn(StructID.StringStructSequentialAnsiId);
+ MarshalStructAsParam_AsSeqByRefIn(StructID.StringStructSequentialUnicodeId);
+ MarshalStructAsParam_AsSeqByRefIn(StructID.S8Id);
+ MarshalStructAsParam_AsSeqByRefIn(StructID.S9Id);
+ MarshalStructAsParam_AsSeqByRefIn(StructID.IncludeOuterIntergerStructSequentialId);
+ MarshalStructAsParam_AsSeqByRefIn(StructID.S11Id);
+ }
+
+ [SecuritySafeCritical]
+ private static void RunMarshalSeqStructAsParamByValOut()
+ {
+ Console.WriteLine("\nVerify marshal sequential layout struct as param as ByValOut");
+ MarshalStructAsParam_AsSeqByValOut(StructID.InnerSequentialId);
+ MarshalStructAsParam_AsSeqByValOut(StructID.InnerArraySequentialId);
+ MarshalStructAsParam_AsSeqByValOut(StructID.CharSetAnsiSequentialId);
+ MarshalStructAsParam_AsSeqByValOut(StructID.CharSetUnicodeSequentialId);
+ MarshalStructAsParam_AsSeqByValOut(StructID.NumberSequentialId);
+ MarshalStructAsParam_AsSeqByValOut(StructID.S3Id);
+ MarshalStructAsParam_AsSeqByValOut(StructID.S5Id);
+ MarshalStructAsParam_AsSeqByValOut(StructID.StringStructSequentialAnsiId);
+ MarshalStructAsParam_AsSeqByValOut(StructID.StringStructSequentialUnicodeId);
+ MarshalStructAsParam_AsSeqByValOut(StructID.S8Id);
+ MarshalStructAsParam_AsSeqByValOut(StructID.S9Id);
+ MarshalStructAsParam_AsSeqByValOut(StructID.IncludeOuterIntergerStructSequentialId);
+ MarshalStructAsParam_AsSeqByValOut(StructID.S11Id);
+ }
+
+ [SecuritySafeCritical]
+ private static void RunMarshalSeqStructAsParamByRefOut()
+ {
+ Console.WriteLine("\nVerify marshal sequential layout struct as param as ByRefOut");
+ MarshalStructAsParam_AsSeqByRefOut(StructID.InnerSequentialId);
+ MarshalStructAsParam_AsSeqByRefOut(StructID.InnerArraySequentialId);
+ MarshalStructAsParam_AsSeqByRefOut(StructID.CharSetAnsiSequentialId);
+ MarshalStructAsParam_AsSeqByRefOut(StructID.CharSetUnicodeSequentialId);
+ MarshalStructAsParam_AsSeqByRefOut(StructID.NumberSequentialId);
+ MarshalStructAsParam_AsSeqByRefOut(StructID.S3Id);
+ MarshalStructAsParam_AsSeqByRefOut(StructID.S5Id);
+ MarshalStructAsParam_AsSeqByRefOut(StructID.StringStructSequentialAnsiId);
+ MarshalStructAsParam_AsSeqByRefOut(StructID.StringStructSequentialUnicodeId);
+ MarshalStructAsParam_AsSeqByRefOut(StructID.S8Id);
+ MarshalStructAsParam_AsSeqByRefOut(StructID.S9Id);
+ MarshalStructAsParam_AsSeqByRefOut(StructID.IncludeOuterIntergerStructSequentialId);
+ MarshalStructAsParam_AsSeqByRefOut(StructID.S11Id);
+ }
+
+ [SecuritySafeCritical]
+ private static void RunMarshalSeqStructAsParamByValInOut()
+ {
+ Console.WriteLine("\nVerify marshal sequential layout struct as param as ByValInOut");
+ MarshalStructAsParam_AsSeqByValInOut(StructID.InnerSequentialId);
+ MarshalStructAsParam_AsSeqByValInOut(StructID.InnerArraySequentialId);
+ MarshalStructAsParam_AsSeqByValInOut(StructID.CharSetAnsiSequentialId);
+ MarshalStructAsParam_AsSeqByValInOut(StructID.CharSetUnicodeSequentialId);
+ MarshalStructAsParam_AsSeqByValInOut(StructID.NumberSequentialId);
+ MarshalStructAsParam_AsSeqByValInOut(StructID.S3Id);
+ MarshalStructAsParam_AsSeqByValInOut(StructID.S5Id);
+ MarshalStructAsParam_AsSeqByValInOut(StructID.StringStructSequentialAnsiId);
+ MarshalStructAsParam_AsSeqByValInOut(StructID.StringStructSequentialUnicodeId);
+ MarshalStructAsParam_AsSeqByValInOut(StructID.S8Id);
+ MarshalStructAsParam_AsSeqByValInOut(StructID.S9Id);
+ MarshalStructAsParam_AsSeqByValInOut(StructID.IncludeOuterIntergerStructSequentialId);
+ MarshalStructAsParam_AsSeqByValInOut(StructID.S11Id);
+ }
+
+ [SecuritySafeCritical]
+ private static void RunMarshalSeqStructAsParamByRefInOut()
+ {
+ Console.WriteLine("\nVerify marshal sequential layout struct as param as ByRefInOut");
+ MarshalStructAsParam_AsSeqByRefInOut(StructID.InnerSequentialId);
+ MarshalStructAsParam_AsSeqByRefInOut(StructID.InnerArraySequentialId);
+ MarshalStructAsParam_AsSeqByRefInOut(StructID.CharSetAnsiSequentialId);
+ MarshalStructAsParam_AsSeqByRefInOut(StructID.CharSetUnicodeSequentialId);
+ MarshalStructAsParam_AsSeqByRefInOut(StructID.NumberSequentialId);
+ MarshalStructAsParam_AsSeqByRefInOut(StructID.S3Id);
+ MarshalStructAsParam_AsSeqByRefInOut(StructID.S5Id);
+ MarshalStructAsParam_AsSeqByRefInOut(StructID.StringStructSequentialAnsiId);
+ MarshalStructAsParam_AsSeqByRefInOut(StructID.StringStructSequentialUnicodeId);
+ MarshalStructAsParam_AsSeqByRefInOut(StructID.S8Id);
+ MarshalStructAsParam_AsSeqByRefInOut(StructID.S9Id);
+ MarshalStructAsParam_AsSeqByRefInOut(StructID.IncludeOuterIntergerStructSequentialId);
+ MarshalStructAsParam_AsSeqByRefInOut(StructID.S11Id);
+ }
+}
+
+
+ \ No newline at end of file
diff --git a/tests/src/Interop/StructMarshalling/PInvoke/MarshalStructAsLayoutSeq.csproj b/tests/src/Interop/StructMarshalling/PInvoke/MarshalStructAsLayoutSeq.csproj
new file mode 100644
index 0000000000..868a701603
--- /dev/null
+++ b/tests/src/Interop/StructMarshalling/PInvoke/MarshalStructAsLayoutSeq.csproj
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>MarshalStructAsLayoutSeq</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{F1E66554-8C8E-4141-85CF-D0CD6A0CD0B0}</ProjectGuid>
+ <OutputType>exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ <DefineConstants>$(DefineConstants);STATIC</DefineConstants>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="MarshalStructAsLayoutSeq.cs" />
+ <Compile Include="Struct.cs" />
+ <Compile Include="Helper.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="project.json" />
+ </ItemGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\..\..\Common\CoreCLRTestLibrary\CoreCLRTestLibrary.csproj">
+ <Project>{c8c0dc74-fac4-45b1-81fe-70c4808366e0}</Project>
+ <Name>CoreCLRTestLibrary</Name>
+ </ProjectReference>
+ <ProjectReference Include="CMakeLists.txt">
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+</Project> \ No newline at end of file
diff --git a/tests/src/Interop/StructMarshalling/PInvoke/MarshalStructAsParamDLL.cpp b/tests/src/Interop/StructMarshalling/PInvoke/MarshalStructAsParamDLL.cpp
new file mode 100644
index 0000000000..fe9ceeaa40
--- /dev/null
+++ b/tests/src/Interop/StructMarshalling/PInvoke/MarshalStructAsParamDLL.cpp
@@ -0,0 +1,1145 @@
+#include "MarshalStructAsParamDLL.h"
+
+///////////////////////////////////////////////////////////////////////////////////
+// EXPORTED METHODS
+///////////////////////////////////////////////////////////////////////////////////
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByVal(InnerSequential inner)
+{
+ if(!IsCorrectInnerSequential(&inner))
+ {
+ printf("\tMarshalStructAsParam_AsSeqByVal: InnerSequential param not as expected\n");
+ PrintInnerSequential(&inner,"inner");
+ return FALSE;
+ }
+ ChangeInnerSequential(&inner);
+ return TRUE;
+}
+
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByRef(InnerSequential* inner)
+{
+ if(!IsCorrectInnerSequential(inner))
+ {
+ printf("\tMarshalStructAsParam_AsSeqByRef: InnerSequential param not as expected\n");
+ PrintInnerSequential(inner,"inner");
+ return FALSE;
+ }
+ ChangeInnerSequential(inner);
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByRefIn(InnerSequential* inner)
+{
+ if(!IsCorrectInnerSequential(inner))
+ {
+ printf("\tMarshalStructAsParam_AsSeqByRefIn: InnerSequential param not as expected\n");
+ PrintInnerSequential(inner,"inner");
+ return FALSE;
+ }
+ ChangeInnerSequential(inner);
+ return TRUE;
+}
+
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByValOut(InnerSequential inner)
+{
+ if(!IsCorrectInnerSequential(&inner))
+ {
+ printf("\tMarshalStructAsParam_AsSeqByValOut:NNER param not as expected\n");
+ PrintInnerSequential(&inner,"inner");
+ return FALSE;
+ }
+ ChangeInnerSequential(&inner);
+ return TRUE;
+}
+
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByRefOut(InnerSequential* inner)
+{
+ ChangeInnerSequential(inner);
+ return TRUE;
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByVal2(InnerArraySequential outer)
+{
+ if(!IsCorrectInnerArraySequential(&outer))
+ {
+ printf("\tMarshalStructAsParam_AsSeqByVal2: InnerArraySequential param not as expected\n");
+ PrintInnerArraySequential(&outer,"outer");
+ return FALSE;
+ }
+ ChangeInnerArraySequential(&outer);
+ return TRUE;
+}
+
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByRef2(InnerArraySequential* outer)
+{
+ if(!IsCorrectInnerArraySequential(outer))
+ {
+ printf("\tMarshalStructAsParam_AsSeqByRef2: InnerArraySequential param not as expected\n");
+ PrintInnerArraySequential(outer,"outer");
+ return FALSE;
+ }
+ ChangeInnerArraySequential(outer);
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByRefIn2(InnerArraySequential* outer)
+{
+ if(!IsCorrectInnerArraySequential(outer))
+ {
+ printf("\tMarshalStructAsParam_AsSeqByRefIn2: InnerArraySequential param not as expected\n");
+ PrintInnerArraySequential(outer,"inner");
+ return FALSE;
+ }
+ ChangeInnerArraySequential(outer);
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByValOut2(InnerArraySequential outer)
+{
+ if(!IsCorrectInnerArraySequential(&outer))
+ {
+ printf("\tMarshalStructAsParam_AsSeqByVal2:InnerArraySequential param not as expected\n");
+ PrintInnerArraySequential(&outer,"outer");
+ return FALSE;
+ }
+ for(int i = 0; i < NumArrElements; i++)
+ {
+ outer.arr[i].f1 = 77;
+ outer.arr[i].f2 = 77.0;
+ }
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByRefOut2(InnerArraySequential* outer)
+{
+ for(int i = 0;i<NumArrElements;i++)
+ {
+ if(outer->arr[i].f1 != 0 || outer->arr[i].f2 != 0.0)
+ {
+ printf("\tMarshalStructAsParam_AsSeqByRefOut2: InnerArraySequential param not as expected\n");
+ return FALSE;
+ }
+ }
+ ChangeInnerArraySequential(outer);
+ return TRUE;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByVal3(CharSetAnsiSequential str1)
+{
+ if(!IsCorrectCharSetAnsiSequential(&str1))
+ {
+ printf("\tMarshalStructAsParam_AsSeqByVal3:strCharStr param not as expected\n");
+ PrintCharSetAnsiSequential(&str1,"CharSetAnsiSequential");
+ return FALSE;
+ }
+ ChangeCharSetAnsiSequential(&str1);
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByRef3(CharSetAnsiSequential* str1)
+{
+ if(!IsCorrectCharSetAnsiSequential(str1))
+ {
+ printf("\tMarshalStructAsParam_AsSeqByRef3:strCharStr param not as expected\n");
+ PrintCharSetAnsiSequential(str1,"CharSetAnsiSequential");
+ return FALSE;
+ }
+ ChangeCharSetAnsiSequential(str1);
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByRefIn3(CharSetAnsiSequential* str1)
+{
+ if(!IsCorrectCharSetAnsiSequential(str1))
+ {
+ printf("\tMarshalStructAsParam_AsSeqByRefIn3:strCharStr param not as expected\n");
+ PrintCharSetAnsiSequential(str1,"CharSetAnsiSequential");
+ return FALSE;
+ }
+ ChangeCharSetAnsiSequential(str1);
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByValOut3(CharSetAnsiSequential str1)
+{
+ if(!IsCorrectCharSetAnsiSequential(&str1))
+ {
+ printf("\tMarshalStructAsParam_AsSeqByVal3:strCharStr param not as expected\n");
+ PrintCharSetAnsiSequential(&str1,"CharSetAnsiSequential");
+ return FALSE;
+ }
+ str1.f2 = 'n';
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByRefOut3(CharSetAnsiSequential* str1)
+{
+ char const* strSource = "change string";
+ int len = strlen(strSource);
+ LPCSTR temp = (LPCSTR)TP_CoTaskMemAlloc((sizeof(char)*len)+1);
+ if(temp != NULL)
+ {
+ TP_CoTaskMemFree((void*)(str1->f1));
+ strcpy((char*)temp,strSource);
+ str1->f1 = temp;
+ str1->f2 = 'n';
+ return TRUE;
+ }
+ else
+ {
+ printf("Memory Allocated Failed !");
+ return FALSE;
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByVal4(CharSetUnicodeSequential str1)
+{
+ if(!IsCorrectCharSetUnicodeSequential(&str1))
+ {
+ printf("\tMarshalStructAsParam_AsSeqByVal4:CharSetUnicodeSequential param not as expected\n");
+ PrintCharSetUnicodeSequential(&str1,"CharSetUnicodeSequential");
+ return FALSE;
+ }
+ ChangeCharSetUnicodeSequential(&str1);
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByRef4(CharSetUnicodeSequential* str1)
+{
+ if(!IsCorrectCharSetUnicodeSequential(str1))
+ {
+ printf("\tMarshalStructAsParam_AsSeqByRef4:strCharStr param not as expected\n");
+ PrintCharSetUnicodeSequential(str1,"CharSetUnicodeSequential");
+ return FALSE;
+ }
+ ChangeCharSetUnicodeSequential(str1);
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByRefIn4(CharSetUnicodeSequential* str1)
+{
+ if(!IsCorrectCharSetUnicodeSequential(str1))
+ {
+ printf("\tMarshalStructAsParam_AsSeqByRefIn4:strCharStr param not as expected\n");
+ PrintCharSetUnicodeSequential(str1,"CharSetUnicodeSequential");
+ return FALSE;
+ }
+ ChangeCharSetUnicodeSequential(str1);
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByValOut4(CharSetUnicodeSequential str1)
+{
+ if(!IsCorrectCharSetUnicodeSequential(&str1))
+ {
+ printf("\tMarshalStructAsParam_AsSeqByVal4:strCharStrOut2 param not as expected\n");
+ PrintCharSetUnicodeSequential(&str1,"CharSetUnicodeSequential");
+ return FALSE;
+ }
+ str1.f2 = L'n';
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByRefOut4(CharSetUnicodeSequential* str1)
+{
+ if(str1->f1 != 0 || str1->f2 != 0)
+ return false;
+ ChangeCharSetUnicodeSequential(str1);
+ return true;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByVal6(NumberSequential str1)
+{
+ if(!IsCorrectNumberSequential(&str1))
+ {
+ printf("\tManaged to Native failed in MarshalStructAsParam_AsSeqByVal6:NumberSequential param not as expected\n");
+ PrintNumberSequential(&str1, "str1");
+ return FALSE;
+ }
+ ChangeNumberSequential(&str1);
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByRef6(NumberSequential* str1)
+{
+ if(!IsCorrectNumberSequential(str1))
+ {
+ printf("\tManaged to Native failed in MarshalStructAsParam_AsSeqByRef6:NumberSequential param not as expected\n");
+ PrintNumberSequential(str1, "str1");
+ return FALSE;
+ }
+ ChangeNumberSequential(str1);
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByRefIn6(NumberSequential* str1)
+{
+ if(!IsCorrectNumberSequential(str1))
+ {
+ printf("\tManaged to Native failed in MarshalStructAsParam_AsSeqByRefIn6:NumberSequential param not as expected\n");
+ PrintNumberSequential(str1, "str1");
+ return FALSE;
+ }
+ ChangeNumberSequential(str1);
+ return TRUE;
+}
+
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByValOut6(NumberSequential str1)
+{
+ if(!IsCorrectNumberSequential(&str1))
+ {
+ printf("\tManaged to Native failed in MarshalStructAsParam_AsSeqByValOut6:NumberSequential param not as expected\n");
+ PrintNumberSequential(&str1, "str1");
+ return FALSE;
+ }
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByRefOut6(NumberSequential* str1)
+{
+ ChangeNumberSequential(str1);
+ return TRUE;
+}
+
+////////////////////////////////////////////////////////////////////////////////////
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByVal7(S3 str1)
+{
+ if(!IsCorrectS3(&str1))
+ {
+ printf("\tManaged to Native failed in MarshalStructAsParam_AsSeqByVal7:S3 param not as expected\n");
+ PrintS3(&str1, "str1");
+ return FALSE;
+ }
+ ChangeS3(&str1);
+ return TRUE;
+}
+
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByRef7(S3* str1)
+{
+ if(!IsCorrectS3(str1))
+ {
+ printf("\tManaged to Native failed in MarshalStructAsParam_AsSeqByRef7:S3 param not as expected\n");
+ return FALSE;
+ }
+ ChangeS3(str1);
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByRefIn7(S3* str1)
+{
+ if(!IsCorrectS3(str1))
+ {
+ printf("\tManaged to Native failed in MarshalStructAsParam_AsSeqByRef7:S3 param not as expected\n");
+ PrintS3(str1, "str1");
+ return FALSE;
+ }
+ ChangeS3(str1);
+ return TRUE;
+}
+
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByValOut7(S3 str1)
+{
+ if(!IsCorrectS3(&str1))
+ {
+ printf("\tManaged to Native failed in MarshalStructAsParam_AsSeqByValOut7:S3 param not as expected\n");
+ PrintS3(&str1, "str1");
+ return FALSE;
+ }
+ str1.flag = false;
+ return TRUE;
+
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByRefOut7(S3* str1)
+{
+ ChangeS3(str1);
+ return TRUE;
+}
+////////////////////////////////////////////////////////////////////////////////////////
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByVal8(S5 str1)
+{
+ if(!IsCorrectS5(&str1))
+ {
+ printf("\tMarshalStructAsParam_AsSeqByVal8:S5 param not as expected\n");
+ PrintS5(&str1, "str1");
+ return FALSE;
+ }
+ ChangeS5(&str1);
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByRef8(S5* str1)
+{
+ if(!IsCorrectS5(str1))
+ {
+ printf("\tMarshalStructAsParam_AsSeqByRef8:S5 param not as expected\n");
+ PrintS5(str1, "str1");
+ return FALSE;
+ }
+ ChangeS5(str1);
+ return TRUE;
+}
+
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByRefIn8(S5* str1)
+{
+ if(!IsCorrectS5(str1))
+ {
+ printf("\tMarshalStructAsParam_AsSeqByRefIn8:S5 param not as expected\n");
+ PrintS5(str1, "str1");
+ return FALSE;
+ }
+ ChangeS5(str1);
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByRefOut8(S5* str1)
+{
+ ChangeS5(str1);
+ return TRUE;
+}
+
+
+/////////////////////////////////////////////////////////////////////////////////////////////////////////////
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByVal9(StringStructSequentialAnsi str1)
+{
+ if(!IsCorrectStringStructSequentialAnsi(&str1))
+ {
+ printf("\tMarshalStructAsParam_AsSeqByVal9:StringStructSequentialAnsi param not as expected\n");
+ PrintStringStructSequentialAnsi(&str1, "str1");
+ return FALSE;
+ }
+ ChangeStringStructSequentialAnsi(&str1);
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByRef9(StringStructSequentialAnsi* str1)
+{
+ if(!IsCorrectStringStructSequentialAnsi(str1))
+ {
+ printf("\tMarshalStructAsParam_AsSeqByRef9:StringStructSequentialAnsi param not as expected\n");
+ PrintStringStructSequentialAnsi(str1, "str1");
+ return FALSE;
+ }
+ ChangeStringStructSequentialAnsi(str1);
+ return TRUE;
+}
+
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByRefIn9(StringStructSequentialAnsi* str1)
+{
+ if(!IsCorrectStringStructSequentialAnsi(str1))
+ {
+ printf("\tMarshalStructAsParam_AsSeqByRefIn9:StringStructSequentialAnsi param not as expected\n");
+ PrintStringStructSequentialAnsi(str1, "str1");
+ return FALSE;
+ }
+ ChangeStringStructSequentialAnsi(str1);
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByValOut9(StringStructSequentialAnsi str1)
+{
+ if(!IsCorrectStringStructSequentialAnsi(&str1))
+ {
+ printf("\tMarshalStructAsParam_AsSeqByVal9:StringStructSequentialAnsi param not as expected\n");
+ PrintStringStructSequentialAnsi(&str1, "str1");
+ return FALSE;
+ }
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByRefOut9(StringStructSequentialAnsi* str1)
+{
+ ChangeStringStructSequentialAnsi(str1);
+
+ return TRUE;
+}
+
+
+/////////////////////////////////////////////////////////////////////////////////////////////////////////////
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByVal10(StringStructSequentialUnicode str1)
+{
+ if(!IsCorrectStringStructSequentialUnicode(&str1))
+ {
+ printf("\tMarshalStructAsParam_AsSeqByVal10:StringStructSequentialUnicode param not as expected\n");
+ PrintStringStructSequentialUnicode(&str1, "str1");
+ return FALSE;
+ }
+ ChangeStringStructSequentialUnicode(&str1);
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByRef10(StringStructSequentialUnicode* str1)
+{
+ if(!IsCorrectStringStructSequentialUnicode(str1))
+ {
+ printf("\tMarshalStructAsParam_AsSeqByRef10:StringStructSequentialUnicode param not as expected\n");
+ PrintStringStructSequentialUnicode(str1, "str1");
+ return FALSE;
+ }
+ ChangeStringStructSequentialUnicode(str1);
+ return TRUE;
+}
+
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByRefIn10(StringStructSequentialUnicode* str1)
+{
+ if(!IsCorrectStringStructSequentialUnicode(str1))
+ {
+ printf("\tMarshalStructAsParam_AsSeqByRefIn10:StringStructSequentialUnicode param not as expected\n");
+ PrintStringStructSequentialUnicode(str1, "str1");
+ return FALSE;
+ }
+ ChangeStringStructSequentialUnicode(str1);
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByValOut10(StringStructSequentialUnicode str1)
+{
+ if(!IsCorrectStringStructSequentialUnicode(&str1))
+ {
+ printf("\tMarshalStructAsParam_AsSeqByValOut10:StringStructSequentialUnicode param not as expected\n");
+ PrintStringStructSequentialUnicode(&str1, "str1");
+ return FALSE;
+ }
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByRefOut10(StringStructSequentialUnicode* str1)
+{
+ ChangeStringStructSequentialUnicode(str1);
+
+ return TRUE;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByVal11(S8 str1)
+{
+ if(!IsCorrectS8(&str1))
+ {
+ printf("\tMarshalStructAsParam_AsSeqByVal11:S8 param not as expected\n");
+ PrintS8(&str1,"str1");
+ return FALSE;
+ }
+ ChangeS8(&str1);
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByRef11(S8* str1)
+{
+ if(!IsCorrectS8(str1))
+ {
+ printf("\tMarshalStructAsParam_AsSeqByRef11:S8 param not as expected\n");
+ PrintS8(str1,"str1");
+ return FALSE;
+ }
+ ChangeS8(str1);
+ return TRUE;
+}
+
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByRefIn11(S8* str1)
+{
+ if(!IsCorrectS8(str1))
+ {
+ printf("\tMarshalStructAsParam_AsSeqByRefIn11:S8 param not as expected\n");
+ PrintS8(str1,"str1");
+ return FALSE;
+ }
+ ChangeS8(str1);
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByValOut11(S8 str1)
+{
+ if(!IsCorrectS8(&str1))
+ {
+ printf("\tMarshalStructAsParam_AsSeqByValOut11:S8 param not as expected\n");
+ PrintS8(&str1,"str1");
+ return FALSE;
+ }
+ str1.i32 = 256;
+ str1.ui32 = 256;
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByRefOut11(S8* str1)
+{
+ ChangeS8(str1);
+
+ return TRUE;
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////
+extern "C" void NtestMethod(S9 str1)
+{
+ printf("\tAction of the delegate");
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByVal12(S9 str1)
+{
+ if(str1.i32 != 128 ||
+ str1.myDelegate1 == NULL)
+ {
+ return FALSE;
+ }
+ str1.i32 = 256;
+ str1.myDelegate1 = NULL;
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByRef12(S9* str1)
+{
+ if(str1->i32 != 128 ||
+ str1->myDelegate1 == NULL)
+ {
+ return FALSE;
+ }
+ else
+ {
+ str1->i32 = 256;
+ str1->myDelegate1 = NULL;
+ }
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByRefIn12(S9* str1)
+{
+ if(str1->i32 != 128 ||
+ str1->myDelegate1 == NULL)
+ {
+ return FALSE;
+ }
+ else
+ {
+ str1->i32 = 256;
+ str1->myDelegate1 = NULL;
+ }
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByValOut12(S9 str1)
+{
+ if(str1.i32 != 128 ||
+ str1.myDelegate1 == NULL)
+ {
+ return FALSE;
+ }
+ str1.i32 = 256;
+ str1.myDelegate1 = NULL;
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByRefOut12(S9* str1)
+{
+ str1->i32 = 256;
+ str1->myDelegate1 = NtestMethod;
+ return TRUE;
+}
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByVal13(S10 str1)
+{
+ if(!IsCorrectS10(&str1))
+ {
+ printf("\tMarshalStructAsParam_AsSeqByVal13:S10 param not as expected\n");
+ PrintS10(&str1, "str1");
+ return FALSE;
+ }
+ ChangeS10(&str1);
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByRef13(S10* str1)
+{
+ if(!IsCorrectS10(str1))
+ {
+ printf("\tMarshalStructAsParam_AsSeqByRef13:S10 param not as expected\n");
+ PrintS10(str1, "str1");
+ return FALSE;
+ }
+ ChangeS10(str1);
+ return TRUE;
+}
+
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByRefIn13(S10* str1)
+{
+ if(!IsCorrectS10(str1))
+ {
+ printf("\tMarshalStructAsParam_AsSeqByRefIn13:S10 param not as expected\n");
+ PrintS10(str1, "str1");
+ return FALSE;
+ }
+ ChangeS10(str1);
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByValOut13(S10 str1)
+{
+ if(!IsCorrectS10(&str1))
+ {
+ printf("\tMarshalStructAsParam_AsSeqByValOut13:S10 param not as expected\n");
+ PrintS10(&str1, "str1");
+ return FALSE;
+ }
+ str1.s.i = 64;
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByRefOut13(S10* str1)
+{
+ ChangeS10(str1);
+
+ return TRUE;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByVal14(S11 str1)
+{
+ if( str1.i32 != 0 || str1.i != 32 )
+ return FALSE;
+ str1.i32 = (LPINT)(long)(str1.i);
+ str1.i = 64;
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByRef14(S11* str1)
+{
+ if(str1->i32 != 0 || str1->i != 32)
+ return FALSE;
+ else
+ {
+ str1->i32 = (LPINT)(long)(str1->i);
+ str1->i = 64;
+ return TRUE;
+ }
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByRefIn14(S11* str1)
+{
+ if(str1->i32 != 0 || str1->i != 32)
+ return FALSE;
+ else
+ {
+ str1->i32 = (LPINT)(long)(str1->i);
+ str1->i = 64;
+ return TRUE;
+ }
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByValOut14(S11 str1)
+{
+ if( str1.i32 != (LPINT)32 || str1.i != 32 )
+ return FALSE;
+ str1.i = 64;
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsSeqByRefOut14(S11* str1)
+{
+ str1->i32 = (LPINT)(long)(str1->i);
+ str1->i = 64;
+ return TRUE;
+}
+//////////////////////////////////////////////////////////////////////////////////////
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsExpByValINNER2(INNER2 inner)
+{
+ if(!IsCorrectINNER2(&inner))
+ {
+ printf("\tMarshalStructAsParam_AsSeqByVal: INNER param not as expected\n");
+ PrintINNER2(&inner,"inner");
+ return FALSE;
+ }
+ ChangeINNER2(&inner);
+ return TRUE;
+}
+
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsExpByRefINNER2(INNER2* inner)
+{
+ if(!IsCorrectINNER2(inner))
+ {
+ printf("\tMarshalStructAsParam_AsSeqByRef: INNER param not as expected\n");
+ PrintINNER2(inner,"inner");
+ return FALSE;
+ }
+ ChangeINNER2(inner);
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsExpByRefInINNER2(INNER2* inner)
+{
+ if(!IsCorrectINNER2(inner))
+ {
+ printf("\tMarshalStructAsParam_AsSeqByRefIn: INNER param not as expected\n");
+ PrintINNER2(inner,"inner");
+ return FALSE;
+ }
+ ChangeINNER2(inner);
+ return TRUE;
+}
+
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsExpByValOutINNER2(INNER2 inner)
+{
+ if(!IsCorrectINNER2(&inner))
+ {
+ printf("\tMarshalStructAsParam_AsSeqByValOut:NNER param not as expected\n");
+ PrintINNER2(&inner,"inner");
+ return FALSE;
+ }
+ ChangeINNER2(&inner);
+ return TRUE;
+}
+
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsExpByRefOutINNER2(INNER2* inner)
+{
+ //change struct
+ ChangeINNER2(inner);
+ return TRUE;
+}
+/////////////////////////////////////////////////////////////////////////////////////////////////////
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsExpByValInnerExplicit(InnerExplicit inner)
+{
+ if((&inner)->f1 != 1 || memcmp((&inner)->f3, "some string",11*sizeof(char)) != 0)
+ {
+ printf("\tMarshalStructAsParam_AsExpByVal: INNER param not as expected\n");
+ PrintInnerExplicit(&inner,"inner");
+ return FALSE;
+ }
+ ChangeInnerExplicit(&inner);
+ return TRUE;
+}
+
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsExpByRefInnerExplicit(InnerExplicit* inner)
+{
+ if(inner->f1 != 1 || memcmp(inner->f3, "some string",11*sizeof(char)) != 0)
+ {
+ printf("\tMarshalStructAsParam_AsExpByRef: INNER param not as expected\n");
+ PrintInnerExplicit(inner,"inner");
+ return FALSE;
+ }
+ ChangeInnerExplicit(inner);
+ return TRUE;
+}
+
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsExpByRefInInnerExplicit(InnerExplicit* inner)
+{
+ if(inner->f1 != 1 || memcmp(inner->f3, "some string",11*sizeof(char)) != 0)
+ {
+ printf("\tMarshalStructAsParam_AsExpByRefIn: INNER param not as expected\n");
+ PrintInnerExplicit(inner,"inner");
+ return FALSE;
+ }
+ ChangeInnerExplicit(inner);
+ return TRUE;
+}
+
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsExpByRefOutInnerExplicit(InnerExplicit* inner)
+{
+ if(inner->f1 != 0 || inner->f2 != 0.0)
+ {
+ printf("\tMarshalStructAsParam_AsExpByRefOut: INNER param not as expected\n");
+ return FALSE;
+ }
+ ChangeInnerExplicit(inner);
+ return TRUE;
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsExpByValInnerArrayExplicit(InnerArrayExplicit outer2)
+{
+ for(int i = 0;i<NumArrElements;i++)
+ {
+ if((&outer2)->arr[i].f1 != 1)
+ {
+ printf("\tMarshalStructAsParam_AsExpByVal3:InnerArrayExplicit param not as expected\n");
+ return FALSE;
+ }
+ }
+ if(memcmp((&outer2)->f4,"some string2",12) != 0)
+ {
+ printf("\tMarshalStructAsParam_AsExpByVal3:InnerArrayExplicit param f4 not as expected\n");
+ return FALSE;
+ }
+ return TRUE;
+}
+
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsExpByRefInnerArrayExplicit(InnerArrayExplicit* outer2)
+{
+ for(int i = 0;i<NumArrElements;i++)
+ {
+ if(outer2->arr[i].f1 != 1)
+ {
+ printf("\tMarshalStructAsParam_AsExpByRef3:InnerArrayExplicit param not as expected\n");
+ return FALSE;
+ }
+ }
+ if(memcmp(outer2->f4,"some string2",12) != 0)
+ {
+ printf("\tMarshalStructAsParam_AsExpByRef3:InnerArrayExplicit param f4 not as expected\n");
+ return FALSE;
+ }
+ for(int i =0;i<NumArrElements;i++)
+ {
+ outer2->arr[i].f1 = 77;
+ }
+ char const * temp = "change string2";
+ size_t len = strlen(temp);
+ LPCSTR str = (LPCSTR)TP_CoTaskMemAlloc( sizeof(char)*(len+1) );
+ strcpy((char*)str,temp);
+ outer2->f4 = str;
+ return TRUE;
+}
+
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsExpByRefInInnerArrayExplicit(InnerArrayExplicit* outer2)
+{
+ for(int i = 0;i<NumArrElements;i++)
+ {
+ if(outer2->arr[i].f1 != 1)
+ {
+ printf("\tMarshalStructAsParam_AsExpByRefIn3:InnerArrayExplicit param not as expected\n");
+ return FALSE;
+ }
+ }
+ if(memcmp(outer2->f4, "some string2",12*(sizeof(char))) != 0)
+ {
+ printf("\tMarshalStructAsParam_AsExpByRefIn3:InnerArrayExplicit param f4 not as expected\n");
+ return FALSE;
+ }
+ for(int i =0;i<NumArrElements;i++)
+ {
+ outer2->arr[i].f1 = 77;
+ }
+ char const * temp = "change string2";
+ size_t len = strlen(temp);
+ LPCSTR str = (LPCSTR)TP_CoTaskMemAlloc( sizeof(char)*(len+1) );
+ strcpy((char*)str,temp);
+ outer2->f4 = str;
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsExpByRefOutInnerArrayExplicit(InnerArrayExplicit* outer2)
+{
+ for(int i =0;i<NumArrElements;i++)
+ {
+ outer2->arr[i].f1 = 77;
+ }
+ char const * temp = "change string2";
+ size_t len = strlen(temp);
+ LPCSTR str = (LPCSTR)TP_CoTaskMemAlloc( sizeof(char)*(len+1) );
+ strcpy((char*)str,temp);
+ outer2->f4 = str;
+ return TRUE;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsExpByValOUTER3(OUTER3 outer3)
+{
+ if(!IsCorrectOUTER3(&outer3))
+ {
+ printf("\tMarshalStructAsParam_AsExoByVal4:OUTER3 param not as expected\n");
+ PrintOUTER3(&outer3,"OUTER3");
+ return FALSE;
+ }
+ ChangeOUTER3(&outer3);
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsExpByRefOUTER3(OUTER3* outer3)
+{
+ if(!IsCorrectOUTER3(outer3))
+ {
+ printf("\tMarshalStructAsParam_AsExoByRef4:OUTER3 param not as expected\n");
+ PrintOUTER3(outer3,"OUTER3");
+ return FALSE;
+ }
+ ChangeOUTER3(outer3);
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsExpByRefInOUTER3(OUTER3* outer3)
+{
+ if(!IsCorrectOUTER3(outer3))
+ {
+ printf("\tMarshalStructAsParam_AsExoByRefIn4:OUTER3 param not as expected\n");
+ PrintOUTER3(outer3,"OUTER3");
+ return FALSE;
+ }
+ ChangeOUTER3(outer3);
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsExpByRefOutOUTER3(OUTER3* outer3)
+{
+ ChangeOUTER3(outer3);
+ return TRUE;
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsExpByValU(U str1)
+{
+ if(!IsCorrectU(&str1))
+ {
+ printf("\tMarshalStructAsParam_AsExpByVal6:U param not as expected\n");
+ PrintU(&str1, "str1");
+ return FALSE;
+ }
+ ChangeU(&str1);
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsExpByRefU(U* str1)
+{
+ if(!IsCorrectU(str1))
+ {
+ printf("\tMarshalStructAsParam_AsExpByRef6:U param not as expected\n");
+ PrintU(str1, "str1");
+ return FALSE;
+ }
+ ChangeU(str1);
+ return TRUE;
+}
+
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsExpByRefInU(U* str1)
+{
+ if(!IsCorrectU(str1))
+ {
+ printf("\tMarshalStructAsParam_AsExpByRefIn6:U param not as expected\n");
+ PrintU(str1, "str1");
+ return FALSE;
+ }
+ ChangeU(str1);
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsExpByRefOutU(U* str1)
+{
+ ChangeU(str1);
+
+ return TRUE;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsExpByValByteStructPack2Explicit(ByteStructPack2Explicit str1)
+{
+ if(!IsCorrectByteStructPack2Explicit(&str1))
+ {
+ printf("\tMarshalStructAsParam_AsExpByVal7:ByteStructPack2Explicit param not as expected\n");
+ PrintByteStructPack2Explicit(&str1, "str1");
+ return FALSE;
+ }
+ ChangeByteStructPack2Explicit(&str1);
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsExpByRefByteStructPack2Explicit(ByteStructPack2Explicit* str1)
+{
+ if(!IsCorrectByteStructPack2Explicit(str1))
+ {
+ printf("\tMarshalStructAsParam_AsExpByRef7:ByteStructPack2Explicit param not as expected\n");
+ PrintByteStructPack2Explicit(str1, "str1");
+ return FALSE;
+ }
+ ChangeByteStructPack2Explicit(str1);
+ return TRUE;
+}
+
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsExpByRefInByteStructPack2Explicit(ByteStructPack2Explicit* str1)
+{
+ if(!IsCorrectByteStructPack2Explicit(str1))
+ {
+ printf("\tMarshalStructAsParam_AsExpByRefIn7:ByteStructPack2Explicit param not as expected\n");
+ PrintByteStructPack2Explicit(str1, "str1");
+ return FALSE;
+ }
+ ChangeByteStructPack2Explicit(str1);
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsExpByRefOutByteStructPack2Explicit(ByteStructPack2Explicit* str1)
+{
+ ChangeByteStructPack2Explicit(str1);
+
+ return TRUE;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsExpByValShortStructPack4Explicit(ShortStructPack4Explicit str1)
+{
+ if(!IsCorrectShortStructPack4Explicit(&str1))
+ {
+ printf("\tMarshalStructAsParam_AsExpByVal8:ShortStructPack4Explicit param not as expected\n");
+ PrintShortStructPack4Explicit(&str1, "str1");
+ return FALSE;
+ }
+ ChangeShortStructPack4Explicit(&str1);
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsExpByRefShortStructPack4Explicit(ShortStructPack4Explicit* str1)
+{
+ if(!IsCorrectShortStructPack4Explicit(str1))
+ {
+ printf("\tMarshalStructAsParam_AsExpByRef8:ShortStructPack4Explicit param not as expected\n");
+ PrintShortStructPack4Explicit(str1, "str1");
+ return FALSE;
+ }
+ ChangeShortStructPack4Explicit(str1);
+ return TRUE;
+}
+
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsExpByRefInShortStructPack4Explicit(ShortStructPack4Explicit* str1)
+{
+ if(!IsCorrectShortStructPack4Explicit(str1))
+ {
+ printf("\tMarshalStructAsParam_AsExpByRefIn8:ShortStructPack4Explicit param not as expected\n");
+ PrintShortStructPack4Explicit(str1, "str1");
+ return FALSE;
+ }
+ ChangeShortStructPack4Explicit(str1);
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsExpByRefOutShortStructPack4Explicit(ShortStructPack4Explicit* str1)
+{
+ ChangeShortStructPack4Explicit(str1);
+
+ return TRUE;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsExpByValIntStructPack8Explicit(IntStructPack8Explicit str1)
+{
+ if(!IsCorrectIntStructPack8Explicit(&str1))
+ {
+ printf("\tMarshalStructAsParam_AsExpByVal9:IntStructPack8Explicit param not as expected\n");
+ PrintIntStructPack8Explicit(&str1, "str1");
+ return FALSE;
+ }
+ ChangeIntStructPack8Explicit(&str1);
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsExpByRefIntStructPack8Explicit(IntStructPack8Explicit* str1)
+{
+ if(!IsCorrectIntStructPack8Explicit(str1))
+ {
+ printf("\tMarshalStructAsParam_AsExpByRef9:IntStructPack8Explicit param not as expected\n");
+ PrintIntStructPack8Explicit(str1, "str1");
+ return FALSE;
+ }
+ ChangeIntStructPack8Explicit(str1);
+ return TRUE;
+}
+
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsExpByRefInIntStructPack8Explicit(IntStructPack8Explicit* str1)
+{
+ if(!IsCorrectIntStructPack8Explicit(str1))
+ {
+ printf("\tMarshalStructAsParam_AsExpByRefIn9:IntStructPack8Explicit param not as expected\n");
+ PrintIntStructPack8Explicit(str1, "str1");
+ return FALSE;
+ }
+ ChangeIntStructPack8Explicit(str1);
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsExpByRefOutIntStructPack8Explicit(IntStructPack8Explicit* str1)
+{
+ ChangeIntStructPack8Explicit(str1);
+
+ return TRUE;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsExpByValLongStructPack16Explicit(LongStructPack16Explicit str1)
+{
+ if(!IsCorrectLongStructPack16Explicit(&str1))
+ {
+ printf("\tMarshalStructAsParam_AsExpByVal10:LongStructPack16Explicit param not as expected\n");
+ PrintLongStructPack16Explicit(&str1, "str1");
+ return FALSE;
+ }
+ ChangeLongStructPack16Explicit(&str1);
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsExpByRefLongStructPack16Explicit(LongStructPack16Explicit* str1)
+{
+ if(!IsCorrectLongStructPack16Explicit(str1))
+ {
+ printf("\tMarshalStructAsParam_AsExpByRef10:LongStructPack16Explicit param not as expected\n");
+ PrintLongStructPack16Explicit(str1, "str1");
+ return FALSE;
+ }
+ ChangeLongStructPack16Explicit(str1);
+ return TRUE;
+}
+
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsExpByRefInLongStructPack16Explicit(LongStructPack16Explicit* str1)
+{
+ if(!IsCorrectLongStructPack16Explicit(str1))
+ {
+ printf("\tMarshalStructAsParam_AsExpByRefIn10:LongStructPack16Explicit param not as expected\n");
+ PrintLongStructPack16Explicit(str1, "str1");
+ return FALSE;
+ }
+ ChangeLongStructPack16Explicit(str1);
+ return TRUE;
+}
+extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsExpByRefOutLongStructPack16Explicit(LongStructPack16Explicit* str1)
+{
+ ChangeLongStructPack16Explicit(str1);
+
+ return TRUE;
+}
+
diff --git a/tests/src/Interop/StructMarshalling/PInvoke/MarshalStructAsParamDLL.h b/tests/src/Interop/StructMarshalling/PInvoke/MarshalStructAsParamDLL.h
new file mode 100644
index 0000000000..39af8a9c78
--- /dev/null
+++ b/tests/src/Interop/StructMarshalling/PInvoke/MarshalStructAsParamDLL.h
@@ -0,0 +1,900 @@
+#include "platformdefines.cpp"
+#include <xplatform.h>
+
+const int NumArrElements = 2;
+struct InnerSequential
+{
+ int f1;
+ float f2;
+ LPCSTR f3;
+};
+void PrintInnerSequential(InnerSequential* p, char const * name)
+{
+ printf("\t%s.f1 = %d\n", name, p->f1);
+ printf("\t%s.f2 = %f\n", name, p->f2);
+ printf("\t%s.f3 = %s\n", name, p->f3);
+}
+
+void ChangeInnerSequential(InnerSequential* p)
+{
+ p->f1 = 77;
+ p->f2 = 77.0;
+
+ char const * lpstr = "changed string";
+ size_t size = sizeof(char) * (strlen(lpstr) + 1);
+ LPSTR temp = (LPSTR)TP_CoTaskMemAlloc( size );
+ memset(temp, 0, size);
+ if(temp)
+ {
+ strcpy( (char*)temp, lpstr );
+ p->f3 = temp;
+ }
+ else
+ {
+ printf("Memory Allocated Failed!");
+ }
+}
+
+bool IsCorrectInnerSequential(InnerSequential* p)
+{
+ if(p->f1 != 1)
+ return false;
+ if(p->f2 != 1.0)
+ return false;
+
+ char const * lpstr = "some string";
+ size_t size = sizeof(char) * (strlen(lpstr) + 1);
+ LPSTR temp = (LPSTR)TP_CoTaskMemAlloc( size );
+ memset(temp, 0, size);
+
+ if( strcmp((char*)p->f3, temp) != 0 )
+ return false;
+
+ return true;
+}
+
+#ifndef WINDOWS
+typedef int INT;
+typedef unsigned int UINT;
+typedef short SHORT;
+typedef char CHAR;
+typedef unsigned short WORD;
+typedef short SHORT;
+typedef float FLOAT;
+typedef double DOUBLE;
+#endif
+
+struct INNER2 // size = 12 bytes
+{
+ INT f1;
+ FLOAT f2;
+ LPCSTR f3;
+};
+void ChangeINNER2(INNER2* p)
+{
+ p->f1 = 77;
+ p->f2 = 77.0;
+ char const * temp = "changed string";
+ size_t len = strlen(temp);
+ LPCSTR str = (LPCSTR)TP_CoTaskMemAlloc( sizeof(char)*(len+1) );
+ strcpy((char*)str,temp);
+ p->f3 = str;
+}
+void PrintINNER2(INNER2* p, char const * name)
+{
+ printf("\t%s.f1 = %d\n", name, p->f1);
+ printf("\t%s.f2 = %f\n", name, p->f2);
+ printf("\t%s.f3 = %s\n", name, p->f3);
+}
+bool IsCorrectINNER2(INNER2* p)
+{
+ if(p->f1 != 1)
+ return false;
+ if(p->f2 != 1.0)
+ return false;
+ if(memcmp(p->f3, "some string",11*sizeof(char)) != 0 )
+ return false;
+ return true;
+}
+
+
+struct InnerExplicit
+{
+ #ifdef WINDOWS
+ union
+ {
+ INT f1;
+ FLOAT f2;
+ };
+ CHAR _unused0[4];
+ LPCSTR f3;
+ #endif
+
+ #ifndef WINDOWS
+ union
+ {
+ INT f1;
+ FLOAT f2;
+ };
+ INT _unused0;
+ LPCSTR f3;
+ #endif
+};
+
+
+void PrintInnerExplicit(InnerExplicit* p, char const * name)
+{
+ printf("\t%s.f1 = %d\n", name, p->f1);
+ printf("\t%s.f2 = %f\n", name, p->f2);
+ printf("\t%s.f3 = %s\n", name, p->f3);
+}
+
+void ChangeInnerExplicit(InnerExplicit* p)
+{
+ p->f1 = 77;
+
+ char const * temp = "changed string";
+ size_t len = strlen(temp);
+ LPCSTR str = (LPCSTR)TP_CoTaskMemAlloc( sizeof(char)*(len+1) );
+ strcpy((char*)str,temp);
+ p->f3 = str;
+}
+
+struct InnerArraySequential
+{
+ InnerSequential arr[NumArrElements];
+};
+
+void PrintInnerArraySequential(InnerArraySequential* p, char const * name)
+{
+ for(int i = 0; i < NumArrElements; i++)
+ {
+ printf("\t%s.arr[%d].f1 = %d\n", name, i, (p->arr)[i].f1);
+ printf("\t%s.arr[%d].f2 = %f\n", name, i, (p->arr)[i].f2);
+ printf("\t%s.arr[%d].f3 = %s\n", name, i, (p->arr)[i].f3);
+ }
+}
+
+void ChangeInnerArraySequential(InnerArraySequential* p)
+{
+ char const * lpstr = "changed string";
+ LPSTR temp;
+ for(int i = 0; i < NumArrElements; i++)
+ {
+ (p->arr)[i].f1 = 77;
+ (p->arr)[i].f2 = 77.0;
+
+ size_t size = sizeof(char) * (strlen(lpstr) + 1);
+ temp = (LPSTR)TP_CoTaskMemAlloc( size );
+ memset(temp, 0, size);
+ if(temp)
+ {
+ strcpy( (char*)temp, lpstr );
+ (p->arr)[i].f3 = temp;
+ }
+ else
+ {
+ printf("Memory Allocated Failed!");
+ }
+ }
+}
+
+bool IsCorrectInnerArraySequential(InnerArraySequential* p)
+{
+ for(int i = 0; i < NumArrElements; i++)
+ {
+ if( (p->arr)[i].f1 != 1 )
+ return false;
+ if( (p->arr)[i].f2 != 1.0 )
+ return false;
+ }
+ return true;
+}
+
+
+union InnerArrayExplicit // size = 32 bytes
+{
+ struct InnerSequential arr[2];
+ struct
+ {
+ LONG64 _unused0;
+ LPCSTR f4;
+ };
+
+};
+
+
+#ifdef WINDOWS
+ #ifdef _WIN64
+ union OUTER3 // size = 32 bytes
+ {
+ struct InnerSequential arr[2];
+ struct
+ {
+ CHAR _unused0[24];
+ LPCSTR f4;
+ };
+ };
+ #else
+ struct OUTER3 // size = 28 bytes
+ {
+ struct InnerSequential arr[2];
+ LPCSTR f4;
+ };
+ #endif
+#endif
+
+#ifndef WINDOWS
+ struct OUTER3 // size = 28 bytes
+ {
+ struct InnerSequential arr[2];
+ LPCSTR f4;
+ };
+#endif
+
+void PrintOUTER3(OUTER3* p, char const * name)
+{
+ for(int i = 0; i < NumArrElements; i++)
+ {
+ printf("\t%s.arr[%d].f1 = %d\n", name, i, (p->arr)[i].f1);
+ printf("\t%s.arr[%d].f2 = %f\n", name, i, (p->arr)[i].f2);
+ printf("\t%s.arr[%d].f3 = %s\n", name, i, (p->arr)[i].f3);
+ }
+ printf("\t%s.f4 = %s\n",name,p->f4);
+}
+void ChangeOUTER3(OUTER3* p)
+{
+ char const * temp = "changed string";
+ size_t len = strlen(temp);
+ LPCSTR str = NULL;
+ for(int i = 0; i < NumArrElements; i++)
+ {
+ (p->arr)[i].f1 = 77;
+ (p->arr)[i].f2 = 77.0;
+
+ str = (LPCSTR)TP_CoTaskMemAlloc( sizeof(char)*(len+1) );
+ strcpy((char*)str,temp);
+ (p->arr)[i].f3 = str;
+ }
+
+ str = (LPCSTR)TP_CoTaskMemAlloc( sizeof(char)*(len+1) );
+ strcpy((char*)str,temp);
+ p->f4 = str;
+}
+bool IsCorrectOUTER3(OUTER3* p)
+{
+ for(int i = 0; i < NumArrElements; i++)
+ {
+ if( (p->arr)[i].f1 != 1 )
+ return false;
+ if( (p->arr)[i].f2 != 1.0 )
+ return false;
+ if( memcmp((p->arr)[i].f3, "some string",11*sizeof(char)) != 0 )
+ return false;
+ }
+ if(memcmp(p->f4,"some string",11*sizeof(char)) != 0)
+ {
+ return false;
+ }
+ return true;
+}
+
+struct CharSetAnsiSequential
+{
+ LPCSTR f1;
+ char f2;
+};
+
+void PrintCharSetAnsiSequential(CharSetAnsiSequential* p, char const * name)
+{
+ printf("\t%s.f1 = %s\n", name, p->f1);
+ printf("\t%s.f2 = %c\n", name, p->f2);
+}
+
+void ChangeCharSetAnsiSequential(CharSetAnsiSequential* p)
+{
+ char const * strSource = "change string";
+ size_t size = strlen(strSource) + 1;
+ LPSTR temp = (LPSTR)TP_CoTaskMemAlloc(size);
+ if(temp != NULL)
+ {
+ strcpy((char*)temp,strSource);
+ p->f1 = temp;
+ p->f2 = 'n';
+ }
+ else
+ {
+ printf("Memory Allocated Failed!");
+ }
+}
+
+bool IsCorrectCharSetAnsiSequential(CharSetAnsiSequential* p)
+{
+ if(strcmp((char*)p->f1, (char*)"some string") != 0 )
+ return false;
+ if(p->f2 != 'c')
+ return false;
+ return true;
+}
+
+
+struct CharSetUnicodeSequential
+{
+ LPCWSTR f1;
+ WCHAR f2;
+};
+void PrintCharSetUnicodeSequential(CharSetUnicodeSequential* p, char const * name)
+{
+ wprintf(L"\t%s.f1 = %S\n", name, p->f1);
+ printf("\t%s.f2 = %c\n", name, p->f2);
+}
+
+void ChangeCharSetUnicodeSequential(CharSetUnicodeSequential* p)
+{
+#ifdef _WIN32
+ LPCWSTR strSource = L"change string";
+#else
+ LPCWSTR strSource = u"change string";
+#endif
+ int len = wcslen(strSource);
+ LPCWSTR temp = (LPCWSTR)TP_CoTaskMemAlloc(sizeof(WCHAR)*(len+1));
+ if(temp != NULL)
+ {
+ wcscpy_s((WCHAR*)temp, (len+1)*sizeof(WCHAR), strSource);
+ p->f1 = temp;
+ p->f2 = L'n';
+ }
+ else
+ {
+ printf("Memory Allocated Failed!");
+ }
+}
+
+bool IsCorrectCharSetUnicodeSequential(CharSetUnicodeSequential* p)
+{
+#ifdef _WIN32
+ LPCWSTR expected= L"some string";
+#else
+ LPCWSTR expected= u"some string";
+#endif
+ LPCWSTR actual = p->f1;
+ if(0 != TP_wcmp_s((WCHAR*)actual, (WCHAR*)expected))
+ {
+ return false;
+ }
+ if(p->f2 != L'c')
+ {
+ return false;
+ }
+ return true;
+}
+
+
+struct NumberSequential // size = 64 bytes
+{
+ LONG64 i64;
+ ULONG64 ui64;
+ DOUBLE d;
+ INT i32;
+ UINT ui32;
+ SHORT s1;
+ WORD us1;
+ SHORT i16;
+ WORD ui16;
+ FLOAT sgl;
+ BYTE b;
+ CHAR sb;
+};
+void PrintNumberSequential(NumberSequential* str, char const * name)
+{
+ printf("\t%s.i32 = %d\n", name, str->i32);
+ printf("\t%s.ui32 = %d\n", name, str->ui32);
+ printf("\t%s.s1 = %d\n", name, str->s1);
+ printf("\t%s.us1 = %u\n", name, str->us1);
+ printf("\t%s.b = %u\n", name, str->b);
+ printf("\t%s.sb = %d\n", name, str->sb);
+ printf("\t%s.i16 = %d\n", name, str->i16);
+ printf("\t%s.ui16 = %u\n", name, str->ui16);
+ printf("\t%s.i64 = %ld\n", name, str->i64);
+ printf("\t%s.ui64 = %lu\n", name, str->ui64);
+ printf("\t%s.sgl = %f\n", name, str->sgl);
+ printf("\t%s.d = %f\n",name, str->d);
+}
+void ChangeNumberSequential(NumberSequential* p)
+{
+ p->i32 = 0;
+ p->ui32 = 32;
+ p->s1 = 0;
+ p->us1 = 16;
+ p->b = 0;
+ p->sb = 8;
+ p->i16 = 0;
+ p->ui16 = 16;
+ p->i64 = 0;
+ p->ui64 = 64;
+ p->sgl = 64.0;
+ p->d = 6.4;
+}
+
+bool IsCorrectNumberSequential(NumberSequential* p)
+{
+ if(p->i32 != -0x80000000 || p->ui32 != 0xffffffff || p->s1 != -0x8000 || p->us1 != 0xffff || p->b != 0 ||
+ p->sb != 0x7f ||p->i16 != -0x8000 || p->ui16 != 0xffff || p->i64 != -1234567890 ||
+ p->ui64 != 1234567890 || (p->sgl) != 32.0 || p->d != 3.2)
+ {
+ return false;
+ }
+ return true;
+}
+
+struct S3 // size = 1032 bytes
+{
+ BOOL flag;
+ LPCSTR str;
+ INT vals[256];
+};
+
+void PrintS3(S3* str, char const * name)
+{
+ printf("\t%s.flag = %d\n", name, str->flag);
+ printf("\t%s.str = %s\n", name, str->str);
+ for(int i = 0; i<256 ;i++)
+ {
+ printf("\t%s.vals[%d] = %d\n",name,i,str->vals[i]);
+ }
+}
+
+void ChangeS3(S3* p)
+{
+ p->flag = false;
+
+ char const * strSource = "change string";
+ int len = strlen(strSource);
+
+ LPCSTR temp = (LPCSTR)TP_CoTaskMemAlloc((sizeof(char)*len) + 1);
+ if(temp != NULL)
+ {
+ /*TP_CoTaskMemFree((void *)p->str);*/
+ strcpy((char*)temp,strSource);
+ p->str = temp;
+ }
+ for(int i = 1;i<257;i++)
+ {
+ p->vals[i-1] = i;
+ }
+}
+
+bool IsCorrectS3(S3* p)
+{
+ int iflag = 0;
+
+ char const * lpstr = "some string";
+ size_t size = sizeof(char) * (strlen(lpstr) + 1);
+ LPSTR temp = (LPSTR)TP_CoTaskMemAlloc( size );
+ memset(temp, 0, size);
+
+ if(!p->flag || strcmp((char*)p->str, temp) != 0)
+ return false;
+ for (int i = 0; i < 256; i++)
+ {
+ if (p->vals[i] != i)
+ {
+ printf("\tThe Index of %i is not expected",i);
+ iflag++;
+ }
+ }
+ if (iflag != 0)
+ {
+ return false;
+ }
+ return true;
+}
+
+struct S4 // size = 8 bytes
+{
+ INT age;
+ LPCSTR name;
+};
+enum Enum1
+{
+ e1 = 1,
+ e2 = 3
+};
+struct S5 // size = 8 bytes
+{
+ struct S4 s4;
+ Enum1 ef;
+};
+
+void PrintS5(S5* str, char const * name)
+{
+ printf("\t%s.s4.age = %d", name, str->s4.age);
+ printf("\t%s.s4.name = %s", name, str->s4.name);
+ printf("\t%s.ef = %d", name, str->ef);
+}
+void ChangeS5(S5* str)
+{
+ Enum1 eInstance = e2;
+ char const * strSource = "change string";
+ int len = strlen(strSource);
+ LPCSTR temp = (LPCSTR)TP_CoTaskMemAlloc(sizeof(char)*(len+1));
+ if(temp != NULL)
+ {
+ strcpy((char*)temp,strSource);
+ str->s4.name = temp;
+ }
+ str->s4.age = 64;
+ str->ef = eInstance;
+}
+bool IsCorrectS5(S5* str)
+{
+ Enum1 eInstance = e1;
+
+ char const * lpstr = "some string";
+ size_t size = sizeof(char) * (strlen(lpstr) + 1);
+ LPSTR temp = (LPSTR)TP_CoTaskMemAlloc( size );
+ memset(temp, 0, size);
+
+ if(str->s4.age != 32 || strcmp((char*)str->s4.name, temp) != 0)
+ return false;
+ if(str->ef != eInstance)
+ {
+ return false;
+ }
+ return true;
+}
+
+struct StringStructSequentialAnsi // size = 8 bytes
+{
+ LPCSTR first;
+ LPCSTR last;
+};
+
+void PrintStringStructSequentialAnsi(StringStructSequentialAnsi* str, char const * name)
+{
+ printf("\t%s.first = %s\n", name, str->first);
+ printf("\t%s.last = %s\n", name, str->last);
+}
+
+bool IsCorrectStringStructSequentialAnsi(StringStructSequentialAnsi* str)
+{
+ char strOne[512];
+ char strTwo[512];
+ for(int i = 0;i<512;i++)
+ {
+ strOne[i] = 'a';
+ strTwo[i] = 'b';
+ }
+
+ if(memcmp(str->first,strOne,512)!= 0)
+ return false;
+
+ if(memcmp(str->last,strTwo,512)!= 0)
+ return false;
+
+ return true;
+}
+
+void ChangeStringStructSequentialAnsi(StringStructSequentialAnsi* str)
+{
+ char* newFirst = (char*)TP_CoTaskMemAlloc(sizeof(char)*513);
+ char* newLast = (char*)TP_CoTaskMemAlloc(sizeof(char)*513);
+ for (int i = 0; i < 512; ++i)
+ {
+ newFirst[i] = 'b';
+ newLast[i] = 'a';
+ }
+ newFirst[512] = '\0';
+ newLast[512] = '\0';
+
+ str->first = newFirst;
+ str->last = newLast;
+}
+
+struct StringStructSequentialUnicode // size = 8 bytes
+{
+ LPCWSTR first;
+ LPCWSTR last;
+};
+
+void PrintStringStructSequentialUnicode(StringStructSequentialUnicode* str, char const * name)
+{
+ wprintf(L"\t%s.first = %s\n", name, str->first);
+ wprintf(L"\t%s.last = %s\n", name, str->last);
+}
+
+bool IsCorrectStringStructSequentialUnicode(StringStructSequentialUnicode* str)
+{
+ WCHAR strOne[256+1];
+ WCHAR strTwo[256+1];
+
+ for(int i = 0;i<256;++i)
+ {
+ strOne[i] = L'a';
+ strTwo[i] = L'b';
+ }
+ strOne[256] = L'\0';
+ strTwo[256] = L'\0';
+
+ if(memcmp(str->first,strOne,256*sizeof(WCHAR)) != 0)
+ return false;
+ if(memcmp(str->last,strTwo,256*sizeof(WCHAR)) != 0)
+ return false;
+ return true;
+}
+
+void ChangeStringStructSequentialUnicode(StringStructSequentialUnicode* str)
+{
+ WCHAR* newFirst = (WCHAR*)TP_CoTaskMemAlloc(sizeof(WCHAR)*257);
+ WCHAR* newLast = (WCHAR*)TP_CoTaskMemAlloc(sizeof(WCHAR)*257);
+ for (int i = 0; i < 256; ++i)
+ {
+ newFirst[i] = L'b';
+ newLast[i] = L'a';
+ }
+ newFirst[256] = L'\0';
+ newLast[256] = L'\0';
+ str->first = (const WCHAR*)newFirst;
+ str->last = (const WCHAR*)newLast;
+}
+
+
+struct S8 // size = 32 bytes
+{
+ LPCSTR name;
+ BOOL gender;
+ INT i32;
+ UINT ui32;
+ WORD jobNum;
+ CHAR mySByte;
+};
+void PrintS8(S8* str, char const * name)
+{
+ printf("\t%s.name = %s\n",name, str->name);
+ printf("\t%s.gender = %d\n", name, str->gender);
+ printf("\t%s.jobNum = %d\n",name, str->jobNum);
+ printf("\t%s.i32 = %d\n", name, str->i32);
+ printf("\t%s.ui32 = %u\n", name, str->ui32);
+ printf("\t%s.mySByte = %c\n", name, str->mySByte);
+}
+bool IsCorrectS8(S8* str)
+{
+ if(memcmp( str->name,"hello", strlen("hello")*sizeof(char)+1 )!= 0)
+ return false;
+ if(!str->gender)
+ return false;
+ if(str->jobNum != 10)
+ return false;
+ if(str->i32!= 128 || str->ui32 != 128)
+ return false;
+ if(str->mySByte != 32)
+ return false;
+ return true;
+}
+
+void ChangeS8(S8* str)
+{
+ char const * lpstr = "world";
+ size_t size = sizeof(char) * (strlen(lpstr) + 1);
+ LPSTR temp = (LPSTR)TP_CoTaskMemAlloc( size );
+ memset(temp, 0, size);
+ if(temp)
+ {
+ strcpy( (char*)temp, lpstr );
+ str->name = temp;
+ }
+ else
+ {
+ printf("Memory Allocated Failed!");
+ }
+ str->gender = false;
+ str->jobNum = 1;
+ str->i32 = 256;
+ str->ui32 = 256;
+ str->mySByte = 64;
+}
+#pragma pack (8)
+struct S_int // size = 4 bytes
+{
+ INT i;
+};
+
+struct S9;
+typedef void (*TestDelegate1)(struct S9 myStruct);
+
+struct S9 // size = 8 bytes
+{
+ INT i32;
+ TestDelegate1 myDelegate1;
+};
+
+struct S101 // size = 8 bytes
+{
+ INT i;
+ struct S_int s_int;
+};
+
+struct S10 // size = 8 bytes
+{
+ struct S101 s;
+};
+void PrintS10(S10* str, char const * name)
+{
+ printf("\t%s.s.s_int.i = %d\n", name, str->s.s_int.i);
+ printf("\t%s.s.i = %d\n", name, str->s.i);
+}
+bool IsCorrectS10(S10* str)
+{
+ if(str->s.s_int.i != 32)
+ return false;
+ if(str->s.i != 32)
+ return false;
+ return true;
+}
+void ChangeS10(S10* str)
+{
+ str->s.s_int.i = 64;
+ str->s.i = 64;
+}
+
+#ifndef WINDOWS
+typedef int* LPINT;
+#endif
+
+struct S11 // size = 8 bytes
+{
+ LPINT i32;
+ INT i;
+};
+
+union U // size = 8 bytes
+{
+ INT i32;
+ UINT ui32;
+ LPVOID iPtr;
+ LPVOID uiPtr;
+ SHORT s;
+ WORD us;
+ BYTE b;
+ CHAR sb;
+ LONG64 l;
+ ULONG64 ul;
+ FLOAT f;
+ DOUBLE d;
+};
+
+void PrintU(U* str, char const * name)
+{
+ printf("\t%s.i32 = %d\n", name, str->i32);
+ printf("\t%s.ui32 = %u\n", name, str->ui32);
+ printf("\t%s.iPtr = %p\n", name, str->iPtr);
+ printf("\t%s.uiPtr = %p\n", name, str->uiPtr);
+ printf("\t%s.s = %d\n", name, str->s);
+ printf("\t%s.us = %u\n", name, str->us);
+ printf("\t%s.b = %u\n", name, str->b);
+ printf("\t%s.sb = %d\n", name, str->sb);
+ printf("\t%s.l = %ld\n", name, str->l);
+ printf("\t%s.ul = %lu\n", name, str->ul);
+ printf("\t%s.f = %f\n", name, str->f);
+ printf("\t%s.d = %f\n", name, str->d);
+}
+
+void ChangeU(U* p)
+{
+ p->i32 = 2147483647;
+ p->ui32 = 0;
+ p->iPtr = (LPVOID)(-64);
+ p->uiPtr = (LPVOID)(64);
+ p->s = 32767;
+ p->us = 0;
+ p->b = 255;
+ p->sb = -128;
+ p->l = -1234567890;
+ p->ul = 0;
+ p->f = 64.0;
+ p->d = 6.4;
+}
+
+bool IsCorrectU(U* p)
+{
+ if(p->d != 3.2)
+ {
+ return false;
+ }
+ return true;
+}
+
+struct ByteStructPack2Explicit // size = 2 bytes
+{
+ BYTE b1;
+ BYTE b2;
+};
+void PrintByteStructPack2Explicit(ByteStructPack2Explicit* str, char const * name)
+{
+ printf("\t%s.b1 = %d", name, str->b1);
+ printf("\t%s.b2 = %d", name, str->b2);
+}
+
+void ChangeByteStructPack2Explicit(ByteStructPack2Explicit* p)
+{
+ p->b1 = 64;
+ p->b2 = 64;
+}
+bool IsCorrectByteStructPack2Explicit(ByteStructPack2Explicit* p)
+{
+ if(p->b1 != 32 || p->b2 != 32)
+ return false;
+ return true;
+}
+
+
+
+struct ShortStructPack4Explicit // size = 4 bytes
+{
+ SHORT s1;
+ SHORT s2;
+};
+
+void PrintShortStructPack4Explicit(ShortStructPack4Explicit* str, char const * name)
+{
+ printf("\t%s.s1 = %d", name, str->s1);
+ printf("\t%s.s2 = %d", name, str->s2);
+}
+void ChangeShortStructPack4Explicit(ShortStructPack4Explicit* p)
+{
+ p->s1 = 64;
+ p->s2 = 64;
+}
+bool IsCorrectShortStructPack4Explicit(ShortStructPack4Explicit* p)
+{
+ if(p->s1 != 32 || p->s2 != 32)
+ return false;
+ return true;
+}
+
+
+struct IntStructPack8Explicit // size = 8 bytes
+{
+ INT i1;
+ INT i2;
+};
+
+void PrintIntStructPack8Explicit(IntStructPack8Explicit* str, char const * name)
+{
+ printf("\t%s.i1 = %d", name, str->i1);
+ printf("\t%s.i2 = %d", name, str->i2);
+}
+void ChangeIntStructPack8Explicit(IntStructPack8Explicit* p)
+{
+ p->i1 = 64;
+ p->i2 = 64;
+}
+bool IsCorrectIntStructPack8Explicit(IntStructPack8Explicit* p)
+{
+ if(p->i1 != 32 || p->i2 != 32)
+ return false;
+ return true;
+}
+
+struct LongStructPack16Explicit // size = 16 bytes
+{
+ LONG64 l1;
+ LONG64 l2;
+};
+
+void PrintLongStructPack16Explicit(LongStructPack16Explicit* str, char const * name)
+{
+ printf("\t%s.l1 = %ld", name, str->l1);
+ printf("\t%s.l2 = %ld", name, str->l2);
+}
+void ChangeLongStructPack16Explicit(LongStructPack16Explicit* p)
+{
+ p->l1 = 64;
+ p->l2 = 64;
+}
+bool IsCorrectLongStructPack16Explicit(LongStructPack16Explicit* p)
+{
+ if(p->l1 != 32 || p->l2 != 32)
+ return false;
+ return true;
+} \ No newline at end of file
diff --git a/tests/src/Interop/StructMarshalling/PInvoke/Struct.cs b/tests/src/Interop/StructMarshalling/PInvoke/Struct.cs
new file mode 100644
index 0000000000..282699bf14
--- /dev/null
+++ b/tests/src/Interop/StructMarshalling/PInvoke/Struct.cs
@@ -0,0 +1,272 @@
+using System;
+using System.Runtime.InteropServices;
+
+public class Common
+{
+ public const int NumArrElements = 2;
+}
+//////////////////////////////struct definition///////////////////////////
+[StructLayout(LayoutKind.Sequential)]
+public struct InnerSequential
+{
+ public int f1;
+ public float f2;
+ public String f3;
+}
+
+[StructLayout(LayoutKind.Sequential)]
+public struct ComplexStruct
+{
+ public int i;
+ [MarshalAs(UnmanagedType.I1)]
+ public bool b;
+ [MarshalAs(UnmanagedType.LPStr)]
+ public string str;
+ public IntPtr pedding;
+ public ScriptParamType type;
+}
+
+[StructLayout(LayoutKind.Explicit)]
+public struct ScriptParamType
+{
+ [FieldOffset(0)]
+ public int idata;
+ [FieldOffset(8)]
+ public bool bdata;
+ [FieldOffset(8)]
+ public double ddata;
+ [FieldOffset(8)]
+ public IntPtr ptrdata;
+}
+
+[StructLayout(LayoutKind.Explicit)]
+public struct INNER2
+{
+ [FieldOffset(0)]
+ public int f1;
+ [FieldOffset(4)]
+ public float f2;
+ [FieldOffset(8)]
+ public String f3;
+}
+
+[StructLayout(LayoutKind.Explicit)]
+public struct InnerExplicit
+{
+ [FieldOffset(0)]
+ public int f1;
+ [FieldOffset(0)]
+ public float f2;
+ [FieldOffset(8)]
+ public String f3;
+}
+
+[StructLayout(LayoutKind.Sequential)]//struct containing one field of array type
+public struct InnerArraySequential
+{
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = Common.NumArrElements)]
+ public InnerSequential[] arr;
+}
+
+[StructLayout(LayoutKind.Explicit, Pack = 8)]
+public struct InnerArrayExplicit
+{
+ [FieldOffset(0)]
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = Common.NumArrElements)]
+ public InnerSequential[] arr;
+
+ [FieldOffset(8)]
+ public string f4;
+}
+
+[StructLayout(LayoutKind.Explicit)]
+public struct OUTER3
+{
+ [FieldOffset(0)]
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = Common.NumArrElements)]
+ public InnerSequential[] arr;
+
+ [FieldOffset(24)]
+ public string f4;
+}
+
+[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
+public struct CharSetAnsiSequential
+{
+ public string f1;
+ public char f2;
+}
+
+[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
+public struct CharSetUnicodeSequential
+{
+ public string f1;
+ public char f2;
+}
+
+[StructLayout(LayoutKind.Sequential)]
+public struct NumberSequential
+{
+ public Int64 i64;
+ public UInt64 ui64;
+ public Double d;
+ public int i32;
+ public uint ui32;
+ public short s1;
+ public ushort us1;
+ public Int16 i16;
+ public UInt16 ui16;
+ public Single sgl;
+ public Byte b;
+ public SByte sb;
+}
+
+[StructLayout(LayoutKind.Sequential)]
+public struct S3
+{
+ public bool flag;
+ [MarshalAs(UnmanagedType.LPStr)]
+ public string str;
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
+ public int[] vals;
+}
+
+[StructLayout(LayoutKind.Sequential)]
+public struct S4
+{
+ public int age;
+ public string name;
+}
+
+public enum Enum1 { e1 = 1, e2 = 3 };
+[StructLayout(LayoutKind.Sequential)]
+public struct S5
+{
+ public S4 s4;
+ public Enum1 ef;
+}
+
+[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
+public struct StringStructSequentialAnsi
+{
+ public string first;
+ public string last;
+}
+
+[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
+public struct StringStructSequentialUnicode
+{
+ public string first;
+ public string last;
+}
+[StructLayout(LayoutKind.Sequential)]
+public struct S8
+{
+ public string name;
+ public bool gender;
+ [MarshalAs(UnmanagedType.Error)]
+ public int i32;
+ [MarshalAs(UnmanagedType.Error)]
+ public uint ui32;
+ [MarshalAs(UnmanagedType.U2)]
+ public UInt16 jobNum;
+ [MarshalAs(UnmanagedType.I1)]
+ public sbyte mySByte;
+}
+
+public struct S9
+{
+ [MarshalAs(UnmanagedType.Error)]
+ public int i32;
+ public TestDelegate1 myDelegate1;
+}
+
+public delegate void TestDelegate1(S9 myStruct);
+
+[StructLayout(LayoutKind.Sequential)]
+public struct IntergerStructSequential
+{
+ public int i;
+}
+[StructLayout(LayoutKind.Sequential)]
+public struct OuterIntergerStructSequential
+{
+ public int i;
+ public IntergerStructSequential s_int;
+}
+[StructLayout(LayoutKind.Sequential)]
+public struct IncludeOuterIntergerStructSequential
+{
+ public OuterIntergerStructSequential s;
+}
+[StructLayout(LayoutKind.Sequential)]
+public unsafe struct S11
+{
+ public int* i32;
+ public int i;
+}
+
+[StructLayout(LayoutKind.Explicit)]
+public struct U
+{
+ [FieldOffset(0)]
+ public int i32;
+ [FieldOffset(0)]
+ public uint ui32;
+ [FieldOffset(0)]
+ public IntPtr iPtr;
+ [FieldOffset(0)]
+ public UIntPtr uiPtr;
+ [FieldOffset(0)]
+ public short s;
+ [FieldOffset(0)]
+ public ushort us;
+ [FieldOffset(0)]
+ public Byte b;
+ [FieldOffset(0)]
+ public SByte sb;
+ [FieldOffset(0)]
+ public long l;
+ [FieldOffset(0)]
+ public ulong ul;
+ [FieldOffset(0)]
+ public float f;
+ [FieldOffset(0)]
+ public Double d;
+}
+
+[StructLayout(LayoutKind.Explicit, Size = 2)]
+public struct ByteStructPack2Explicit
+{
+ [FieldOffset(0)]
+ public byte b1;
+ [FieldOffset(1)]
+ public byte b2;
+}
+
+[StructLayout(LayoutKind.Explicit, Size = 4)]
+public struct ShortStructPack4Explicit
+{
+ [FieldOffset(0)]
+ public short s1;
+ [FieldOffset(2)]
+ public short s2;
+}
+
+[StructLayout(LayoutKind.Explicit, Size = 8)]
+public struct IntStructPack8Explicit
+{
+ [FieldOffset(0)]
+ public int i1;
+ [FieldOffset(4)]
+ public int i2;
+}
+
+[StructLayout(LayoutKind.Explicit, Size = 16)]
+public struct LongStructPack16Explicit
+{
+ [FieldOffset(0)]
+ public long l1;
+ [FieldOffset(8)]
+ public long l2;
+}
diff --git a/tests/src/Interop/StructMarshalling/PInvoke/project.json b/tests/src/Interop/StructMarshalling/PInvoke/project.json
new file mode 100644
index 0000000000..21a7fa4381
--- /dev/null
+++ b/tests/src/Interop/StructMarshalling/PInvoke/project.json
@@ -0,0 +1,35 @@
+{
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1-rc2-23816",
+ "System.Collections": "4.0.10",
+ "System.Collections.NonGeneric": "4.0.1-rc2-23816",
+ "System.Collections.Specialized": "4.0.1-rc2-23816",
+ "System.ComponentModel": "4.0.1-rc2-23816",
+ "System.Console": "4.0.0-rc2-23816",
+ "System.Diagnostics.Process": "4.1.0-rc2-23816",
+ "System.Globalization": "4.0.10",
+ "System.Globalization.Calendars": "4.0.0",
+ "System.IO": "4.0.10",
+ "System.IO.FileSystem": "4.0.0",
+ "System.IO.FileSystem.Primitives": "4.0.0",
+ "System.Linq": "4.0.1-rc2-23816",
+ "System.Linq.Queryable": "4.0.1-rc2-23816",
+ "System.Reflection": "4.0.10",
+ "System.Reflection.Primitives": "4.0.0",
+ "System.Runtime": "4.1.0-rc2-23816",
+ "System.Runtime.Extensions": "4.0.10",
+ "System.Runtime.Handles": "4.0.0",
+ "System.Runtime.InteropServices": "4.1.0-rc2-23816",
+ "System.Runtime.Loader": "4.0.0-rc2-23816",
+ "System.Text.Encoding": "4.0.10",
+ "System.Threading": "4.0.10",
+ "System.Threading.Thread": "4.0.0-rc2-23816",
+ "System.Xml.ReaderWriter": "4.0.11-rc2-23816",
+ "System.Xml.XDocument": "4.0.11-rc2-23816",
+ "System.Xml.XmlDocument": "4.0.1-rc2-23816",
+ "System.Xml.XmlSerializer": "4.0.11-rc2-23816"
+ },
+ "frameworks": {
+ "dnxcore50": {}
+ }
+} \ No newline at end of file