Browse Source

wasm extensions wip

Krzysztof Krysiński 1 year ago
parent
commit
a5f0b631e8

+ 2 - 0
.gitignore

@@ -85,6 +85,8 @@ StyleCopReport.xml
 *.svclog
 *.scc
 
+.packages
+
 # Chutzpah Test files
 _Chutzpah*
 

+ 8 - 0
src/PixiEditor.Extensions.Wasm/Api/ILogger.cs

@@ -0,0 +1,8 @@
+namespace PixiEditor.Extensions.Wasm.Api;
+
+public interface ILogger
+{
+    public void Log(string message);
+    public void LogError(string message);
+    public void LogWarning(string message);
+}

+ 34 - 0
src/PixiEditor.Extensions.Wasm/Api/Logger.cs

@@ -0,0 +1,34 @@
+using System.Runtime.InteropServices;
+
+namespace PixiEditor.Extensions.Wasm.Api;
+
+public class Logger : ILogger
+{
+    public Logger() : base()
+    {
+    }
+
+    public void Log(string message)
+    {
+        InvokeApiLog(message);
+    }
+
+    public void LogError(string message)
+    {
+        InvokeApiLog(message);
+    }
+
+    public void LogWarning(string message)
+    {
+        InvokeApiLog(message);
+    }
+
+    private void InvokeApiLog(string message)
+    {
+        unsafe
+        {
+            IntPtr ptr = Marshal.StringToHGlobalAnsi(message);
+            Interop.LogMessage((char*)ptr);
+        }
+    }
+}

+ 9 - 0
src/PixiEditor.Extensions.Wasm/Interop.cs

@@ -0,0 +1,9 @@
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+namespace PixiEditor.Extensions.Wasm;
+
+internal class Interop
+{
+    internal static extern unsafe void LogMessage(char* message);
+}

+ 20 - 0
src/PixiEditor.Extensions.Wasm/PixiEditor.Extensions.Wasm.csproj

@@ -0,0 +1,20 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+    <PropertyGroup>
+        <TargetFramework>net8.0</TargetFramework>
+        <ImplicitUsings>enable</ImplicitUsings>
+        <Nullable>enable</Nullable>
+        <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+    </PropertyGroup>
+
+  <Import Project="build\PixiEditor.Extensions.Wasm.targets"/>
+  <Import Project="build\PixiEditor.Extensions.Wasm.props"/>
+
+  <Target Name="PackTaskDependencies" BeforeTargets="GenerateNuspec">
+    <ItemGroup>
+      <_PackageFiles Include="build\**" BuildAction="Content" PackagePath="build" />
+      <_PackageFiles Include="native\**" BuildAction="Content" PackagePath="native" />
+    </ItemGroup>
+  </Target>
+
+</Project>

+ 13 - 0
src/PixiEditor.Extensions.Wasm/PixiEditorApi.cs

@@ -0,0 +1,13 @@
+using PixiEditor.Extensions.Wasm.Api;
+
+namespace PixiEditor.Extensions.Wasm;
+
+public class PixiEditorApi
+{
+    public ILogger Logger { get; }
+
+    public PixiEditorApi()
+    {
+        Logger = new Logger();
+    }
+}

+ 10 - 0
src/PixiEditor.Extensions.Wasm/WasmExtension.cs

@@ -0,0 +1,10 @@
+using System.Runtime.InteropServices;
+
+namespace PixiEditor.Extensions.Wasm;
+
+public abstract class WasmExtension
+{
+    public static PixiEditorApi Api { get; } = new PixiEditorApi();
+    public virtual void OnLoaded() { }
+    public virtual void OnInitialized() { }
+}

+ 2 - 0
src/PixiEditor.Extensions.Wasm/build/PixiEditor.Extensions.Wasm.props

@@ -0,0 +1,2 @@
+<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+</Project>

+ 7 - 0
src/PixiEditor.Extensions.Wasm/build/PixiEditor.Extensions.Wasm.targets

@@ -0,0 +1,7 @@
+<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+
+  <ItemGroup>
+    <WasmImport Include="$(MSBuildThisFileDirectory)..\native\*.c" />
+  </ItemGroup>
+
+</Project>

+ 9 - 0
src/PixiEditor.Extensions.Wasm/native/api_interop.c

@@ -0,0 +1,9 @@
+#include <mono-wasi/driver.h>
+
+__attribute__((import_name("log_message")))
+void log_message(const char* message);
+
+void attach_internal_calls()
+{
+    mono_add_internal_call("PixiEditor.Extensions.Wasm.Interop::LogMessage", (void*)log_message);
+}

+ 13 - 0
src/PixiEditor.WasmRuntime/PixiEditor.WasmRuntime.csproj

@@ -0,0 +1,13 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+    <PropertyGroup>
+        <TargetFramework>net8.0</TargetFramework>
+        <ImplicitUsings>enable</ImplicitUsings>
+        <Nullable>enable</Nullable>
+    </PropertyGroup>
+
+    <ItemGroup>
+      <PackageReference Include="Wasmtime" Version="16.0.0" />
+    </ItemGroup>
+
+</Project>

+ 27 - 0
src/PixiEditor.WasmRuntime/WasmRuntime.cs

@@ -0,0 +1,27 @@
+using Wasmtime;
+
+namespace PixiEditor.WasmRuntime;
+
+public class WasmRuntime
+{
+    private Engine engine = new Engine();
+
+    public void LoadModule(string path)
+    {
+        Module module = Module.FromFile(engine, path);
+        WasiConfiguration wasiConfig = new WasiConfiguration();
+
+        var linker = new Linker(engine);
+        var store = new Store(engine);
+        store.SetWasiConfiguration(wasiConfig);
+
+        linker.DefineWasi();
+
+        var instance = linker.Instantiate(store, module);
+
+        instance.GetAction("ProvideApi").Invoke();
+        var main = instance.GetAction("Entry");
+
+        main.Invoke();
+    }
+}

+ 180 - 0
src/PixiEditor.sln

@@ -78,6 +78,14 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PixiEditor.AvaloniaUI.Deskt
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PixiEditor.Tests", "PixiEditor.Tests\PixiEditor.Tests.csproj", "{427CE098-4B13-4E46-8C66-D924140B6CAE}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WasmSampleExtension", "WasmSampleExtension\WasmSampleExtension.csproj", "{F4436A16-9488-4BAB-B2F6-C1806278CE16}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PixiEditor.WasmRuntime", "PixiEditor.WasmRuntime\PixiEditor.WasmRuntime.csproj", "{1AD04210-1055-4014-8FB5-15DC1621EA35}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WasmRuntimeTest", "WasmRuntimeTest\WasmRuntimeTest.csproj", "{9E837500-FF9B-4EB8-A411-11C528CDDC7A}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PixiEditor.Extensions.Wasm", "PixiEditor.Extensions.Wasm\PixiEditor.Extensions.Wasm.csproj", "{71907779-F1D1-4AA6-BA11-E990DB089841}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -1297,6 +1305,174 @@ Global
 		{427CE098-4B13-4E46-8C66-D924140B6CAE}.Steam|x64.Build.0 = Debug|Any CPU
 		{427CE098-4B13-4E46-8C66-D924140B6CAE}.Steam|x86.ActiveCfg = Debug|Any CPU
 		{427CE098-4B13-4E46-8C66-D924140B6CAE}.Steam|x86.Build.0 = Debug|Any CPU
+		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.Debug|x64.Build.0 = Debug|Any CPU
+		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.Debug|x86.Build.0 = Debug|Any CPU
+		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.DevRelease|Any CPU.ActiveCfg = Debug|Any CPU
+		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.DevRelease|Any CPU.Build.0 = Debug|Any CPU
+		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.DevRelease|x64.ActiveCfg = Debug|Any CPU
+		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.DevRelease|x64.Build.0 = Debug|Any CPU
+		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.DevRelease|x86.ActiveCfg = Debug|Any CPU
+		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.DevRelease|x86.Build.0 = Debug|Any CPU
+		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.DevSteam|Any CPU.ActiveCfg = Debug|Any CPU
+		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.DevSteam|Any CPU.Build.0 = Debug|Any CPU
+		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.DevSteam|x64.ActiveCfg = Debug|Any CPU
+		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.DevSteam|x64.Build.0 = Debug|Any CPU
+		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.DevSteam|x86.ActiveCfg = Debug|Any CPU
+		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.DevSteam|x86.Build.0 = Debug|Any CPU
+		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.MSIX Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.MSIX Debug|Any CPU.Build.0 = Debug|Any CPU
+		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.MSIX Debug|x64.ActiveCfg = Debug|Any CPU
+		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.MSIX Debug|x64.Build.0 = Debug|Any CPU
+		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.MSIX Debug|x86.ActiveCfg = Debug|Any CPU
+		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.MSIX Debug|x86.Build.0 = Debug|Any CPU
+		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.MSIX|Any CPU.ActiveCfg = Debug|Any CPU
+		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.MSIX|Any CPU.Build.0 = Debug|Any CPU
+		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.MSIX|x64.ActiveCfg = Debug|Any CPU
+		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.MSIX|x64.Build.0 = Debug|Any CPU
+		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.MSIX|x86.ActiveCfg = Debug|Any CPU
+		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.MSIX|x86.Build.0 = Debug|Any CPU
+		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.Release|Any CPU.Build.0 = Release|Any CPU
+		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.Release|x64.ActiveCfg = Release|Any CPU
+		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.Release|x64.Build.0 = Release|Any CPU
+		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.Release|x86.ActiveCfg = Release|Any CPU
+		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.Release|x86.Build.0 = Release|Any CPU
+		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.Steam|Any CPU.ActiveCfg = Debug|Any CPU
+		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.Steam|Any CPU.Build.0 = Debug|Any CPU
+		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.Steam|x64.ActiveCfg = Debug|Any CPU
+		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.Steam|x64.Build.0 = Debug|Any CPU
+		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.Steam|x86.ActiveCfg = Debug|Any CPU
+		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.Steam|x86.Build.0 = Debug|Any CPU
+		{1AD04210-1055-4014-8FB5-15DC1621EA35}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{1AD04210-1055-4014-8FB5-15DC1621EA35}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{1AD04210-1055-4014-8FB5-15DC1621EA35}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{1AD04210-1055-4014-8FB5-15DC1621EA35}.Debug|x64.Build.0 = Debug|Any CPU
+		{1AD04210-1055-4014-8FB5-15DC1621EA35}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{1AD04210-1055-4014-8FB5-15DC1621EA35}.Debug|x86.Build.0 = Debug|Any CPU
+		{1AD04210-1055-4014-8FB5-15DC1621EA35}.DevRelease|Any CPU.ActiveCfg = Debug|Any CPU
+		{1AD04210-1055-4014-8FB5-15DC1621EA35}.DevRelease|Any CPU.Build.0 = Debug|Any CPU
+		{1AD04210-1055-4014-8FB5-15DC1621EA35}.DevRelease|x64.ActiveCfg = Debug|Any CPU
+		{1AD04210-1055-4014-8FB5-15DC1621EA35}.DevRelease|x64.Build.0 = Debug|Any CPU
+		{1AD04210-1055-4014-8FB5-15DC1621EA35}.DevRelease|x86.ActiveCfg = Debug|Any CPU
+		{1AD04210-1055-4014-8FB5-15DC1621EA35}.DevRelease|x86.Build.0 = Debug|Any CPU
+		{1AD04210-1055-4014-8FB5-15DC1621EA35}.DevSteam|Any CPU.ActiveCfg = Debug|Any CPU
+		{1AD04210-1055-4014-8FB5-15DC1621EA35}.DevSteam|Any CPU.Build.0 = Debug|Any CPU
+		{1AD04210-1055-4014-8FB5-15DC1621EA35}.DevSteam|x64.ActiveCfg = Debug|Any CPU
+		{1AD04210-1055-4014-8FB5-15DC1621EA35}.DevSteam|x64.Build.0 = Debug|Any CPU
+		{1AD04210-1055-4014-8FB5-15DC1621EA35}.DevSteam|x86.ActiveCfg = Debug|Any CPU
+		{1AD04210-1055-4014-8FB5-15DC1621EA35}.DevSteam|x86.Build.0 = Debug|Any CPU
+		{1AD04210-1055-4014-8FB5-15DC1621EA35}.MSIX Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{1AD04210-1055-4014-8FB5-15DC1621EA35}.MSIX Debug|Any CPU.Build.0 = Debug|Any CPU
+		{1AD04210-1055-4014-8FB5-15DC1621EA35}.MSIX Debug|x64.ActiveCfg = Debug|Any CPU
+		{1AD04210-1055-4014-8FB5-15DC1621EA35}.MSIX Debug|x64.Build.0 = Debug|Any CPU
+		{1AD04210-1055-4014-8FB5-15DC1621EA35}.MSIX Debug|x86.ActiveCfg = Debug|Any CPU
+		{1AD04210-1055-4014-8FB5-15DC1621EA35}.MSIX Debug|x86.Build.0 = Debug|Any CPU
+		{1AD04210-1055-4014-8FB5-15DC1621EA35}.MSIX|Any CPU.ActiveCfg = Debug|Any CPU
+		{1AD04210-1055-4014-8FB5-15DC1621EA35}.MSIX|Any CPU.Build.0 = Debug|Any CPU
+		{1AD04210-1055-4014-8FB5-15DC1621EA35}.MSIX|x64.ActiveCfg = Debug|Any CPU
+		{1AD04210-1055-4014-8FB5-15DC1621EA35}.MSIX|x64.Build.0 = Debug|Any CPU
+		{1AD04210-1055-4014-8FB5-15DC1621EA35}.MSIX|x86.ActiveCfg = Debug|Any CPU
+		{1AD04210-1055-4014-8FB5-15DC1621EA35}.MSIX|x86.Build.0 = Debug|Any CPU
+		{1AD04210-1055-4014-8FB5-15DC1621EA35}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{1AD04210-1055-4014-8FB5-15DC1621EA35}.Release|Any CPU.Build.0 = Release|Any CPU
+		{1AD04210-1055-4014-8FB5-15DC1621EA35}.Release|x64.ActiveCfg = Release|Any CPU
+		{1AD04210-1055-4014-8FB5-15DC1621EA35}.Release|x64.Build.0 = Release|Any CPU
+		{1AD04210-1055-4014-8FB5-15DC1621EA35}.Release|x86.ActiveCfg = Release|Any CPU
+		{1AD04210-1055-4014-8FB5-15DC1621EA35}.Release|x86.Build.0 = Release|Any CPU
+		{1AD04210-1055-4014-8FB5-15DC1621EA35}.Steam|Any CPU.ActiveCfg = Debug|Any CPU
+		{1AD04210-1055-4014-8FB5-15DC1621EA35}.Steam|Any CPU.Build.0 = Debug|Any CPU
+		{1AD04210-1055-4014-8FB5-15DC1621EA35}.Steam|x64.ActiveCfg = Debug|Any CPU
+		{1AD04210-1055-4014-8FB5-15DC1621EA35}.Steam|x64.Build.0 = Debug|Any CPU
+		{1AD04210-1055-4014-8FB5-15DC1621EA35}.Steam|x86.ActiveCfg = Debug|Any CPU
+		{1AD04210-1055-4014-8FB5-15DC1621EA35}.Steam|x86.Build.0 = Debug|Any CPU
+		{9E837500-FF9B-4EB8-A411-11C528CDDC7A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{9E837500-FF9B-4EB8-A411-11C528CDDC7A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{9E837500-FF9B-4EB8-A411-11C528CDDC7A}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{9E837500-FF9B-4EB8-A411-11C528CDDC7A}.Debug|x64.Build.0 = Debug|Any CPU
+		{9E837500-FF9B-4EB8-A411-11C528CDDC7A}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{9E837500-FF9B-4EB8-A411-11C528CDDC7A}.Debug|x86.Build.0 = Debug|Any CPU
+		{9E837500-FF9B-4EB8-A411-11C528CDDC7A}.DevRelease|Any CPU.ActiveCfg = Debug|Any CPU
+		{9E837500-FF9B-4EB8-A411-11C528CDDC7A}.DevRelease|Any CPU.Build.0 = Debug|Any CPU
+		{9E837500-FF9B-4EB8-A411-11C528CDDC7A}.DevRelease|x64.ActiveCfg = Debug|Any CPU
+		{9E837500-FF9B-4EB8-A411-11C528CDDC7A}.DevRelease|x64.Build.0 = Debug|Any CPU
+		{9E837500-FF9B-4EB8-A411-11C528CDDC7A}.DevRelease|x86.ActiveCfg = Debug|Any CPU
+		{9E837500-FF9B-4EB8-A411-11C528CDDC7A}.DevRelease|x86.Build.0 = Debug|Any CPU
+		{9E837500-FF9B-4EB8-A411-11C528CDDC7A}.DevSteam|Any CPU.ActiveCfg = Debug|Any CPU
+		{9E837500-FF9B-4EB8-A411-11C528CDDC7A}.DevSteam|Any CPU.Build.0 = Debug|Any CPU
+		{9E837500-FF9B-4EB8-A411-11C528CDDC7A}.DevSteam|x64.ActiveCfg = Debug|Any CPU
+		{9E837500-FF9B-4EB8-A411-11C528CDDC7A}.DevSteam|x64.Build.0 = Debug|Any CPU
+		{9E837500-FF9B-4EB8-A411-11C528CDDC7A}.DevSteam|x86.ActiveCfg = Debug|Any CPU
+		{9E837500-FF9B-4EB8-A411-11C528CDDC7A}.DevSteam|x86.Build.0 = Debug|Any CPU
+		{9E837500-FF9B-4EB8-A411-11C528CDDC7A}.MSIX Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{9E837500-FF9B-4EB8-A411-11C528CDDC7A}.MSIX Debug|Any CPU.Build.0 = Debug|Any CPU
+		{9E837500-FF9B-4EB8-A411-11C528CDDC7A}.MSIX Debug|x64.ActiveCfg = Debug|Any CPU
+		{9E837500-FF9B-4EB8-A411-11C528CDDC7A}.MSIX Debug|x64.Build.0 = Debug|Any CPU
+		{9E837500-FF9B-4EB8-A411-11C528CDDC7A}.MSIX Debug|x86.ActiveCfg = Debug|Any CPU
+		{9E837500-FF9B-4EB8-A411-11C528CDDC7A}.MSIX Debug|x86.Build.0 = Debug|Any CPU
+		{9E837500-FF9B-4EB8-A411-11C528CDDC7A}.MSIX|Any CPU.ActiveCfg = Debug|Any CPU
+		{9E837500-FF9B-4EB8-A411-11C528CDDC7A}.MSIX|Any CPU.Build.0 = Debug|Any CPU
+		{9E837500-FF9B-4EB8-A411-11C528CDDC7A}.MSIX|x64.ActiveCfg = Debug|Any CPU
+		{9E837500-FF9B-4EB8-A411-11C528CDDC7A}.MSIX|x64.Build.0 = Debug|Any CPU
+		{9E837500-FF9B-4EB8-A411-11C528CDDC7A}.MSIX|x86.ActiveCfg = Debug|Any CPU
+		{9E837500-FF9B-4EB8-A411-11C528CDDC7A}.MSIX|x86.Build.0 = Debug|Any CPU
+		{9E837500-FF9B-4EB8-A411-11C528CDDC7A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{9E837500-FF9B-4EB8-A411-11C528CDDC7A}.Release|Any CPU.Build.0 = Release|Any CPU
+		{9E837500-FF9B-4EB8-A411-11C528CDDC7A}.Release|x64.ActiveCfg = Release|Any CPU
+		{9E837500-FF9B-4EB8-A411-11C528CDDC7A}.Release|x64.Build.0 = Release|Any CPU
+		{9E837500-FF9B-4EB8-A411-11C528CDDC7A}.Release|x86.ActiveCfg = Release|Any CPU
+		{9E837500-FF9B-4EB8-A411-11C528CDDC7A}.Release|x86.Build.0 = Release|Any CPU
+		{9E837500-FF9B-4EB8-A411-11C528CDDC7A}.Steam|Any CPU.ActiveCfg = Debug|Any CPU
+		{9E837500-FF9B-4EB8-A411-11C528CDDC7A}.Steam|Any CPU.Build.0 = Debug|Any CPU
+		{9E837500-FF9B-4EB8-A411-11C528CDDC7A}.Steam|x64.ActiveCfg = Debug|Any CPU
+		{9E837500-FF9B-4EB8-A411-11C528CDDC7A}.Steam|x64.Build.0 = Debug|Any CPU
+		{9E837500-FF9B-4EB8-A411-11C528CDDC7A}.Steam|x86.ActiveCfg = Debug|Any CPU
+		{9E837500-FF9B-4EB8-A411-11C528CDDC7A}.Steam|x86.Build.0 = Debug|Any CPU
+		{71907779-F1D1-4AA6-BA11-E990DB089841}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{71907779-F1D1-4AA6-BA11-E990DB089841}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{71907779-F1D1-4AA6-BA11-E990DB089841}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{71907779-F1D1-4AA6-BA11-E990DB089841}.Debug|x64.Build.0 = Debug|Any CPU
+		{71907779-F1D1-4AA6-BA11-E990DB089841}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{71907779-F1D1-4AA6-BA11-E990DB089841}.Debug|x86.Build.0 = Debug|Any CPU
+		{71907779-F1D1-4AA6-BA11-E990DB089841}.DevRelease|Any CPU.ActiveCfg = Debug|Any CPU
+		{71907779-F1D1-4AA6-BA11-E990DB089841}.DevRelease|Any CPU.Build.0 = Debug|Any CPU
+		{71907779-F1D1-4AA6-BA11-E990DB089841}.DevRelease|x64.ActiveCfg = Debug|Any CPU
+		{71907779-F1D1-4AA6-BA11-E990DB089841}.DevRelease|x64.Build.0 = Debug|Any CPU
+		{71907779-F1D1-4AA6-BA11-E990DB089841}.DevRelease|x86.ActiveCfg = Debug|Any CPU
+		{71907779-F1D1-4AA6-BA11-E990DB089841}.DevRelease|x86.Build.0 = Debug|Any CPU
+		{71907779-F1D1-4AA6-BA11-E990DB089841}.DevSteam|Any CPU.ActiveCfg = Debug|Any CPU
+		{71907779-F1D1-4AA6-BA11-E990DB089841}.DevSteam|Any CPU.Build.0 = Debug|Any CPU
+		{71907779-F1D1-4AA6-BA11-E990DB089841}.DevSteam|x64.ActiveCfg = Debug|Any CPU
+		{71907779-F1D1-4AA6-BA11-E990DB089841}.DevSteam|x64.Build.0 = Debug|Any CPU
+		{71907779-F1D1-4AA6-BA11-E990DB089841}.DevSteam|x86.ActiveCfg = Debug|Any CPU
+		{71907779-F1D1-4AA6-BA11-E990DB089841}.DevSteam|x86.Build.0 = Debug|Any CPU
+		{71907779-F1D1-4AA6-BA11-E990DB089841}.MSIX Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{71907779-F1D1-4AA6-BA11-E990DB089841}.MSIX Debug|Any CPU.Build.0 = Debug|Any CPU
+		{71907779-F1D1-4AA6-BA11-E990DB089841}.MSIX Debug|x64.ActiveCfg = Debug|Any CPU
+		{71907779-F1D1-4AA6-BA11-E990DB089841}.MSIX Debug|x64.Build.0 = Debug|Any CPU
+		{71907779-F1D1-4AA6-BA11-E990DB089841}.MSIX Debug|x86.ActiveCfg = Debug|Any CPU
+		{71907779-F1D1-4AA6-BA11-E990DB089841}.MSIX Debug|x86.Build.0 = Debug|Any CPU
+		{71907779-F1D1-4AA6-BA11-E990DB089841}.MSIX|Any CPU.ActiveCfg = Debug|Any CPU
+		{71907779-F1D1-4AA6-BA11-E990DB089841}.MSIX|Any CPU.Build.0 = Debug|Any CPU
+		{71907779-F1D1-4AA6-BA11-E990DB089841}.MSIX|x64.ActiveCfg = Debug|Any CPU
+		{71907779-F1D1-4AA6-BA11-E990DB089841}.MSIX|x64.Build.0 = Debug|Any CPU
+		{71907779-F1D1-4AA6-BA11-E990DB089841}.MSIX|x86.ActiveCfg = Debug|Any CPU
+		{71907779-F1D1-4AA6-BA11-E990DB089841}.MSIX|x86.Build.0 = Debug|Any CPU
+		{71907779-F1D1-4AA6-BA11-E990DB089841}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{71907779-F1D1-4AA6-BA11-E990DB089841}.Release|Any CPU.Build.0 = Release|Any CPU
+		{71907779-F1D1-4AA6-BA11-E990DB089841}.Release|x64.ActiveCfg = Release|Any CPU
+		{71907779-F1D1-4AA6-BA11-E990DB089841}.Release|x64.Build.0 = Release|Any CPU
+		{71907779-F1D1-4AA6-BA11-E990DB089841}.Release|x86.ActiveCfg = Release|Any CPU
+		{71907779-F1D1-4AA6-BA11-E990DB089841}.Release|x86.Build.0 = Release|Any CPU
+		{71907779-F1D1-4AA6-BA11-E990DB089841}.Steam|Any CPU.ActiveCfg = Debug|Any CPU
+		{71907779-F1D1-4AA6-BA11-E990DB089841}.Steam|Any CPU.Build.0 = Debug|Any CPU
+		{71907779-F1D1-4AA6-BA11-E990DB089841}.Steam|x64.ActiveCfg = Debug|Any CPU
+		{71907779-F1D1-4AA6-BA11-E990DB089841}.Steam|x64.Build.0 = Debug|Any CPU
+		{71907779-F1D1-4AA6-BA11-E990DB089841}.Steam|x86.ActiveCfg = Debug|Any CPU
+		{71907779-F1D1-4AA6-BA11-E990DB089841}.Steam|x86.Build.0 = Debug|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -1330,6 +1506,10 @@ Global
 		{19704B2E-5EED-47CA-9258-89F246F50F19} = {1E816135-76C1-4255-BE3C-BF17895A65AA}
 		{8F4FFC91-BE9F-4476-A372-FBD952865F15} = {1E816135-76C1-4255-BE3C-BF17895A65AA}
 		{427CE098-4B13-4E46-8C66-D924140B6CAE} = {1E816135-76C1-4255-BE3C-BF17895A65AA}
+		{F4436A16-9488-4BAB-B2F6-C1806278CE16} = {E4FF4CE6-5831-450D-8006-0539353C030B}
+		{1AD04210-1055-4014-8FB5-15DC1621EA35} = {1E816135-76C1-4255-BE3C-BF17895A65AA}
+		{9E837500-FF9B-4EB8-A411-11C528CDDC7A} = {5AFBF881-C054-4CE4-8159-8D4017FFD27A}
+		{71907779-F1D1-4AA6-BA11-E990DB089841} = {1E816135-76C1-4255-BE3C-BF17895A65AA}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {D04B4AB0-CA33-42FD-A909-79966F9255C5}

+ 21 - 0
src/WasmRuntimeTest/ConsoleLogger.cs

@@ -0,0 +1,21 @@
+using PixiEditor.Extensions.Wasm.Api;
+
+namespace WasmRuntimeTest;
+
+public class ConsoleLogger : ILogger
+{
+    public void Log(string message)
+    {
+        Console.WriteLine(message);
+    }
+
+    public void LogError(string message)
+    {
+        Log(message);
+    }
+
+    public void LogWarning(string message)
+    {
+        Log(message);
+    }
+}

+ 5 - 0
src/WasmRuntimeTest/Program.cs

@@ -0,0 +1,5 @@
+using PixiEditor.Extensions.Wasm;
+using PixiEditor.WasmRuntime;
+
+WasmRuntime runtime = new WasmRuntime();
+runtime.LoadModule(@"C:\Git\PixiEditor\src\WasmSampleExtension\bin\Release\net8.0\wasi-wasm\publish\WasmSampleExtension.wasm");

+ 15 - 0
src/WasmRuntimeTest/WasmRuntimeTest.csproj

@@ -0,0 +1,15 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+    <PropertyGroup>
+        <OutputType>Exe</OutputType>
+        <TargetFramework>net8.0</TargetFramework>
+        <ImplicitUsings>enable</ImplicitUsings>
+        <Nullable>enable</Nullable>
+    </PropertyGroup>
+
+    <ItemGroup>
+      <ProjectReference Include="..\PixiEditor.Extensions.Wasm\PixiEditor.Extensions.Wasm.csproj" />
+      <ProjectReference Include="..\PixiEditor.WasmRuntime\PixiEditor.WasmRuntime.csproj" />
+    </ItemGroup>
+
+</Project>

+ 14 - 0
src/WasmSampleExtension/Entry.cs

@@ -0,0 +1,14 @@
+using System.Runtime.InteropServices;
+using PixiEditor.Extensions.Wasm;
+
+namespace SampleExtension.WASM;
+
+public static class Entry
+{
+    [UnmanagedCallersOnly(EntryPoint = "Entry")]
+    public static void EntryPoint()
+    {
+        SampleExtension extension = new SampleExtension();
+        extension.OnLoaded();
+    }
+}

+ 17 - 0
src/WasmSampleExtension/SampleExtension.cs

@@ -0,0 +1,17 @@
+using PixiEditor.Extensions.Wasm;
+
+namespace SampleExtension.WASM;
+
+public class SampleExtension : WasmExtension
+{
+    public override void OnLoaded()
+    {
+        Api.Logger.Log("WASM SampleExtension loaded!");
+    }
+
+
+    public override void OnInitialized()
+    {
+        Api.Logger.Log("WASM SampleExtension initialized!");
+    }
+}

+ 20 - 0
src/WasmSampleExtension/WasmSampleExtension.csproj

@@ -0,0 +1,20 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net8.0</TargetFramework>
+    <OutputType>Library</OutputType>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+    <PublishTrimmed>true</PublishTrimmed>
+    <RuntimeIdentifier>wasi-wasm</RuntimeIdentifier>
+    <MSBuildEnableWorkloadResolver>false</MSBuildEnableWorkloadResolver>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <PackageReference Include="Microsoft.DotNet.ILCompiler.LLVM; runtime.win-x64.Microsoft.DotNet.ILCompiler.LLVM" Version="9.0.0-*" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\PixiEditor.Extensions.Wasm\PixiEditor.Extensions.Wasm.csproj" />
+  </ItemGroup>
+</Project>

+ 30 - 0
src/WasmSampleExtension/extension.json

@@ -0,0 +1,30 @@
+{
+  "displayName": "Sample Extension 2 - WASM",
+  "uniqueName": "yourCompany.Samples.WasmSampleExtension",
+  "description": "Sample WASM extension for PixiEditor",
+  "version": "1.0.0",
+  "author": {
+    "name": "PixiEditor",
+    "email": "[email protected]",
+    "website": "https://pixieditor.net"
+  },
+  "publisher": {
+    "name": "PixiEditor",
+    "email": "[email protected]",
+    "website": "https://pixieditor.net"
+  },
+  "contributors": [
+    {
+      "name": "flabbet",
+      "email": "[email protected]",
+      "website": "https://github.com/flabbet"
+    },
+    {
+      "name": "CPK"
+    }
+  ],
+  "license": "MIT",
+  "categories": [
+    "Extension"
+  ]
+}

+ 12 - 0
src/WasmSampleExtension/nuget.config

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+  <config>
+    <add key="globalPackagesFolder" value=".packages" />
+  </config>
+  <packageSources>
+    <!--To inherit the global NuGet package sources remove the <clear/> line below -->
+    <clear />
+    <add key="dotnet-experimental" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-experimental/nuget/v3/index.json" />
+    <add key="nuget" value="https://api.nuget.org/v3/index.json" />
+  </packageSources>
+</configuration>