Vous ne savez pas si vous avez trouvé la réponse que vous recherchiez. Voici une étape par étape pour créer une dll de ressources
- Créer un nouveau projet dans Visual Studio, bibliothèque de classes
- Ajouter vos ressources (images) au projet (Ajouter un élément existant)
- Pour chaque ressources, dans la fenêtre propriétés, définissez Construire action ressource incorporée
- compiler la bibliothèque, produit une dll
- dans votre application winForms, vous pouvez maintenant charger cette assemblée à l'exécution (code n ° 1)
- charge la ressource diffuser ce vous voulez et l'enregistrer sur un objet Bitmap (Code # 2)
Code # 1
Assembly ambly = Assembly.LoadFile(pathToDll);
Code # 2
BitMap bitMap;
// where "ns" is the default namespace of the resource project
using (Stream resourceStream = ambly.GetManifestResourceSream("ns.image.jpg"))
{
bitMap = BitMap.FromStream(resourceStream);
}
Ce sont les techniques de base utilisées pour l'intégration des ressources et les charger à l'exécution. Maintenant, puisque vous envisagez d'avoir des thèmes différents, et de stocker les ressources pour chaque thème dans différentes bibliothèques, vous devriez avoir une interface qui spécifie une sorte de gestionnaire de ressources, défini dans votre application principale.
Un exemple
interface IThemeResourceProvider
{
Stream LoadBigLogo();
Stream LoadSmallLogo();
}
mettre en œuvre ensuite cette interface dans votre bibliothèque de ressources
public class ThemeResourceProvider : IThemeResourceProvider
{
public Stream LoadBigLogo()
{
Assembly ambly = Assembly.GetExecutingAssembly();
return ambly.GetManifestResourceStream("namespace.image.jpg");
}
(...)
}
Enfin, au lieu de charger la ressource directement dans votre application principale, vous instancier le IThemeResourceProvider trouvé dans la bibliothèque de ressources
Assembly assembly = Assembly.LoadFile(pathToDll);
var results = from type in assembly.GetTypes()
where typeof(IThemeResourceProvider).IsAssignableFrom(type)
select type;
Maintenant vous avez un IEnumerable<Type>
dans cette liste. En général, vous n'en avez qu'une, mais en utilisant cette approche, vous pouvez également héberger plusieurs ensembles de ressources et implémenter plusieurs IThemeResourceProviders dans la même DLL de ressources. Vous pourriez, par exemple, identifier chaque IThemeResourceProvider avec un nom, soit comme une propriété, ou en utilisant une décoration personnalisée [Attribute]
sur vos différentes implémentations. Je vais laisser le reste à toi pour comprendre.
Mais voici comment instancier les IThemeResourceProviders dans votre liste
foreach (var providerType in results)
{
var constructorInfo = providerType.GetConstructor(Type.EmptyTypes);
IThemeResourceProvider provider = constructorInfo.Invoke(null);
}
Et enfin, en utilisant un de ces fournisseurs pour obtenir une image bitmap:
BitMap bitMap;
using (Stream resourceStream = provider.LoadBigLogo())
{
bitMap = BitMap.FromStream(resourceStream);
}
Comment puis-je intégrer les images en tant que ressources et créer une ressource distincte pour chaque thème? – csq
En studio visuel, accédez aux propriétés du projet et aux ressources. Là sélectionnez l'image et ajoutez. Jouez un peu plus avec VS;) – Zenwalker
Alors comment vais-je utiliser les images dans un autre projet? – csq