Browse Source

Merge pull request #2279 from ahopper/fix-assetloader-for-corert

Fix assetloader for corert
pull/2291/head
Nikita Tsukanov 7 years ago
committed by GitHub
parent
commit
f079fcb7fe
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 20
      src/Avalonia.Base/Utilities/AvaloniaResourcesIndex.cs
  2. 16
      src/Markup/Avalonia.Markup.Xaml/AvaloniaXamlLoader.cs

20
src/Avalonia.Base/Utilities/AvaloniaResourcesIndex.cs

@ -4,6 +4,8 @@ using System.IO;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using System.Runtime.Serialization; using System.Runtime.Serialization;
using System.Runtime.Serialization.Json; using System.Runtime.Serialization.Json;
using System.Xml.Linq;
using System.Linq;
// ReSharper disable AssignNullToNotNullAttribute // ReSharper disable AssignNullToNotNullAttribute
@ -19,10 +21,20 @@ namespace Avalonia.Utilities
{ {
var ver = new BinaryReader(stream).ReadInt32(); var ver = new BinaryReader(stream).ReadInt32();
if (ver > LastKnownVersion) if (ver > LastKnownVersion)
throw new Exception("Resources index format version is not known"); throw new Exception("Resources index format version is not known");
var index = (AvaloniaResourcesIndex)
new DataContractSerializer(typeof(AvaloniaResourcesIndex)).ReadObject(stream); var assetDoc = XDocument.Load(stream);
return index.Entries; XNamespace assetNs = assetDoc.Root.Attribute("xmlns").Value;
List<AvaloniaResourcesIndexEntry> entries=
(from entry in assetDoc.Root.Element(assetNs + "Entries").Elements(assetNs + "AvaloniaResourcesIndexEntry")
select new AvaloniaResourcesIndexEntry
{
Path = entry.Element(assetNs + "Path").Value,
Offset = int.Parse(entry.Element(assetNs + "Offset").Value),
Size = int.Parse(entry.Element(assetNs + "Size").Value)
}).ToList();
return entries;
} }
public static void Write(Stream stream, List<AvaloniaResourcesIndexEntry> entries) public static void Write(Stream stream, List<AvaloniaResourcesIndexEntry> entries)

16
src/Markup/Avalonia.Markup.Xaml/AvaloniaXamlLoader.cs

@ -13,6 +13,8 @@ using System.Reflection;
using System.Runtime.Serialization; using System.Runtime.Serialization;
using System.Runtime.Serialization.Json; using System.Runtime.Serialization.Json;
using System.Text; using System.Text;
using System.Xml.Linq;
using System.Linq;
namespace Avalonia.Markup.Xaml namespace Avalonia.Markup.Xaml
{ {
@ -240,15 +242,21 @@ namespace Avalonia.Markup.Xaml
{ {
using (var xamlInfoStream = assetLocator.Open(xamlInfoUri)) using (var xamlInfoStream = assetLocator.Open(xamlInfoUri))
{ {
var xamlInfo = (AvaloniaResourceXamlInfo)s_xamlInfoSerializer.ReadObject(xamlInfoStream); var assetDoc = XDocument.Load(xamlInfoStream);
if (xamlInfo.ClassToResourcePathIndex.TryGetValue(typeName, out var rv) == true) XNamespace assetNs = assetDoc.Root.Attribute("xmlns").Value;
XNamespace arrayNs = "http://schemas.microsoft.com/2003/10/Serialization/Arrays";
Dictionary<string,string> xamlInfo =
assetDoc.Root.Element(assetNs + "ClassToResourcePathIndex").Elements(arrayNs + "KeyValueOfstringstring")
.ToDictionary(entry =>entry.Element(arrayNs + "Key").Value,
entry => entry.Element(arrayNs + "Value").Value);
if (xamlInfo.TryGetValue(typeName, out var rv) == true)
{ {
yield return new Uri($"avares://{asm}{rv}"); yield return new Uri($"avares://{asm}{rv}");
yield break; yield break;
} }
} }
} }
yield return new Uri("resm:" + typeName + ".xaml?assembly=" + asm); yield return new Uri("resm:" + typeName + ".xaml?assembly=" + asm);
yield return new Uri("resm:" + typeName + ".paml?assembly=" + asm); yield return new Uri("resm:" + typeName + ".paml?assembly=" + asm);

Loading…
Cancel
Save