4b90d16250
This commit adds initial support for games exported as NativeAOT shared libraries. At this moment, the NativeAOT runtime is experimental. Additionally, Godot is not trim-safe as it still makes some use of reflection. For the time being, a rd.xml file is needed to prevent code triming: ``` <Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata"> <Application> <Assembly Name="GodotSharp" Dynamic="Required All" /> <Assembly Name="GAME_ASSEMBLY" Dynamic="Required All" /> </Application> </Directives> ``` These are the csproj changes for publishing: ``` <PropertyGroup> <NativeLib>Shared</NativeLib> </PropertyGroup> <ItemGroup> <RdXmlFile Include="rd.xml" /> <PackageReference Include="Microsoft.DotNet.ILCompiler" Version="7.0.0-*" /> </ItemGroup> ``` More info: - https://github.com/dotnet/runtimelab/blob/feature/NativeAOT/docs/using-nativeaot/compiling.md - https://github.com/dotnet/runtimelab/tree/feature/NativeAOT/samples/NativeLibrary - https://github.com/dotnet/runtimelab/blob/feature/NativeAOT/docs/using-nativeaot/rd-xml-format.md
60 lines
1.7 KiB
C#
60 lines
1.7 KiB
C#
using System.Text;
|
|
using Microsoft.CodeAnalysis;
|
|
using Microsoft.CodeAnalysis.Text;
|
|
|
|
namespace Godot.SourceGenerators
|
|
{
|
|
[Generator]
|
|
public class GodotPluginsInitializerGenerator : ISourceGenerator
|
|
{
|
|
public void Initialize(GeneratorInitializationContext context)
|
|
{
|
|
}
|
|
|
|
public void Execute(GeneratorExecutionContext context)
|
|
{
|
|
if (context.IsGodotToolsProject())
|
|
return;
|
|
|
|
string source =
|
|
@"using System;
|
|
using System.Runtime.InteropServices;
|
|
using Godot.Bridge;
|
|
using Godot.NativeInterop;
|
|
|
|
namespace GodotPlugins.Game
|
|
{
|
|
internal static partial class Main
|
|
{
|
|
[UnmanagedCallersOnly(EntryPoint = ""godotsharp_game_main_init"")]
|
|
private static godot_bool InitializeFromGameProject(IntPtr godotDllHandle, IntPtr outManagedCallbacks)
|
|
{
|
|
try
|
|
{
|
|
DllImportResolver dllImportResolver = new GodotDllImportResolver(godotDllHandle).OnResolveDllImport;
|
|
|
|
var coreApiAssembly = typeof(Godot.Object).Assembly;
|
|
|
|
NativeLibrary.SetDllImportResolver(coreApiAssembly, dllImportResolver);
|
|
|
|
ManagedCallbacks.Create(outManagedCallbacks);
|
|
|
|
ScriptManagerBridge.LookupScriptsInAssembly(typeof(GodotPlugins.Game.Main).Assembly);
|
|
|
|
return godot_bool.True;
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
Console.Error.WriteLine(e);
|
|
return false.ToGodotBool();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
";
|
|
|
|
context.AddSource("GodotPlugins.Game_Generated",
|
|
SourceText.From(source, Encoding.UTF8));
|
|
}
|
|
}
|
|
}
|