你可以尝试这样的事情,虽然我不知道这是最好的一个或不会: -
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中实现多个IThemeResourceProviders。你可以例如用名称标识每个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);
}