Не уверен, что получил ответ, который искал.Вот пошаговое руководство по созданию ресурса dll
- Создание нового проекта в Visual Studio, библиотека классов
- Добавление ресурсов (изображений) в проект (Добавить существующий элемент)
- Для каждого ресурса в окне свойств установите Build Action для встроенного ресурса
- Скомпилируйте библиотеку, создайте dll
- В вашем приложении winforms теперь вы можете загрузитьэта сборка во время выполнения (Код # 1)
- Загрузите требуемый поток ресурсов и сохраните его в растровом объекте (Код # 2)
Код # 1
Assembly ambly = Assembly.LoadFile(pathToDll);
Код # 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);
}
Это основные методы, используемые для встраивания ресурсов и их загрузки во время выполнения.
Теперь, поскольку вы думаете о том, чтобы иметь разные темы, и храните ресурсы для каждой темы в разных библиотеках, у вас должен быть интерфейс, который задает какой-то менеджер ресурсов, определенный в вашем основном приложении.
Пример
interface IThemeResourceProvider
{
Stream LoadBigLogo();
Stream LoadSmallLogo();
}
Затем внедрите этот интерфейс в свою библиотеку ресурсов
public class ThemeResourceProvider : IThemeResourceProvider
{
public Stream LoadBigLogo()
{
Assembly ambly = Assembly.GetExecutingAssembly();
return ambly.GetManifestResourceStream("namespace.image.jpg");
}
(...)
}
Наконец, вместо загрузки ресурса непосредственно в основное приложение, вы создаете экземплярIThemeResourceProvider найден в библиотеке ресурсов
Assembly assembly = Assembly.LoadFile(pathToDll);
var results = from type in assembly.GetTypes()
where typeof(IThemeResourceProvider).IsAssignableFrom(type)
select type;
Теперь у вас есть IEnumerable<Type>
в этом списке.Как правило, у вас есть только один, но используя этот подход, вы также можете разместить несколько наборов ресурсов и реализовать несколько IThemeResourceProviders в одной и той же ресурсной DLL.Вы можете, например, идентифицировать каждый IThemeResourceProvider с именем, либо как свойство, либо с помощью пользовательского украшения [Attribute]
в ваших различных реализациях.Остальное я оставлю на ваше усмотрение, чтобы выяснить.
Но вот как создать экземпляр IThemeResourceProviders в вашем списке
foreach (var providerType in results)
{
var constructorInfo = providerType.GetConstructor(Type.EmptyTypes);
IThemeResourceProvider provider = constructorInfo.Invoke(null);
}
И, наконец, использовать одного из этих провайдеров для получения растрового изображения:
BitMap bitMap;
using (Stream resourceStream = provider.LoadBigLogo())
{
bitMap = BitMap.FromStream(resourceStream);
}