EmbeddedResources.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. using System;
  2. using System.IO;
  3. using System.Reflection;
  4. using System.Threading.Tasks;
  5. namespace Ryujinx.Common
  6. {
  7. public static class EmbeddedResources
  8. {
  9. private readonly static Assembly ResourceAssembly;
  10. static EmbeddedResources()
  11. {
  12. ResourceAssembly = Assembly.GetAssembly(typeof(EmbeddedResources));
  13. }
  14. public static byte[] Read(string filename)
  15. {
  16. var (assembly, path) = ResolveManifestPath(filename);
  17. return Read(assembly, path);
  18. }
  19. public static Task<byte[]> ReadAsync(string filename)
  20. {
  21. var (assembly, path) = ResolveManifestPath(filename);
  22. return ReadAsync(assembly, path);
  23. }
  24. public static byte[] Read(Assembly assembly, string filename)
  25. {
  26. using (var stream = GetStream(assembly, filename))
  27. {
  28. if (stream == null)
  29. {
  30. return null;
  31. }
  32. using (var mem = new MemoryStream())
  33. {
  34. stream.CopyTo(mem);
  35. return mem.ToArray();
  36. }
  37. }
  38. }
  39. public async static Task<byte[]> ReadAsync(Assembly assembly, string filename)
  40. {
  41. using (var stream = GetStream(assembly, filename))
  42. {
  43. if (stream == null)
  44. {
  45. return null;
  46. }
  47. using (var mem = new MemoryStream())
  48. {
  49. await stream.CopyToAsync(mem);
  50. return mem.ToArray();
  51. }
  52. }
  53. }
  54. public static string ReadAllText(string filename)
  55. {
  56. var (assembly, path) = ResolveManifestPath(filename);
  57. return ReadAllText(assembly, path);
  58. }
  59. public static Task<string> ReadAllTextAsync(string filename)
  60. {
  61. var (assembly, path) = ResolveManifestPath(filename);
  62. return ReadAllTextAsync(assembly, path);
  63. }
  64. public static string ReadAllText(Assembly assembly, string filename)
  65. {
  66. using (var stream = GetStream(assembly, filename))
  67. {
  68. if (stream == null)
  69. {
  70. return null;
  71. }
  72. using (var reader = new StreamReader(stream))
  73. {
  74. return reader.ReadToEnd();
  75. }
  76. }
  77. }
  78. public async static Task<string> ReadAllTextAsync(Assembly assembly, string filename)
  79. {
  80. using (var stream = GetStream(assembly, filename))
  81. {
  82. if (stream == null)
  83. {
  84. return null;
  85. }
  86. using (var reader = new StreamReader(stream))
  87. {
  88. return await reader.ReadToEndAsync();
  89. }
  90. }
  91. }
  92. public static Stream GetStream(string filename)
  93. {
  94. var (assembly, path) = ResolveManifestPath(filename);
  95. return GetStream(assembly, path);
  96. }
  97. public static Stream GetStream(Assembly assembly, string filename)
  98. {
  99. var namespace_ = assembly.GetName().Name;
  100. var manifestUri = namespace_ + "." + filename.Replace('/', '.');
  101. var stream = assembly.GetManifestResourceStream(manifestUri);
  102. return stream;
  103. }
  104. private static (Assembly, string) ResolveManifestPath(string filename)
  105. {
  106. var segments = filename.Split('/', 2, StringSplitOptions.RemoveEmptyEntries);
  107. if (segments.Length >= 2)
  108. {
  109. foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
  110. {
  111. if (assembly.GetName().Name == segments[0])
  112. {
  113. return (assembly, segments[1]);
  114. }
  115. }
  116. }
  117. return (ResourceAssembly, filename);
  118. }
  119. }
  120. }