Загрузка встроенных ресурсов из динамически загружаемых сборок - PullRequest
0 голосов
/ 04 мая 2018

У меня есть проект библиотеки классов, который создает dll, который я динамически загружаю в основное приложение. Основное приложение содержит вызовы API, которые я использую, и один из вызовов заключается в загрузке изображения значка в кнопку WPF. Я предоставляю "pack://application:,,,/NamespaceOfMyDll;Component/Resources/embeddedresource.ico" как мой источник URI и следующий код, который пытается загрузить это изображение

var logo = new BitmapImage();
 logo.BeginInit();
 logo.UriSource = new Uri(source);
 logo.EndInit();

Изображение является встроенным ресурсом библиотеки DLL, которую я загружаю на стороне. При этом возникает исключение, говорящее, что источник не найден. Проект, который пытается загрузить изображение, не имеет ссылки на dll, которую я загружаю. Есть ли способ загрузить изображение, не помещая его в основной проект приложения?

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Решение проблемы решено с помощью действия «Ресурс» вместо «Встроенный ресурс».

«Ресурс предназначен для приложений WPF, когда вы хотите использовать URI для связи с ресурсами. Встроенный ресурс - это встроенный ресурс для приложений WinForms, доступ к которому должен осуществляться через ResourceManager». https://social.msdn.microsoft.com/Forums/vstudio/en-US/29b6d203-18fb-40b0-a01f-d5b787ccf3be/build-action-resource-vs-embedded-resource?forum=netfxbcl

0 голосов
/ 04 мая 2018

Вот обходной путь, с которым вы можете пойти:

Когда вы добавляете изображения в ресурс класса (я имею в виду в файле Resources.resx этого класса), создайте открытые переменные для каждого ресурса, который вы добавляете / хотите получить к нему доступ. Образец:

 public static class TestClass
{
public static Bitmap Image1 { get { return Resource1.Image1; } }
public static Bitmap Image2 { get { return Resource1.Image2; } }
}

Теперь перейдем к загрузке .dll в основной проект:

Assembly Mydll = Assembly.Load("dll path here");
Type MyLoadClass = MyDALL.GetType("dllAssemblyName.ClassName"); 
object obj = Activator.CreateInstance(MyLoadClass);

Теперь попробуйте получить доступ к Bitmap переменным:

Bitmap img1 = (Bitmap)obj.GetType().GetField("Image1").GetValue(obj);

///use the bitmap the way you want :)

Надеюсь, это поможет

...