Skip to content

Instantly share code, notes, and snippets.

@otuncelli
Last active May 10, 2017 00:44
Show Gist options
  • Save otuncelli/97c206f4812e6ace99039b33b1bce045 to your computer and use it in GitHub Desktop.
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)
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