У меня есть приложение .NET 8.0, использующее MEF (System.Composition) в качестве подключаемой архитектуры. Большинство плагинов работают правильно, однако есть пара, которая генерирует исключения во время выполнения. У обоих этих плагинов есть одна общая черта: они полагаются на библиотеки, которые используют собственные библиотеки DLL из папки «время выполнения». У одного есть Microsoft.Web.WebView2, а у другого — LiveCharts2, который использует Skia. У них есть деревья времени выполнения, которые выглядят следующим образом (например, для плагина живых диаграмм):
runtimes
|-- osx
| `-- native
| |-- libHarfBuzzSharp.dylib
| `-- libSkiaSharp.dylib
|-- win-arm64
| `-- native
| |-- libHarfBuzzSharp.dll
| `-- libSkiaSharp.dll
|-- win-x64
| `-- native
| |-- libHarfBuzzSharp.dll
| `-- libSkiaSharp.dll
`-- win-x86
`-- native
|-- libHarfBuzzSharp.dll
`-- libSkiaSharp.dll
Плагин веб-просмотра имеет то же дерево, только с разными DLL. Папка времени выполнения — это каталог сборки проекта рядом с его dll.
Я могу заставить эту систему работать, переместив зависимости в хост-приложение (т. е. webview2 и Skia), но это, очевидно, не идеально, поскольку любой будущий плагин, который хочет использовать собственную библиотеку, должен будет добавить свои зависимости к хосту.
Если у меня нет Skia в хост-приложении, плагин livecharts выдаст ошибку :
DllNotFoundException: Unable to load DLL 'libSkiaSharp' or one of its dependencies: The specified module could not be found. (0x8007007E)
Вот код загрузки моего плагина:
private void Init(IEnumerable assemblies)
{
_pluginManager.ImportsSatisfied += OnImportsSatisfied;
var configuration = new ContainerConfiguration()
.WithAssemblies(assemblies);
try
{
using (CompositionHost host = configuration.CreateContainer())
{
host.SatisfyImports(_pluginManager);
}
}
catch (ReflectionTypeLoadException ex)
{
Log.Error("Could not load extension pluginNames: {0}\nLoader exceptions:{1} ", ex, ex.LoaderExceptions);
}
catch (Exception ex)
{
Log.Error("Could not load extension pluginNames: {0}", ex);
}
}
Где сборки — это список сборок, загруженных с помощью:
private static IEnumerable GetAssembliesFromNames(IEnumerable pluginNames, string pluginDirectory)
{
List assemblies = new();
foreach (string pluginName in pluginNames)
{
try
{
assemblies.Add(GetAssemblyForPluginByName(pluginName, pluginDirectory));
}
catch (Exception ex)
{
Log.Error("Could not load plugin assembly {0}: {1}", pluginName, ex);
}
}
return assemblies;
}
public static Assembly GetAssemblyForPluginByName(string name, string workingDirectory)
{
string pluginName = Path.GetFileName(name);
string pluginFolderFilePath = Path.Combine(workingDirectory, pluginName);
string pluginDllPath = Path.Combine(pluginFolderFilePath, pluginName + ".dll");
if (Directory.Exists(pluginFolderFilePath) && File.Exists(pluginDllPath))
{
return Assembly.LoadFrom(pluginDllPath);
}
throw new FileNotFoundException(name);
}
Подробнее здесь: https://stackoverflow.com/questions/786 ... mef-plugin
Загрузка собственных зависимостей для плагина MEF ⇐ C#
Место общения программистов C#
-
Anonymous
1719593285
Anonymous
У меня есть приложение .NET 8.0, использующее MEF (System.Composition) в качестве подключаемой архитектуры. Большинство плагинов работают правильно, однако есть пара, которая генерирует исключения во время выполнения. У обоих этих плагинов есть одна общая черта: они полагаются на библиотеки, которые используют собственные библиотеки DLL из папки «время выполнения». У одного есть Microsoft.Web.WebView2, а у другого — LiveCharts2, который использует Skia. У них есть деревья времени выполнения, которые выглядят следующим образом (например, для плагина живых диаграмм):
runtimes
|-- osx
| `-- native
| |-- libHarfBuzzSharp.dylib
| `-- libSkiaSharp.dylib
|-- win-arm64
| `-- native
| |-- libHarfBuzzSharp.dll
| `-- libSkiaSharp.dll
|-- win-x64
| `-- native
| |-- libHarfBuzzSharp.dll
| `-- libSkiaSharp.dll
`-- win-x86
`-- native
|-- libHarfBuzzSharp.dll
`-- libSkiaSharp.dll
Плагин веб-просмотра имеет то же дерево, только с разными DLL. Папка времени выполнения — это каталог сборки проекта рядом с его dll.
Я могу заставить эту систему работать, переместив зависимости в хост-приложение (т. е. webview2 и Skia), но это, очевидно, не идеально, поскольку любой будущий плагин, который хочет использовать собственную библиотеку, должен будет добавить свои зависимости к хосту.
Если у меня нет Skia в хост-приложении, плагин livecharts выдаст ошибку :
DllNotFoundException: Unable to load DLL 'libSkiaSharp' or one of its dependencies: The specified module could not be found. (0x8007007E)
Вот код загрузки моего плагина:
private void Init(IEnumerable assemblies)
{
_pluginManager.ImportsSatisfied += OnImportsSatisfied;
var configuration = new ContainerConfiguration()
.WithAssemblies(assemblies);
try
{
using (CompositionHost host = configuration.CreateContainer())
{
host.SatisfyImports(_pluginManager);
}
}
catch (ReflectionTypeLoadException ex)
{
Log.Error("Could not load extension pluginNames: {0}\nLoader exceptions:{1} ", ex, ex.LoaderExceptions);
}
catch (Exception ex)
{
Log.Error("Could not load extension pluginNames: {0}", ex);
}
}
Где сборки — это список сборок, загруженных с помощью:
private static IEnumerable GetAssembliesFromNames(IEnumerable pluginNames, string pluginDirectory)
{
List assemblies = new();
foreach (string pluginName in pluginNames)
{
try
{
assemblies.Add(GetAssemblyForPluginByName(pluginName, pluginDirectory));
}
catch (Exception ex)
{
Log.Error("Could not load plugin assembly {0}: {1}", pluginName, ex);
}
}
return assemblies;
}
public static Assembly GetAssemblyForPluginByName(string name, string workingDirectory)
{
string pluginName = Path.GetFileName(name);
string pluginFolderFilePath = Path.Combine(workingDirectory, pluginName);
string pluginDllPath = Path.Combine(pluginFolderFilePath, pluginName + ".dll");
if (Directory.Exists(pluginFolderFilePath) && File.Exists(pluginDllPath))
{
return Assembly.LoadFrom(pluginDllPath);
}
throw new FileNotFoundException(name);
}
Подробнее здесь: [url]https://stackoverflow.com/questions/78683613/loading-native-dependencies-for-an-mef-plugin[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия