Files
MicrosoftIris/UIX/Microsoft/Iris/OS/ClrDllResource.cs
T

68 lines
2.0 KiB
C#
Raw Normal View History

2022-07-05 15:15:26 -05:00
using Microsoft.Iris.Data;
using System;
using System.Reflection;
using System.Runtime.InteropServices;
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;
private string _specifier;
2022-07-05 15:15:26 -05:00
private GCHandle _handle;
private IntPtr _buffer;
private uint _length;
internal ClrDllResource(string uri, Assembly assembly, string identifier, string specifier)
2022-07-05 15:15:26 -05:00
: base(uri, true)
{
_assembly = assembly;
_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)
{
var error = true;
2022-07-05 15:15:26 -05:00
try
{
var rm = new ResourceManagerCore(_specifier, _assembly);
2022-07-05 15:15:26 -05:00
var data = rm.GetObject(_identifier) as byte[];
2022-07-05 15:15:26 -05:00
if (data is not null)
{
_handle = GCHandle.Alloc(data, GCHandleType.Pinned);
_buffer = _handle.AddrOfPinnedObject();
_length = (uint)data.LongLength;
error = false;
}
2022-07-05 15:15:26 -05:00
}
catch
{
error = true;
2022-07-05 15:15:26 -05:00
}
if (error)
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();
}
}