Last active
May 10, 2017 00:44
-
-
Save otuncelli/97c206f4812e6ace99039b33b1bce045 to your computer and use it in GitHub Desktop.
ResourceManager for Single Assembly (Including localization resources) (for use with ILRepack or ILMerge)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class SingleAssemblyResourceManager : ResourceManager | |
{ | |
private readonly Type _resourceSource; | |
private CultureInfo _neutralResourcesCulture; | |
private readonly Dictionary<string, ResourceSet> _resourceSets; | |
private readonly string[] _resourceNames; | |
private SingleAssemblyResourceManager(Type resourceSource) : | |
base(resourceSource) | |
{ | |
_resourceSource = resourceSource; | |
_resourceSets = new Dictionary<string, ResourceSet>(StringComparer.OrdinalIgnoreCase); | |
_resourceNames = MainAssembly.GetManifestResourceNames(); | |
} | |
protected override ResourceSet InternalGetResourceSet(CultureInfo culture, bool createIfNotExists, | |
bool tryParents) | |
{ | |
ResourceSet rs; | |
if (_resourceSets.TryGetValue(culture.Name, out rs)) | |
return rs; | |
if (_neutralResourcesCulture == null) | |
_neutralResourcesCulture = GetNeutralResourcesLanguage(MainAssembly); | |
if (culture.Equals(_neutralResourcesCulture)) | |
culture = CultureInfo.InvariantCulture; | |
Stream store = GetManifestResourceStream(culture); | |
rs = store != null | |
? new ResourceSet(store) | |
: base.InternalGetResourceSet(culture, createIfNotExists, tryParents); | |
_resourceSets.Add(culture.Name, rs); | |
return rs; | |
} | |
public static void Initialize(Type resourceSource) | |
{ | |
var rm = new SingleAssemblyResourceManager(resourceSource); | |
FieldInfo mi = resourceSource.GetField("resourceMan", | |
BindingFlags.Static | BindingFlags.NonPublic); | |
mi?.SetValue(null, rm); | |
} | |
private Stream GetManifestResourceStream(CultureInfo culture) | |
{ | |
string fileName = GetResourceFileName(culture); | |
string fullName = string.Join(".", _resourceSource.FullName, fileName.Substring(fileName.IndexOf('.') + 1)); | |
fullName = _resourceNames.FirstOrDefault(n => n.Equals(fullName, StringComparison.OrdinalIgnoreCase)); | |
fileName = fullName?.Substring(fullName.Length - fileName.Length); | |
return MainAssembly.GetManifestResourceStream(_resourceSource, fileName); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment