これが最高かどうかはわかりませんが、このようなことを試すことができます:-
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ができました。通常は1つしかありませんが、このアプローチを使用すると、複数のリソースセットをホストし、同じリソースdllに複数のIThemeResourceProviderを実装することもできます。たとえば、各IThemeResourceProviderを、プロパティとして、またはさまざまな実装でカスタム[属性]装飾を使用して、名前で識別することができます。残りはあなたに任せます。
ただし、リスト内のIThemeResourceProvidersをインスタンス化する方法は次のとおりです。
foreach (var providerType in results)
{
var constructorInfo = providerType.GetConstructor(Type.EmptyTypes);
IThemeResourceProvider provider = constructorInfo.Invoke(null);
}
そして最後に、これらのプロバイダーの1つを使用してビットマップを取得します。
BitMap bitMap;
using (Stream resourceStream = provider.LoadBigLogo())
{
bitMap = BitMap.FromStream(resourceStream);
}