2022-07-05 15:15:26 -05:00
|
|
|
using Microsoft.Iris.Data;
|
|
|
|
|
using System;
|
|
|
|
|
using System.Reflection;
|
|
|
|
|
using System.Runtime.InteropServices;
|
|
|
|
|
|
2025-08-06 23:31:49 -05:00
|
|
|
using ResourceManagerCore = System.Resources.ResourceManager;
|
|
|
|
|
|
2022-07-05 15:15:26 -05:00
|
|
|
namespace Microsoft.Iris.OS
|
|
|
|
|
{
|
|
|
|
|
internal class ClrDllResource : Resource
|
|
|
|
|
{
|
|
|
|
|
private Assembly _assembly;
|
|
|
|
|
private string _identifier;
|
2025-08-06 23:31:49 -05:00
|
|
|
private string _specifier;
|
2022-07-05 15:15:26 -05:00
|
|
|
private GCHandle _handle;
|
|
|
|
|
private IntPtr _buffer;
|
|
|
|
|
private uint _length;
|
|
|
|
|
|
2025-08-06 23:31:49 -05:00
|
|
|
internal ClrDllResource(string uri, Assembly assembly, string identifier, string specifier)
|
2022-07-05 15:15:26 -05:00
|
|
|
: base(uri, true)
|
|
|
|
|
{
|
|
|
|
|
_assembly = assembly;
|
2025-08-06 23:31:49 -05:00
|
|
|
_identifier = identifier.ToUpperInvariant();
|
|
|
|
|
_specifier = specifier ?? "RCDATA";
|
2022-07-05 15:15:26 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override string Identifier => _identifier;
|
|
|
|
|
|
|
|
|
|
protected override void StartAcquisition(bool forceSynchronous)
|
|
|
|
|
{
|
|
|
|
|
string errorDetails = null;
|
|
|
|
|
if (_buffer == IntPtr.Zero)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
2025-08-06 23:31:49 -05:00
|
|
|
var rm = new ResourceManagerCore(_specifier, _assembly);
|
2022-07-05 15:15:26 -05:00
|
|
|
|
2025-08-06 23:31:49 -05:00
|
|
|
var data = (byte[])rm.GetObject(_identifier);
|
2022-07-05 15:15:26 -05:00
|
|
|
|
|
|
|
|
_handle = GCHandle.Alloc(data, GCHandleType.Pinned);
|
|
|
|
|
_buffer = _handle.AddrOfPinnedObject();
|
|
|
|
|
_length = (uint)data.LongLength;
|
|
|
|
|
}
|
|
|
|
|
catch
|
|
|
|
|
{
|
2025-08-06 23:31:49 -05:00
|
|
|
errorDetails = $"Resource '{_identifier}' not found in {_assembly}, resource '{_specifier}'";
|
2022-07-05 15:15:26 -05:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
NotifyAcquisitionComplete(_buffer, _length, false, errorDetails);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected override void CancelAcquisition()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override string ToString() => _assembly.GetName().Name + "|" + _identifier.ToLowerInvariant();
|
|
|
|
|
}
|
|
|
|
|
}
|