您可以尝试这样的事情,尽管我不确定这是否是最好的:-
Assembly ambly = Assembly.LoadFile(pathToDll);
或者
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。通常,您只有一个,但使用这种方法,您还可以托管多组资源,并在同一个资源 dll 中实现多个 IThemeResourceProvider。例如,您可以使用名称标识每个 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);
}