diff --git a/eng/Versions.props b/eng/Versions.props index d3abb3f2fa062b..a1b6304e770bb3 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -204,7 +204,7 @@ 2.45.0 2.45.0 - + 8.0.100-preview.6.23314.19 1.1.2-beta1.23205.1 7.0.0-preview-20221010.1 diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeBuildTests.cs b/src/mono/wasm/Wasm.Build.Tests/NativeBuildTests.cs index b388d2cd99854f..efe75b94352dcc 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeBuildTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeBuildTests.cs @@ -180,5 +180,41 @@ public void BuildWithUndefinedNativeSymbol(bool allowUndefined) Assert.Contains("Use '-p:WasmAllowUndefinedSymbols=true' to allow undefined symbols", result.Output); } } + + [Theory] + [InlineData("Debug")] + [InlineData("Release")] + public void ProjectWithDllImportsRequiringMarshalIlGen_ArrayTypeParameter(string config) + { + string id = $"dllimport_incompatible_{Path.GetRandomFileName()}"; + string projectPath = CreateWasmTemplateProject(id, template: "wasmconsole"); + + string nativeSourceFilename = "incompatible_type.c"; + string nativeCode = "void call_needing_marhsal_ilgen(void *x) {}"; + File.WriteAllText(path: Path.Combine(_projectDir!, nativeSourceFilename), nativeCode); + + AddItemsPropertiesToProject( + projectPath, + extraItems: "" + ); + + File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "marshal_ilgen_test.cs"), + Path.Combine(_projectDir!, "Program.cs"), + overwrite: true); + + CommandResult result = new DotNetCommand(s_buildEnv, _testOutput) + .WithWorkingDirectory(_projectDir!) + .WithEnvironmentVariable("NUGET_PACKAGES", _nugetPackagesDir) + .ExecuteWithCapturedOutput("build", $"-c {config} -bl"); + + Assert.True(result.ExitCode == 0, "Expected build to succeed"); + + CommandResult res = new RunCommand(s_buildEnv, _testOutput) + .WithWorkingDirectory(_projectDir!) + .ExecuteWithCapturedOutput($"run --no-silent --no-build -c {config}") + .EnsureSuccessful(); + Assert.Contains("Hello, Console!", res.Output); + Assert.Contains("Hello, World! Greetings from node version", res.Output); + } } } diff --git a/src/mono/wasm/build/WasmApp.Native.targets b/src/mono/wasm/build/WasmApp.Native.targets index 0c8a017754e7db..568f23f6568b06 100644 --- a/src/mono/wasm/build/WasmApp.Native.targets +++ b/src/mono/wasm/build/WasmApp.Native.targets @@ -35,9 +35,6 @@ <_MonoComponent Include="hot_reload;debugger" /> - - <_MonoComponent Include="marshal-ilgen" /> - @@ -684,12 +681,16 @@ - + <_AssembliesToScan Include="@(_WasmAssembliesInternal)" /> - + + + + <_MonoComponent Include="marshal-ilgen" /> + diff --git a/src/mono/wasm/testassets/marshal_ilgen_test.cs b/src/mono/wasm/testassets/marshal_ilgen_test.cs new file mode 100644 index 00000000000000..ef4572b62f4bd1 --- /dev/null +++ b/src/mono/wasm/testassets/marshal_ilgen_test.cs @@ -0,0 +1,27 @@ +using System; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.JavaScript; + +Console.WriteLine("Hello, Console!"); + +return 0; + +public partial class MyClass +{ + [JSExport] + internal static string Greeting() + { + int[] x = new int[0]; + call_needing_marhsal_ilgen(x); + + var text = $"Hello, World! Greetings from node version: {GetNodeVersion()}"; + return text; + } + + [JSImport("node.process.version", "main.mjs")] + internal static partial string GetNodeVersion(); + + [DllImport("incompatible_type")] + static extern void call_needing_marhsal_ilgen(int[] numbers); +} +