public async Task AddingFileWithNewLibraryImport_DoesNotRegenerateOriginalMethod()
        {
            string source = CodeSnippets.BasicParametersAndModifiers <int>();

            Compilation comp1 = await TestUtils.CreateCompilation(source);

            Microsoft.Interop.LibraryImportGenerator generator = new();
            GeneratorDriver driver = TestUtils.CreateDriver(comp1, null, new[] { generator }, EnableIncrementalTrackingDriverOptions);

            driver = driver.RunGenerators(comp1);

            Compilation comp2 = comp1.AddSyntaxTrees(CSharpSyntaxTree.ParseText(CodeSnippets.BasicParametersAndModifiers <bool>(), new CSharpParseOptions(LanguageVersion.Preview)));

            GeneratorDriver    driver2   = driver.RunGenerators(comp2);
            GeneratorRunResult runResult = driver2.GetRunResult().Results[0];

            Assert.Collection(runResult.TrackedSteps[StepNames.CalculateStubInformation],
                              step =>
            {
                Assert.Collection(step.Outputs,
                                  output => Assert.Equal(IncrementalStepRunReason.Unchanged, output.Reason));
            },
                              step =>
            {
                Assert.Collection(step.Outputs,
                                  output => Assert.Equal(IncrementalStepRunReason.New, output.Reason));
            });
        }
예제 #2
0
        public async Task ReplacingFileWithNewLibraryImport_DoesNotRegenerateStubsInOtherFiles()
        {
            Compilation comp1 = await TestUtils.CreateCompilation(new string[] { CodeSnippets.BasicParametersAndModifiers <int>(), CodeSnippets.MarshalAsParametersAndModifiers <bool>(UnmanagedType.I1) });

            Microsoft.Interop.LibraryImportGenerator generator = new();
            GeneratorDriver driver = TestUtils.CreateDriver(comp1, null, new[] { generator }, EnableIncrementalTrackingDriverOptions);

            driver = driver.RunGenerators(comp1);

            Compilation        comp2     = comp1.ReplaceSyntaxTree(comp1.SyntaxTrees.First(), CSharpSyntaxTree.ParseText(CodeSnippets.BasicParametersAndModifiers <ulong>(), new CSharpParseOptions(LanguageVersion.Preview)));
            GeneratorDriver    driver2   = driver.RunGenerators(comp2);
            GeneratorRunResult runResult = driver2.GetRunResult().Results[0];

            Assert.Collection(runResult.TrackedSteps[StepNames.CalculateStubInformation],
                              step =>
            {
                Assert.Collection(step.Outputs,
                                  output => Assert.Equal(IncrementalStepRunReason.Modified, output.Reason));
            },
                              step =>
            {
                Assert.Collection(step.Outputs,
                                  output => Assert.Equal(IncrementalStepRunReason.Unchanged, output.Reason));
            });
        }
        public async Task AppendingUnrelatedSource_DoesNotRegenerateSource()
        {
            string source = $"namespace NS{{{CodeSnippets.BasicParametersAndModifiers<int>()}}}";

            SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText(source, new CSharpParseOptions(LanguageVersion.Preview));

            Compilation comp1 = await TestUtils.CreateCompilation(new[] { syntaxTree });

            Microsoft.Interop.LibraryImportGenerator generator = new();
            GeneratorDriver driver = TestUtils.CreateDriver(comp1, null, new[] { generator }, EnableIncrementalTrackingDriverOptions);

            driver = driver.RunGenerators(comp1);

            SyntaxTree newTree = syntaxTree.WithRootAndOptions(syntaxTree.GetCompilationUnitRoot().AddMembers(SyntaxFactory.ParseMemberDeclaration("struct Foo {}") !), syntaxTree.Options);

            Compilation        comp2     = comp1.ReplaceSyntaxTree(comp1.SyntaxTrees.First(), newTree);
            GeneratorDriver    driver2   = driver.RunGenerators(comp2);
            GeneratorRunResult runResult = driver2.GetRunResult().Results[0];

            Assert.Collection(runResult.TrackedSteps[StepNames.CalculateStubInformation],
                              step =>
            {
                // The input contains symbols and Compilation objects, so it will always be different.
                // However, we validate that the calculated stub information is identical.
                Assert.Collection(step.Outputs,
                                  output => Assert.Equal(IncrementalStepRunReason.Unchanged, output.Reason));
            });
        }
예제 #4
0
        public static IEnumerable <object[]> CodeSnippetsToCompileMultipleSources()
        {
            yield return(new object[] { new[] { CodeSnippets.BasicParametersAndModifiers <int>(), CodeSnippets.MarshalAsParametersAndModifiers <bool>(UnmanagedType.Bool) } });

            yield return(new object[] { new[] { CodeSnippets.BasicParametersAndModifiersWithStringMarshalling <int>(StringMarshalling.Utf16), CodeSnippets.MarshalAsParametersAndModifiers <bool>(UnmanagedType.Bool) } });

            yield return(new object[] { new[] { CodeSnippets.BasicParameterByValue("int[]", CodeSnippets.DisableRuntimeMarshalling), CodeSnippets.BasicParameterWithByRefModifier("ref", "int") } });
        }
예제 #5
0
        public static IEnumerable <object[]> SnippetsWithBlittableTypesButNonBlittableDataToCompile()
        {
            yield return(new[] { CodeSnippets.AllLibraryImportNamedArguments });

            yield return(new[] { CodeSnippets.BasicParametersAndModifiers <int>() });

            yield return(new[] { CodeSnippets.SetLastErrorTrue <int>() });
        }
예제 #6
0
        public static IEnumerable <object[]> CodeSnippetsToValidateFallbackForwarder()
        {
            yield return(new object[] { CodeSnippets.UserDefinedEntryPoint, TestTargetFramework.Net, true });

            // Confirm that all unsupported target frameworks can be generated.
            {
                string code = CodeSnippets.BasicParametersAndModifiers <byte>(CodeSnippets.LibraryImportAttributeDeclaration);
                yield return(new object[] { code, TestTargetFramework.Net5, false });

                yield return(new object[] { code, TestTargetFramework.Core, false });

                yield return(new object[] { code, TestTargetFramework.Standard, false });

                yield return(new object[] { code, TestTargetFramework.Framework, false });
            }

            // Confirm that all unsupported target frameworks fall back to a forwarder.
            {
                string code = CodeSnippets.BasicParametersAndModifiers <byte[]>(CodeSnippets.LibraryImportAttributeDeclaration);
                yield return(new object[] { code, TestTargetFramework.Net5, true });

                yield return(new object[] { code, TestTargetFramework.Core, true });

                yield return(new object[] { code, TestTargetFramework.Standard, true });

                yield return(new object[] { code, TestTargetFramework.Framework, true });
            }

            // Confirm that all unsupported target frameworks fall back to a forwarder.
            {
                string code = CodeSnippets.BasicParametersAndModifiersWithStringMarshalling <string>(StringMarshalling.Utf16, CodeSnippets.LibraryImportAttributeDeclaration);
                yield return(new object[] { code, TestTargetFramework.Net5, true });

                yield return(new object[] { code, TestTargetFramework.Core, true });

                yield return(new object[] { code, TestTargetFramework.Standard, true });

                yield return(new object[] { code, TestTargetFramework.Framework, true });
            }

            // Confirm that if support is missing for any type (like arrays), we fall back to a forwarder even if other types are supported.
            {
                string code = CodeSnippets.BasicReturnAndParameterByValue("System.Runtime.InteropServices.SafeHandle", "int[]", CodeSnippets.LibraryImportAttributeDeclaration);
                yield return(new object[] { code, TestTargetFramework.Net5, true });

                yield return(new object[] { code, TestTargetFramework.Core, true });

                yield return(new object[] { code, TestTargetFramework.Standard, true });

                yield return(new object[] { code, TestTargetFramework.Framework, true });
            }
        }
예제 #7
0
        public static IEnumerable <object[]> CodeSnippetsToCompileWithPreprocessorSymbols()
        {
            yield return(new object[] { CodeSnippets.PreprocessorIfAroundFullFunctionDefinition("Foo"), new string[] { "Foo" } });

            yield return(new object[] { CodeSnippets.PreprocessorIfAroundFullFunctionDefinition("Foo"), Array.Empty <string>() });

            yield return(new object[] { CodeSnippets.PreprocessorIfAroundFullFunctionDefinitionWithFollowingFunction("Foo"), new string[] { "Foo" } });

            yield return(new object[] { CodeSnippets.PreprocessorIfAroundFullFunctionDefinitionWithFollowingFunction("Foo"), Array.Empty <string>() });

            yield return(new object[] { CodeSnippets.PreprocessorIfAfterAttributeAroundFunction("Foo"), new string[] { "Foo" } });

            yield return(new object[] { CodeSnippets.PreprocessorIfAfterAttributeAroundFunction("Foo"), Array.Empty <string>() });

            yield return(new object[] { CodeSnippets.PreprocessorIfAfterAttributeAroundFunctionAdditionalFunctionAfter("Foo"), new string[] { "Foo" } });

            yield return(new object[] { CodeSnippets.PreprocessorIfAfterAttributeAroundFunctionAdditionalFunctionAfter("Foo"), Array.Empty <string>() });
        }
예제 #8
0
        public static IEnumerable <object[]> CodeSnippetsToValidateFallbackForwarder()
        {
            yield return(new object[] { CodeSnippets.UserDefinedEntryPoint, TestTargetFramework.Net, true });

            // Confirm that all unsupported target frameworks can be generated.
            {
                string code = CodeSnippets.BasicParametersAndModifiers <byte>(CodeSnippets.LibraryImportAttributeDeclaration);
                yield return(new object[] { code, TestTargetFramework.Net5, false });

                yield return(new object[] { code, TestTargetFramework.Core, false });

                yield return(new object[] { code, TestTargetFramework.Standard, false });

                yield return(new object[] { code, TestTargetFramework.Framework, false });
            }

            // Confirm that all unsupported target frameworks fallback to a forwarder.
            {
                string code = CodeSnippets.BasicParametersAndModifiers <byte[]>(CodeSnippets.LibraryImportAttributeDeclaration);
                yield return(new object[] { code, TestTargetFramework.Net5, true });

                yield return(new object[] { code, TestTargetFramework.Core, true });

                yield return(new object[] { code, TestTargetFramework.Standard, true });

                yield return(new object[] { code, TestTargetFramework.Framework, true });
            }

            // Confirm that all unsupported target frameworks fallback to a forwarder.
            {
                string code = CodeSnippets.BasicParametersAndModifiersWithStringMarshalling <string>(StringMarshalling.Utf16, CodeSnippets.LibraryImportAttributeDeclaration);
                yield return(new object[] { code, TestTargetFramework.Net5, true });

                yield return(new object[] { code, TestTargetFramework.Core, true });

                yield return(new object[] { code, TestTargetFramework.Standard, true });

                yield return(new object[] { code, TestTargetFramework.Framework, true });
            }
        }
        public async Task ChangingMarshallingStrategy_RegeneratesStub()
        {
            string stubSource = CodeSnippets.BasicParametersAndModifiers("CustomType");

            string customTypeImpl1 = "struct CustomType { System.IntPtr handle; }";

            string customTypeImpl2 = "class CustomType : Microsoft.Win32.SafeHandles.SafeHandleZeroOrMinusOneIsInvalid { public CustomType():base(true){} protected override bool ReleaseHandle(){return true;} }";


            Compilation comp1 = await TestUtils.CreateCompilation(stubSource);

            SyntaxTree customTypeImpl1Tree = CSharpSyntaxTree.ParseText(customTypeImpl1, new CSharpParseOptions(LanguageVersion.Preview));

            comp1 = comp1.AddSyntaxTrees(customTypeImpl1Tree);

            Microsoft.Interop.LibraryImportGenerator generator = new();
            GeneratorDriver driver = TestUtils.CreateDriver(comp1, null, new[] { generator }, EnableIncrementalTrackingDriverOptions);

            driver = driver.RunGenerators(comp1);

            Compilation        comp2     = comp1.ReplaceSyntaxTree(customTypeImpl1Tree, CSharpSyntaxTree.ParseText(customTypeImpl2, new CSharpParseOptions(LanguageVersion.Preview)));
            GeneratorDriver    driver2   = driver.RunGenerators(comp2);
            GeneratorRunResult runResult = driver2.GetRunResult().Results[0];

            Assert.Collection(runResult.TrackedSteps[StepNames.CalculateStubInformation],
                              step =>
            {
                Assert.Collection(step.Outputs,
                                  output => Assert.Equal(IncrementalStepRunReason.Modified, output.Reason));
            });

            Assert.Collection(runResult.TrackedSteps[StepNames.GenerateSingleStub],
                              step =>
            {
                Assert.Collection(step.Outputs,
                                  output => Assert.Equal(IncrementalStepRunReason.Modified, output.Reason));
            });
        }
        public async Task ChangingMarshallingAttributes_SameStrategy_DoesNotRegenerate()
        {
            string source = CodeSnippets.BasicParametersAndModifiers <int>();

            SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText(source, new CSharpParseOptions(LanguageVersion.Preview));

            Compilation comp1 = await TestUtils.CreateCompilation(new[] { syntaxTree });

            Microsoft.Interop.LibraryImportGenerator generator = new();
            GeneratorDriver driver = TestUtils.CreateDriver(comp1, null, new[] { generator }, EnableIncrementalTrackingDriverOptions);

            driver = driver.RunGenerators(comp1);

            SyntaxTree newTree = syntaxTree.WithRootAndOptions(
                SyntaxFactory.ParseCompilationUnit(
                    CodeSnippets.MarshalAsParametersAndModifiers <int>(System.Runtime.InteropServices.UnmanagedType.I4)),
                syntaxTree.Options);

            Compilation comp2 = comp1.ReplaceSyntaxTree(comp1.SyntaxTrees.First(), newTree);

            GeneratorDriver    driver2   = driver.RunGenerators(comp2);
            GeneratorRunResult runResult = driver2.GetRunResult().Results[0];

            Assert.Collection(runResult.TrackedSteps[StepNames.CalculateStubInformation],
                              step =>
            {
                Assert.Collection(step.Outputs,
                                  output => Assert.Equal(IncrementalStepRunReason.Modified, output.Reason));
            });

            Assert.Collection(runResult.TrackedSteps[StepNames.GenerateSingleStub],
                              step =>
            {
                Assert.Collection(step.Outputs,
                                  output => Assert.Equal(IncrementalStepRunReason.Unchanged, output.Reason));
            });
        }
예제 #11
0
        public static IEnumerable <object[]> FullyBlittableSnippetsToCompile()
        {
            yield return(new[] { CodeSnippets.UserDefinedEntryPoint });

            yield return(new[] { CodeSnippets.BasicParameterByValue("int") });
        }
예제 #12
0
        public static IEnumerable <object[]> CodeSnippetsToCompile()
        {
            yield return(new[] { CodeSnippets.TrivialClassDeclarations });

            yield return(new[] { CodeSnippets.TrivialStructDeclarations });

            yield return(new[] { CodeSnippets.MultipleAttributes });

            yield return(new[] { CodeSnippets.NestedNamespace });

            yield return(new[] { CodeSnippets.NestedTypes });

            yield return(new[] { CodeSnippets.UnsafeContext });

            yield return(new[] { CodeSnippets.UserDefinedEntryPoint });

            yield return(new[] { CodeSnippets.AllLibraryImportNamedArguments });

            yield return(new[] { CodeSnippets.DefaultParameters });

            yield return(new[] { CodeSnippets.UseCSharpFeaturesForConstants });

            // Parameter / return types
            yield return(new[] { CodeSnippets.BasicParametersAndModifiers <byte>() });

            yield return(new[] { CodeSnippets.BasicParametersAndModifiers <sbyte>() });

            yield return(new[] { CodeSnippets.BasicParametersAndModifiers <short>() });

            yield return(new[] { CodeSnippets.BasicParametersAndModifiers <ushort>() });

            yield return(new[] { CodeSnippets.BasicParametersAndModifiers <int>() });

            yield return(new[] { CodeSnippets.BasicParametersAndModifiers <uint>() });

            yield return(new[] { CodeSnippets.BasicParametersAndModifiers <long>() });

            yield return(new[] { CodeSnippets.BasicParametersAndModifiers <ulong>() });

            yield return(new[] { CodeSnippets.BasicParametersAndModifiers <float>() });

            yield return(new[] { CodeSnippets.BasicParametersAndModifiers <double>() });

            yield return(new[] { CodeSnippets.BasicParametersAndModifiers <IntPtr>() });

            yield return(new[] { CodeSnippets.BasicParametersAndModifiers <UIntPtr>() });

            // Arrays
            yield return(new[] { CodeSnippets.MarshalAsArrayParametersAndModifiers <byte>() });

            yield return(new[] { CodeSnippets.MarshalAsArrayParametersAndModifiers <sbyte>() });

            yield return(new[] { CodeSnippets.MarshalAsArrayParametersAndModifiers <short>() });

            yield return(new[] { CodeSnippets.MarshalAsArrayParametersAndModifiers <ushort>() });

            yield return(new[] { CodeSnippets.MarshalAsArrayParametersAndModifiers <int>() });

            yield return(new[] { CodeSnippets.MarshalAsArrayParametersAndModifiers <uint>() });

            yield return(new[] { CodeSnippets.MarshalAsArrayParametersAndModifiers <long>() });

            yield return(new[] { CodeSnippets.MarshalAsArrayParametersAndModifiers <ulong>() });

            yield return(new[] { CodeSnippets.MarshalAsArrayParametersAndModifiers <float>() });

            yield return(new[] { CodeSnippets.MarshalAsArrayParametersAndModifiers <double>() });

            yield return(new[] { CodeSnippets.MarshalAsArrayParametersAndModifiers <IntPtr>() });

            yield return(new[] { CodeSnippets.MarshalAsArrayParametersAndModifiers <UIntPtr>() });

            yield return(new[] { CodeSnippets.MarshalAsArrayParametersAndModifiers("byte*", "unsafe") });

            yield return(new[] { CodeSnippets.MarshalAsArrayParametersAndModifiers("sbyte*", "unsafe") });

            yield return(new[] { CodeSnippets.MarshalAsArrayParametersAndModifiers("short*", "unsafe") });

            yield return(new[] { CodeSnippets.MarshalAsArrayParametersAndModifiers("ushort*", "unsafe") });

            yield return(new[] { CodeSnippets.MarshalAsArrayParametersAndModifiers("int*", "unsafe") });

            yield return(new[] { CodeSnippets.MarshalAsArrayParametersAndModifiers("uint*", "unsafe") });

            yield return(new[] { CodeSnippets.MarshalAsArrayParametersAndModifiers("long*", "unsafe") });

            yield return(new[] { CodeSnippets.MarshalAsArrayParametersAndModifiers("ulong*", "unsafe") });

            yield return(new[] { CodeSnippets.MarshalAsArrayParametersAndModifiers("float*", "unsafe") });

            yield return(new[] { CodeSnippets.MarshalAsArrayParametersAndModifiers("double*", "unsafe") });

            yield return(new[] { CodeSnippets.MarshalAsArrayParametersAndModifiers("System.IntPtr*", "unsafe") });

            yield return(new[] { CodeSnippets.MarshalAsArrayParametersAndModifiers("System.UIntPtr*", "unsafe") });

            yield return(new[] { CodeSnippets.MarshalAsArrayParameterWithSizeParam <byte>(isByRef: false) });

            yield return(new[] { CodeSnippets.MarshalAsArrayParameterWithSizeParam <sbyte>(isByRef: false) });

            yield return(new[] { CodeSnippets.MarshalAsArrayParameterWithSizeParam <short>(isByRef: false) });

            yield return(new[] { CodeSnippets.MarshalAsArrayParameterWithSizeParam <ushort>(isByRef: false) });

            yield return(new[] { CodeSnippets.MarshalAsArrayParameterWithSizeParam <int>(isByRef: false) });

            yield return(new[] { CodeSnippets.MarshalAsArrayParameterWithSizeParam <uint>(isByRef: false) });

            yield return(new[] { CodeSnippets.MarshalAsArrayParameterWithSizeParam <long>(isByRef: false) });

            yield return(new[] { CodeSnippets.MarshalAsArrayParameterWithSizeParam <ulong>(isByRef: false) });

            yield return(new[] { CodeSnippets.MarshalAsArrayParameterWithSizeParam <IntPtr>(isByRef: false) });

            yield return(new[] { CodeSnippets.MarshalAsArrayParameterWithSizeParam <UIntPtr>(isByRef: false) });

            yield return(new[] { CodeSnippets.MarshalAsArrayParameterWithSizeParam <byte>(isByRef: true) });

            yield return(new[] { CodeSnippets.MarshalAsArrayParameterWithSizeParam <sbyte>(isByRef: true) });

            yield return(new[] { CodeSnippets.MarshalAsArrayParameterWithSizeParam <short>(isByRef: true) });

            yield return(new[] { CodeSnippets.MarshalAsArrayParameterWithSizeParam <ushort>(isByRef: true) });

            yield return(new[] { CodeSnippets.MarshalAsArrayParameterWithSizeParam <int>(isByRef: true) });

            yield return(new[] { CodeSnippets.MarshalAsArrayParameterWithSizeParam <uint>(isByRef: true) });

            yield return(new[] { CodeSnippets.MarshalAsArrayParameterWithSizeParam <long>(isByRef: true) });

            yield return(new[] { CodeSnippets.MarshalAsArrayParameterWithSizeParam <ulong>(isByRef: true) });

            yield return(new[] { CodeSnippets.MarshalAsArrayParameterWithSizeParam <IntPtr>(isByRef: true) });

            yield return(new[] { CodeSnippets.MarshalAsArrayParameterWithSizeParam <UIntPtr>(isByRef: true) });

            // StringMarshalling
            yield return(new[] { CodeSnippets.BasicParametersAndModifiersWithStringMarshalling <char>(StringMarshalling.Utf16) });

            yield return(new[] { CodeSnippets.BasicParametersAndModifiersWithStringMarshalling <string>(StringMarshalling.Utf16) });

            yield return(new[] { CodeSnippets.BasicParametersAndModifiersWithStringMarshalling <string>(StringMarshalling.Utf8) });

            // StringMarshallingCustomType
            yield return(new[] { CodeSnippets.CustomStringMarshallingParametersAndModifiers <string>() });

            // MarshalAs
            yield return(new[] { CodeSnippets.MarshalAsParametersAndModifiers <bool>(UnmanagedType.Bool) });

            yield return(new[] { CodeSnippets.MarshalAsParametersAndModifiers <bool>(UnmanagedType.VariantBool) });

            yield return(new[] { CodeSnippets.MarshalAsParametersAndModifiers <bool>(UnmanagedType.I1) });

            yield return(new[] { CodeSnippets.MarshalAsParametersAndModifiers <char>(UnmanagedType.I2) });

            yield return(new[] { CodeSnippets.MarshalAsParametersAndModifiers <char>(UnmanagedType.U2) });

            yield return(new[] { CodeSnippets.MarshalAsParametersAndModifiers <IntPtr>(UnmanagedType.SysInt) });

            yield return(new[] { CodeSnippets.MarshalAsParametersAndModifiers <UIntPtr>(UnmanagedType.SysUInt) });

            yield return(new[] { CodeSnippets.MarshalAsParametersAndModifiers <string>(UnmanagedType.LPWStr) });

            yield return(new[] { CodeSnippets.MarshalAsParametersAndModifiers <string>(UnmanagedType.LPTStr) });

            yield return(new[] { CodeSnippets.MarshalAsParametersAndModifiers <string>(UnmanagedType.LPUTF8Str) });

            yield return(new[] { CodeSnippets.MarshalAsParametersAndModifiers <string>(UnmanagedType.LPStr) });

            yield return(new[] { CodeSnippets.MarshalAsParametersAndModifiers <string>(UnmanagedType.BStr) });

            yield return(new[] { CodeSnippets.MarshalAsArrayParameterWithNestedMarshalInfo <string>(UnmanagedType.LPWStr) });

            yield return(new[] { CodeSnippets.MarshalAsArrayParameterWithNestedMarshalInfo <string>(UnmanagedType.LPUTF8Str) });

            yield return(new[] { CodeSnippets.MarshalAsArrayParameterWithNestedMarshalInfo <string>(UnmanagedType.LPStr) });

            yield return(new[] { CodeSnippets.MarshalAsArrayParameterWithNestedMarshalInfo <string>(UnmanagedType.BStr) });

            // [In, Out] attributes
            // By value non-blittable array
            yield return(new [] { CodeSnippets.ByValueParameterWithModifier("S[]", "Out")
                                  + CodeSnippets.CustomStructMarshalling.NonBlittableUserDefinedType()
                                  + CodeSnippets.CustomStructMarshalling.NativeTypeRef });

            yield return(new [] { CodeSnippets.ByValueParameterWithModifier("S[]", "In, Out")
                                  + CodeSnippets.CustomStructMarshalling.NonBlittableUserDefinedType()
                                  + CodeSnippets.CustomStructMarshalling.NativeTypeRef });

            // Enums
            yield return(new[] { CodeSnippets.EnumParameters });

            // Pointers
            yield return(new[] { CodeSnippets.PointerParameters <byte>() });

            yield return(new[] { CodeSnippets.PointerParameters <sbyte>() });

            yield return(new[] { CodeSnippets.PointerParameters <short>() });

            yield return(new[] { CodeSnippets.PointerParameters <ushort>() });

            yield return(new[] { CodeSnippets.PointerParameters <int>() });

            yield return(new[] { CodeSnippets.PointerParameters <uint>() });

            yield return(new[] { CodeSnippets.PointerParameters <long>() });

            yield return(new[] { CodeSnippets.PointerParameters <ulong>() });

            yield return(new[] { CodeSnippets.PointerParameters <float>() });

            yield return(new[] { CodeSnippets.PointerParameters <double>() });

            yield return(new[] { CodeSnippets.PointerParameters <bool>() });

            yield return(new[] { CodeSnippets.PointerParameters <IntPtr>() });

            yield return(new[] { CodeSnippets.PointerParameters <UIntPtr>() });

            yield return(new[] { CodeSnippets.BasicParametersAndModifiersUnsafe("void*") });

            // Delegates
            yield return(new[] { CodeSnippets.DelegateParametersAndModifiers });

            yield return(new[] { CodeSnippets.DelegateMarshalAsParametersAndModifiers });

            // Function pointers
            yield return(new[] { CodeSnippets.BasicParametersAndModifiersUnsafe("delegate* <void>") });

            yield return(new[] { CodeSnippets.BasicParametersAndModifiersUnsafe("delegate* unmanaged<void>") });

            yield return(new[] { CodeSnippets.BasicParametersAndModifiersUnsafe("delegate* unmanaged<int, int>") });

            yield return(new[] { CodeSnippets.BasicParametersAndModifiersUnsafe("delegate* unmanaged[Stdcall]<int, int>") });

            yield return(new[] { CodeSnippets.MarshalAsParametersAndModifiersUnsafe("delegate* <int>", UnmanagedType.FunctionPtr) });

            yield return(new[] { CodeSnippets.MarshalAsParametersAndModifiersUnsafe("delegate* unmanaged<int>", UnmanagedType.FunctionPtr) });

            // Structs
            yield return(new[] { CodeSnippets.BlittableStructParametersAndModifiers(string.Empty) });

            yield return(new[] { CodeSnippets.BlittableStructParametersAndModifiers(CodeSnippets.DisableRuntimeMarshalling) });

            yield return(new[] { CodeSnippets.ValidateDisableRuntimeMarshalling.TypeUsage(string.Empty)
                                 + CodeSnippets.ValidateDisableRuntimeMarshalling.NonBlittableUserDefinedTypeWithNativeType });

            yield return(new[] { CodeSnippets.ValidateDisableRuntimeMarshalling.TypeUsage(CodeSnippets.DisableRuntimeMarshalling)
                                 + CodeSnippets.ValidateDisableRuntimeMarshalling.NonBlittableUserDefinedTypeWithNativeType });

            // SafeHandle
            yield return(new[] { CodeSnippets.BasicParametersAndModifiers("Microsoft.Win32.SafeHandles.SafeFileHandle") });

            yield return(new[] { CodeSnippets.BasicParameterByValue("System.Runtime.InteropServices.SafeHandle") });

            yield return(new[] { CodeSnippets.SafeHandleWithCustomDefaultConstructorAccessibility(privateCtor: false) });

            yield return(new[] { CodeSnippets.SafeHandleWithCustomDefaultConstructorAccessibility(privateCtor: true) });

            // Custom type marshalling
            yield return(new[] { CodeSnippets.CustomStructMarshalling.ParametersAndModifiers });

            yield return(new[] { CodeSnippets.CustomStructMarshalling.StackallocParametersAndModifiersNoRef });

            yield return(new[] { CodeSnippets.CustomStructMarshalling.StackallocTwoStageParametersAndModifiersNoRef });

            yield return(new[] { CodeSnippets.CustomStructMarshalling.OptionalStackallocParametersAndModifiers });

            yield return(new[] { CodeSnippets.CustomStructMarshalling.TwoStageParametersAndModifiers });

            yield return(new[] { CodeSnippets.CustomStructMarshalling.PinnableParametersAndModifiers });

            yield return(new[] { CodeSnippets.CustomStructMarshalling.NativeTypePinnable("byte", "byte") });

            yield return(new[] { CodeSnippets.CustomStructMarshalling.NativeTypePinnable("byte", "int") });

            yield return(new[] { CodeSnippets.CustomStructMarshalling.MarshalUsingParametersAndModifiers });

            yield return(new[] { CodeSnippets.CustomStructMarshalling.NativeToManagedOnlyOutParameter });

            yield return(new[] { CodeSnippets.CustomStructMarshalling.NativeToManagedOnlyReturnValue });

            yield return(new[] { CodeSnippets.ArrayMarshallingWithCustomStructElement });

            yield return(new[] { CodeSnippets.ArrayMarshallingWithCustomStructElementWithValueProperty });

            // Escaped C# keyword identifiers
            yield return(new[] { CodeSnippets.ByValueParameterWithName("Method", "@event") });

            yield return(new[] { CodeSnippets.ByValueParameterWithName("Method", "@var") });

            yield return(new[] { CodeSnippets.ByValueParameterWithName("@params", "i") });

            //Generics
            yield return(new[] { CodeSnippets.MaybeBlittableGenericTypeParametersAndModifiers <byte>() });

            yield return(new[] { CodeSnippets.MaybeBlittableGenericTypeParametersAndModifiers <sbyte>() });

            yield return(new[] { CodeSnippets.MaybeBlittableGenericTypeParametersAndModifiers <short>() });

            yield return(new[] { CodeSnippets.MaybeBlittableGenericTypeParametersAndModifiers <ushort>() });

            yield return(new[] { CodeSnippets.MaybeBlittableGenericTypeParametersAndModifiers <int>() });

            yield return(new[] { CodeSnippets.MaybeBlittableGenericTypeParametersAndModifiers <uint>() });

            yield return(new[] { CodeSnippets.MaybeBlittableGenericTypeParametersAndModifiers <long>() });

            yield return(new[] { CodeSnippets.MaybeBlittableGenericTypeParametersAndModifiers <ulong>() });

            yield return(new[] { CodeSnippets.MaybeBlittableGenericTypeParametersAndModifiers <float>() });

            yield return(new[] { CodeSnippets.MaybeBlittableGenericTypeParametersAndModifiers <double>() });

            yield return(new[] { CodeSnippets.MaybeBlittableGenericTypeParametersAndModifiers <IntPtr>() });

            yield return(new[] { CodeSnippets.MaybeBlittableGenericTypeParametersAndModifiers <UIntPtr>() });

            // Custom collection marshalling
            yield return(new[] { CodeSnippets.CollectionByValue <byte>() });

            yield return(new[] { CodeSnippets.CollectionByValue <sbyte>() });

            yield return(new[] { CodeSnippets.CollectionByValue <short>() });

            yield return(new[] { CodeSnippets.CollectionByValue <ushort>() });

            yield return(new[] { CodeSnippets.CollectionByValue <int>() });

            yield return(new[] { CodeSnippets.CollectionByValue <uint>() });

            yield return(new[] { CodeSnippets.CollectionByValue <long>() });

            yield return(new[] { CodeSnippets.CollectionByValue <ulong>() });

            yield return(new[] { CodeSnippets.CollectionByValue <float>() });

            yield return(new[] { CodeSnippets.CollectionByValue <double>() });

            yield return(new[] { CodeSnippets.CollectionByValue <IntPtr>() });

            yield return(new[] { CodeSnippets.CollectionByValue <UIntPtr>() });

            yield return(new[] { CodeSnippets.MarshalUsingCollectionCountInfoParametersAndModifiers <byte[]>() });

            yield return(new[] { CodeSnippets.MarshalUsingCollectionCountInfoParametersAndModifiers <sbyte[]>() });

            yield return(new[] { CodeSnippets.MarshalUsingCollectionCountInfoParametersAndModifiers <short[]>() });

            yield return(new[] { CodeSnippets.MarshalUsingCollectionCountInfoParametersAndModifiers <ushort[]>() });

            yield return(new[] { CodeSnippets.MarshalUsingCollectionCountInfoParametersAndModifiers <int[]>() });

            yield return(new[] { CodeSnippets.MarshalUsingCollectionCountInfoParametersAndModifiers <uint[]>() });

            yield return(new[] { CodeSnippets.MarshalUsingCollectionCountInfoParametersAndModifiers <long[]>() });

            yield return(new[] { CodeSnippets.MarshalUsingCollectionCountInfoParametersAndModifiers <ulong[]>() });

            yield return(new[] { CodeSnippets.MarshalUsingCollectionCountInfoParametersAndModifiers <float[]>() });

            yield return(new[] { CodeSnippets.MarshalUsingCollectionCountInfoParametersAndModifiers <double[]>() });

            yield return(new[] { CodeSnippets.MarshalUsingCollectionCountInfoParametersAndModifiers <IntPtr[]>() });

            yield return(new[] { CodeSnippets.MarshalUsingCollectionCountInfoParametersAndModifiers <UIntPtr[]>() });

            yield return(new[] { CodeSnippets.CustomCollectionDefaultMarshallerParametersAndModifiers <byte>() });

            yield return(new[] { CodeSnippets.CustomCollectionDefaultMarshallerParametersAndModifiers <sbyte>() });

            yield return(new[] { CodeSnippets.CustomCollectionDefaultMarshallerParametersAndModifiers <short>() });

            yield return(new[] { CodeSnippets.CustomCollectionDefaultMarshallerParametersAndModifiers <ushort>() });

            yield return(new[] { CodeSnippets.CustomCollectionDefaultMarshallerParametersAndModifiers <int>() });

            yield return(new[] { CodeSnippets.CustomCollectionDefaultMarshallerParametersAndModifiers <uint>() });

            yield return(new[] { CodeSnippets.CustomCollectionDefaultMarshallerParametersAndModifiers <long>() });

            yield return(new[] { CodeSnippets.CustomCollectionDefaultMarshallerParametersAndModifiers <ulong>() });

            yield return(new[] { CodeSnippets.CustomCollectionDefaultMarshallerParametersAndModifiers <float>() });

            yield return(new[] { CodeSnippets.CustomCollectionDefaultMarshallerParametersAndModifiers <double>() });

            yield return(new[] { CodeSnippets.CustomCollectionDefaultMarshallerParametersAndModifiers <IntPtr>() });

            yield return(new[] { CodeSnippets.CustomCollectionDefaultMarshallerParametersAndModifiers <UIntPtr>() });

            yield return(new[] { CodeSnippets.CustomCollectionCustomMarshallerParametersAndModifiers <byte>() });

            yield return(new[] { CodeSnippets.CustomCollectionCustomMarshallerParametersAndModifiers <sbyte>() });

            yield return(new[] { CodeSnippets.CustomCollectionCustomMarshallerParametersAndModifiers <short>() });

            yield return(new[] { CodeSnippets.CustomCollectionCustomMarshallerParametersAndModifiers <ushort>() });

            yield return(new[] { CodeSnippets.CustomCollectionCustomMarshallerParametersAndModifiers <int>() });

            yield return(new[] { CodeSnippets.CustomCollectionCustomMarshallerParametersAndModifiers <uint>() });

            yield return(new[] { CodeSnippets.CustomCollectionCustomMarshallerParametersAndModifiers <long>() });

            yield return(new[] { CodeSnippets.CustomCollectionCustomMarshallerParametersAndModifiers <ulong>() });

            yield return(new[] { CodeSnippets.CustomCollectionCustomMarshallerParametersAndModifiers <float>() });

            yield return(new[] { CodeSnippets.CustomCollectionCustomMarshallerParametersAndModifiers <double>() });

            yield return(new[] { CodeSnippets.CustomCollectionCustomMarshallerParametersAndModifiers <IntPtr>() });

            yield return(new[] { CodeSnippets.CustomCollectionCustomMarshallerParametersAndModifiers <UIntPtr>() });

            yield return(new[] { CodeSnippets.CustomCollectionCustomMarshallerReturnValueLength <int>() });

            yield return(new[] { CodeSnippets.GenericCollectionWithCustomElementMarshalling });

            yield return(new[] { CodeSnippets.CollectionsOfCollectionsStress });
        }
예제 #13
0
        public static IEnumerable <object[]> CodeSnippetsToCompile()
        {
            // Not LibraryImportAttribute
            yield return(new object[] { CodeSnippets.UserDefinedPrefixedAttributes, 0, 3 });

            // No explicit marshalling for char or string
            yield return(new object[] { CodeSnippets.BasicParametersAndModifiers <char>(), 5, 0 });

            yield return(new object[] { CodeSnippets.BasicParametersAndModifiers <string>(), 5, 0 });

            yield return(new object[] { CodeSnippets.MarshalAsArrayParametersAndModifiers <char>(), 5, 0 });

            yield return(new object[] { CodeSnippets.MarshalAsArrayParametersAndModifiers <string>(), 5, 0 });

            // No explicit marshaling for bool
            yield return(new object[] { CodeSnippets.BasicParametersAndModifiers <bool>(), 5, 0 });

            yield return(new object[] { CodeSnippets.MarshalAsArrayParametersAndModifiers <bool>(), 5, 0 });

            // Unsupported StringMarshalling configuration
            yield return(new object[] { CodeSnippets.BasicParametersAndModifiersWithStringMarshalling <char>(StringMarshalling.Utf8), 6, 0 });

            yield return(new object[] { CodeSnippets.BasicParametersAndModifiersWithStringMarshalling <char>(StringMarshalling.Custom), 7, 0 });

            yield return(new object[] { CodeSnippets.BasicParametersAndModifiersWithStringMarshalling <string>(StringMarshalling.Custom), 7, 0 });

            // Unsupported UnmanagedType
            yield return(new object[] { CodeSnippets.MarshalAsParametersAndModifiers <char>(UnmanagedType.I1), 5, 0 });

            yield return(new object[] { CodeSnippets.MarshalAsParametersAndModifiers <char>(UnmanagedType.U1), 5, 0 });

            yield return(new object[] { CodeSnippets.MarshalAsParametersAndModifiers <int[]>(UnmanagedType.SafeArray), 10, 0 });

            // Unsupported MarshalAsAttribute usage
            //  * UnmanagedType.CustomMarshaler, MarshalTypeRef, MarshalType, MarshalCookie
            yield return(new object[] { CodeSnippets.MarshalAsCustomMarshalerOnTypes, 16, 0 });

            // Unsupported [In, Out] attributes usage
            // Blittable array
            yield return(new object[] { CodeSnippets.ByValueParameterWithModifier <int[]>("Out"), 1, 0 });

            yield return(new object[] { CodeSnippets.ByValueParameterWithModifier <int[]>("In, Out"), 1, 0 });

            // By ref with [In, Out] attributes
            yield return(new object[] { CodeSnippets.ByValueParameterWithModifier("in int", "In"), 1, 0 });

            yield return(new object[] { CodeSnippets.ByValueParameterWithModifier("ref int", "In"), 1, 0 });

            yield return(new object[] { CodeSnippets.ByValueParameterWithModifier("ref int", "In, Out"), 1, 0 });

            yield return(new object[] { CodeSnippets.ByValueParameterWithModifier("out int", "Out"), 1, 0 });

            // By value non-array with [In, Out] attributes
            yield return(new object[] { CodeSnippets.ByValueParameterWithModifier <byte>("In"), 1, 0 });

            yield return(new object[] { CodeSnippets.ByValueParameterWithModifier <byte>("Out"), 1, 0 });

            yield return(new object[] { CodeSnippets.ByValueParameterWithModifier <byte>("In, Out"), 1, 0 });

            // LCIDConversion
            yield return(new object[] { CodeSnippets.LCIDConversionAttribute, 1, 0 });

            // No size information for array marshalling from unmanaged to managed
            //   * return, out, ref
            yield return(new object[] { CodeSnippets.BasicParametersAndModifiers <byte[]>(CodeSnippets.DisableRuntimeMarshalling), 3, 0 });

            yield return(new object[] { CodeSnippets.BasicParametersAndModifiers <sbyte[]>(CodeSnippets.DisableRuntimeMarshalling), 3, 0 });

            yield return(new object[] { CodeSnippets.BasicParametersAndModifiers <short[]>(CodeSnippets.DisableRuntimeMarshalling), 3, 0 });

            yield return(new object[] { CodeSnippets.BasicParametersAndModifiers <ushort[]>(CodeSnippets.DisableRuntimeMarshalling), 3, 0 });

            yield return(new object[] { CodeSnippets.BasicParametersAndModifiers <char[]>(CodeSnippets.DisableRuntimeMarshalling), 3, 0 });

            yield return(new object[] { CodeSnippets.BasicParametersAndModifiers <string[]>(CodeSnippets.DisableRuntimeMarshalling), 5, 0 });

            yield return(new object[] { CodeSnippets.BasicParametersAndModifiers <int[]>(CodeSnippets.DisableRuntimeMarshalling), 3, 0 });

            yield return(new object[] { CodeSnippets.BasicParametersAndModifiers <uint[]>(CodeSnippets.DisableRuntimeMarshalling), 3, 0 });

            yield return(new object[] { CodeSnippets.BasicParametersAndModifiers <long[]>(CodeSnippets.DisableRuntimeMarshalling), 3, 0 });

            yield return(new object[] { CodeSnippets.BasicParametersAndModifiers <ulong[]>(CodeSnippets.DisableRuntimeMarshalling), 3, 0 });

            yield return(new object[] { CodeSnippets.BasicParametersAndModifiers <float[]>(CodeSnippets.DisableRuntimeMarshalling), 3, 0 });

            yield return(new object[] { CodeSnippets.BasicParametersAndModifiers <double[]>(CodeSnippets.DisableRuntimeMarshalling), 3, 0 });

            yield return(new object[] { CodeSnippets.BasicParametersAndModifiers <bool[]>(CodeSnippets.DisableRuntimeMarshalling), 5, 0 });

            yield return(new object[] { CodeSnippets.BasicParametersAndModifiers <IntPtr[]>(CodeSnippets.DisableRuntimeMarshalling), 3, 0 });

            yield return(new object[] { CodeSnippets.BasicParametersAndModifiers <UIntPtr[]>(CodeSnippets.DisableRuntimeMarshalling), 3, 0 });

            // Collection with non-integer size param
            yield return(new object[] { CodeSnippets.MarshalAsArrayParameterWithSizeParam <float>(isByRef: false), 1, 0 });

            yield return(new object[] { CodeSnippets.MarshalAsArrayParameterWithSizeParam <double>(isByRef: false), 1, 0 });

            yield return(new object[] { CodeSnippets.MarshalAsArrayParameterWithSizeParam <bool>(isByRef: false), 2, 0 });

            yield return(new object[] { CodeSnippets.MarshalUsingArrayParameterWithSizeParam <float>(isByRef: false), 1, 0 });

            yield return(new object[] { CodeSnippets.MarshalUsingArrayParameterWithSizeParam <double>(isByRef: false), 1, 0 });

            yield return(new object[] { CodeSnippets.MarshalUsingArrayParameterWithSizeParam <bool>(isByRef: false), 2, 0 });


            // Custom type marshalling with invalid members
            yield return(new object[] { CodeSnippets.CustomStructMarshallingByRefValueProperty, 3, 0 });

            yield return(new object[] { CodeSnippets.CustomStructMarshallingManagedToNativeOnlyOutParameter, 1, 0 });

            yield return(new object[] { CodeSnippets.CustomStructMarshallingManagedToNativeOnlyReturnValue, 1, 0 });

            yield return(new object[] { CodeSnippets.CustomStructMarshallingNativeToManagedOnlyInParameter, 1, 0 });

            yield return(new object[] { CodeSnippets.CustomStructMarshallingStackallocOnlyRefParameter, 1, 0 });

            // Abstract SafeHandle type by reference
            yield return(new object[] { CodeSnippets.BasicParameterWithByRefModifier("ref", "System.Runtime.InteropServices.SafeHandle"), 1, 0 });

            // Collection with constant and element size parameter
            yield return(new object[] { CodeSnippets.MarshalUsingCollectionWithConstantAndElementCount, 2, 0 });

            // Collection with null element size parameter name
            yield return(new object[] { CodeSnippets.MarshalUsingCollectionWithNullElementName, 2, 0 });

            // Generic collection marshaller has different arity than collection.
            yield return(new object[] { CodeSnippets.GenericCollectionMarshallingArityMismatch, 2, 0 });

            yield return(new object[] { CodeSnippets.MarshalAsAndMarshalUsingOnReturnValue, 2, 0 });

            yield return(new object[] { CodeSnippets.GenericCollectionWithCustomElementMarshallingDuplicateElementIndirectionLevel, 2, 0 });

            yield return(new object[] { CodeSnippets.GenericCollectionWithCustomElementMarshallingUnusedElementIndirectionLevel, 1, 0 });

            yield return(new object[] { CodeSnippets.RecursiveCountElementNameOnReturnValue, 2, 0 });

            yield return(new object[] { CodeSnippets.RecursiveCountElementNameOnParameter, 2, 0 });

            yield return(new object[] { CodeSnippets.MutuallyRecursiveCountElementNameOnParameter, 4, 0 });

            yield return(new object[] { CodeSnippets.MutuallyRecursiveSizeParamIndexOnParameter, 4, 0 });

            // Ref returns
            yield return(new object[] { CodeSnippets.RefReturn("int"), 2, 2 });
        }
예제 #14
0
        public static IEnumerable <object[]> CustomCollections()
        {
            // Custom collection marshalling
            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.ByValue <byte>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.ByValue <sbyte>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.ByValue <short>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.ByValue <ushort>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.ByValue <int>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.ByValue <uint>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.ByValue <long>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.ByValue <ulong>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.ByValue <float>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.ByValue <double>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.ByValue <IntPtr>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.ByValue <UIntPtr>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.ByValueCallerAllocatedBuffer <byte>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.ByValueCallerAllocatedBuffer <sbyte>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.ByValueCallerAllocatedBuffer <short>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.ByValueCallerAllocatedBuffer <ushort>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.ByValueCallerAllocatedBuffer <int>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.ByValueCallerAllocatedBuffer <uint>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.ByValueCallerAllocatedBuffer <long>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.ByValueCallerAllocatedBuffer <ulong>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.ByValueCallerAllocatedBuffer <float>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.ByValueCallerAllocatedBuffer <double>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.ByValueCallerAllocatedBuffer <IntPtr>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.ByValueCallerAllocatedBuffer <UIntPtr>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.ByValueWithPinning <byte>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.ByValueWithPinning <sbyte>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.ByValueWithPinning <short>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.ByValueWithPinning <ushort>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.ByValueWithPinning <int>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.ByValueWithPinning <uint>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.ByValueWithPinning <long>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.ByValueWithPinning <ulong>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.ByValueWithPinning <float>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.ByValueWithPinning <double>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.ByValueWithPinning <IntPtr>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.ByValueWithPinning <UIntPtr>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling_V1.ByValue <byte>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling_V1.ByValue <sbyte>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling_V1.ByValue <short>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling_V1.ByValue <ushort>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling_V1.ByValue <int>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling_V1.ByValue <uint>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling_V1.ByValue <long>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling_V1.ByValue <ulong>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling_V1.ByValue <float>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling_V1.ByValue <double>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling_V1.ByValue <IntPtr>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling_V1.ByValue <UIntPtr>() });

            yield return(new[] { CodeSnippets.MarshalUsingCollectionCountInfoParametersAndModifiers <byte[]>() });

            yield return(new[] { CodeSnippets.MarshalUsingCollectionCountInfoParametersAndModifiers <sbyte[]>() });

            yield return(new[] { CodeSnippets.MarshalUsingCollectionCountInfoParametersAndModifiers <short[]>() });

            yield return(new[] { CodeSnippets.MarshalUsingCollectionCountInfoParametersAndModifiers <ushort[]>() });

            yield return(new[] { CodeSnippets.MarshalUsingCollectionCountInfoParametersAndModifiers <int[]>() });

            yield return(new[] { CodeSnippets.MarshalUsingCollectionCountInfoParametersAndModifiers <uint[]>() });

            yield return(new[] { CodeSnippets.MarshalUsingCollectionCountInfoParametersAndModifiers <long[]>() });

            yield return(new[] { CodeSnippets.MarshalUsingCollectionCountInfoParametersAndModifiers <ulong[]>() });

            yield return(new[] { CodeSnippets.MarshalUsingCollectionCountInfoParametersAndModifiers <float[]>() });

            yield return(new[] { CodeSnippets.MarshalUsingCollectionCountInfoParametersAndModifiers <double[]>() });

            yield return(new[] { CodeSnippets.MarshalUsingCollectionCountInfoParametersAndModifiers <IntPtr[]>() });

            yield return(new[] { CodeSnippets.MarshalUsingCollectionCountInfoParametersAndModifiers <UIntPtr[]>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.DefaultMarshallerParametersAndModifiers <byte>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.DefaultMarshallerParametersAndModifiers <sbyte>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.DefaultMarshallerParametersAndModifiers <short>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.DefaultMarshallerParametersAndModifiers <ushort>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.DefaultMarshallerParametersAndModifiers <int>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.DefaultMarshallerParametersAndModifiers <uint>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.DefaultMarshallerParametersAndModifiers <long>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.DefaultMarshallerParametersAndModifiers <ulong>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.DefaultMarshallerParametersAndModifiers <float>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.DefaultMarshallerParametersAndModifiers <double>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.DefaultMarshallerParametersAndModifiers <IntPtr>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.DefaultMarshallerParametersAndModifiers <UIntPtr>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.CustomMarshallerParametersAndModifiers <byte>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.CustomMarshallerParametersAndModifiers <sbyte>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.CustomMarshallerParametersAndModifiers <short>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.CustomMarshallerParametersAndModifiers <ushort>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.CustomMarshallerParametersAndModifiers <int>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.CustomMarshallerParametersAndModifiers <uint>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.CustomMarshallerParametersAndModifiers <long>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.CustomMarshallerParametersAndModifiers <ulong>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.CustomMarshallerParametersAndModifiers <float>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.CustomMarshallerParametersAndModifiers <double>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.CustomMarshallerParametersAndModifiers <IntPtr>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.CustomMarshallerParametersAndModifiers <UIntPtr>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.CustomMarshallerReturnValueLength <int>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.NativeToManagedOnlyOutParameter <int>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.NativeToManagedOnlyReturnValue <int>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling.Stateless.NestedMarshallerParametersAndModifiers <int>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling_V1.DefaultMarshallerParametersAndModifiers <byte>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling_V1.DefaultMarshallerParametersAndModifiers <sbyte>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling_V1.DefaultMarshallerParametersAndModifiers <short>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling_V1.DefaultMarshallerParametersAndModifiers <ushort>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling_V1.DefaultMarshallerParametersAndModifiers <int>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling_V1.DefaultMarshallerParametersAndModifiers <uint>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling_V1.DefaultMarshallerParametersAndModifiers <long>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling_V1.DefaultMarshallerParametersAndModifiers <ulong>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling_V1.DefaultMarshallerParametersAndModifiers <float>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling_V1.DefaultMarshallerParametersAndModifiers <double>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling_V1.DefaultMarshallerParametersAndModifiers <IntPtr>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling_V1.DefaultMarshallerParametersAndModifiers <UIntPtr>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling_V1.CustomMarshallerParametersAndModifiers <byte>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling_V1.CustomMarshallerParametersAndModifiers <sbyte>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling_V1.CustomMarshallerParametersAndModifiers <short>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling_V1.CustomMarshallerParametersAndModifiers <ushort>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling_V1.CustomMarshallerParametersAndModifiers <int>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling_V1.CustomMarshallerParametersAndModifiers <uint>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling_V1.CustomMarshallerParametersAndModifiers <long>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling_V1.CustomMarshallerParametersAndModifiers <ulong>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling_V1.CustomMarshallerParametersAndModifiers <float>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling_V1.CustomMarshallerParametersAndModifiers <double>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling_V1.CustomMarshallerParametersAndModifiers <IntPtr>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling_V1.CustomMarshallerParametersAndModifiers <UIntPtr>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling_V1.CustomMarshallerReturnValueLength <int>() });

            yield return(new[] { CodeSnippets.CustomCollectionMarshalling_V1.GenericCollectionWithCustomElementMarshalling });

            yield return(new[] { CodeSnippets.CollectionsOfCollectionsStress });
        }