StreamWrapper

This commit is contained in:
js6pak committed 2021-10-31 02:12:26 +02:00
1 parent ad1635df9e
commit 7a84617b1b
3 files changed
+83 -1

No files matched your search

+81
View File
@@ -0,0 +1,81 @@
using System;
using System.IO;
using System.Runtime.CompilerServices;
using UnhollowerBaseLib;
using UnhollowerBaseLib.Attributes;
using UnhollowerRuntimeLib;
namespace Reactor.Extensions
{
[RegisterInIl2Cpp]
public class StreamWrapper : Il2CppSystem.IO.Stream
{
private readonly Stream _stream;
public StreamWrapper(IntPtr ptr) : base(ptr) { }
public StreamWrapper(Stream stream) : base(ClassInjector.DerivedConstructorPointer<StreamWrapper>())
{
ClassInjector.DerivedConstructorBody(this);
_stream = stream;
}
[HideFromIl2Cpp]
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static unsafe Span<byte> GetSpan(Il2CppStructArray<byte> buffer, int offset, int count)
{
var rawBuffer = (byte*) buffer.Pointer + 4 * IntPtr.Size;
return new Span<byte>(rawBuffer + offset, count);
}
public override int Read(Il2CppStructArray<byte> buffer, int offset, int count)
{
return _stream.Read(GetSpan(buffer, offset, count));
}
public override void Write(Il2CppStructArray<byte> buffer, int offset, int count)
{
_stream.Write(GetSpan(buffer, offset, count));
}
public override void Flush()
{
_stream.Flush();
}
public override long Seek(long offset, Il2CppSystem.IO.SeekOrigin origin)
{
return _stream.Seek(offset, origin switch
{
Il2CppSystem.IO.SeekOrigin.Begin => SeekOrigin.Begin,
Il2CppSystem.IO.SeekOrigin.Current => SeekOrigin.Current,
Il2CppSystem.IO.SeekOrigin.End => SeekOrigin.End,
_ => throw new ArgumentOutOfRangeException(nameof(origin), origin, null)
});
}
public override void SetLength(long value)
{
_stream.SetLength(value);
}
public override bool CanRead => _stream.CanRead;
public override bool CanSeek => _stream.CanSeek;
public override bool CanWrite => _stream.CanWrite;
public override long Length => _stream.Length;
public override long Position
{
get => _stream.Position;
set => _stream.Position = value;
}
}
public static class StreamExtensions
{
/// <summary>
/// Wraps a System Stream into an Il2Cpp Stream
/// </summary>
public static StreamWrapper AsIl2Cpp(this Stream stream) => new(stream);
}
}
+1
View File
@@ -3,6 +3,7 @@
<TargetFramework>netstandard2.1</TargetFramework>
<LangVersion>latest</LangVersion>
<DebugType>embedded</DebugType>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<VersionPrefix>1.1.0</VersionPrefix>
<VersionSuffix>dev</VersionSuffix>
+1 -1
View File
@@ -8,7 +8,7 @@ namespace Reactor.Unstrip
{
public static void Load()
{
var bundle = AssetBundle.LoadFromMemory(typeof(ReactorPlugin).Assembly.GetManifestResourceStream("Reactor.Assets.default.bundle").ReadFully());
var bundle = AssetBundle.LoadFromStream(typeof(ReactorPlugin).Assembly.GetManifestResourceStream("Reactor.Assets.default.bundle").AsIl2Cpp());
var backupShader = bundle.LoadAsset<Shader>("UI-Default");