dotnet-experiments/multiplayer-game/src/engine/ResourceLoader.cs

51 lines
1.5 KiB
C#

using System.Runtime.InteropServices;
class ResourceLoader
{
private string assemblyName;
public ResourceLoader()
{
this.assemblyName = this.GetType().Assembly.GetName().Name!;
}
public string LoadString(string resourceName)
{
#if (DEBUG)
Console.WriteLine("Loading resource: " + resourceName);
return File.ReadAllText(ToPath(resourceName));
#endif
using var stream = this.GetType().Assembly.GetManifestResourceStream($"{this.assemblyName}.{resourceName}");
using var reader = new StreamReader(stream!);
return reader.ReadToEnd();
}
public byte[] LoadBytes(string resourceName)
{
using var stream = this.GetType().Assembly.GetManifestResourceStream($"{this.assemblyName}.{resourceName}");
using var memoryStream = new MemoryStream();
stream!.CopyTo(memoryStream);
return memoryStream.ToArray();
}
public (IntPtr ptr, int size) LoadToIntPtr(string resourceName)
{
var bytes = this.LoadBytes(resourceName);
var handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
var ptr = handle.AddrOfPinnedObject();
return (ptr, bytes.Length);
}
public void SaveString(string resourceName, string content)
{
using var stream = new StreamWriter(ToPath(resourceName));
stream.Write(content);
}
private static string ToPath(string resourceName)
{
var s = resourceName.Split('.');
return String.Join('/', s[..^1]) + "." + s[^1];
}
}