Как заставить хост-приложение загружать версию транзитивных зависимостей. Net addin - PullRequest
0 голосов
/ 17 июня 2020

Я разрабатываю надстройку C#. NET Framework (4.7.2) и не могу заставить хост-приложение загрузить мою версию транзитивных зависимостей. Надстройка предназначена для Revit 2020 (также. NET 4.7.2), хотя я думаю , проблема связана с общим c контекстом. Net addin-host.

В частности, я пытаюсь использовать Entity Framework Core 3, который зависит от Microsoft.Extensions.DependencyInjection.Abstractions (здесь DI.Abstractions). Сам Revit не зависит от EF Core, и если бы это было так, я мог бы использовать extern alias для загрузки желаемой версии. Однако один из компонентов Revit зависит от более старой версии DI.Abstractions (1.01 ...), чем EF Core (3.100 ...). При загрузке EF Core Revit использует собственную dll DI.Abstractions, что вызывает ошибку «Метод не найден». Есть пара других DLL, которые, похоже, имеют похожие проблемы, но если я найду способ принудительно загрузить нужную DLL, я почти уверен, что решу проблему для всех из них.

Наиболее примечательным из того, что я пробовал, является то, что эта же проблема возникла при работе в другом проекте, также использующем EF Core в Revit, с использованием ILMerge для объединения Microsoft.Extensions.DependencyInjection (здесь DI) и DI.Abstractions. Насколько я мог судить, поскольку на DI.Abstractions всегда ссылались только из DI, Revit не мог узнать о существовании DI.Abstractions. Однако в текущем проекте это не сработало. Единственное различие, которое я вижу, это то, что я использую Sqlite с EF Core вместо MySql. Предположительно срабатывает какая-то другая цепочка зависимостей, которая заставляет DI.Abstractions загружаться под другим углом?

Другие вещи, которые я пробовал:

  • ILMerge
    • I попытался объединить надстройку целиком, но EF Core использует некоторое отражение, которое прерывается, если оно было объединено с помощью ILMerge.
    • Три зависимости EF Core, в свою очередь, включают DI.Abstractions в их цепочку зависимостей. Я попытался объединить все зависимости каждой из этих трех библиотек в сами библиотеки, как я сделал выше для DI выше. DI.Abstractions по-прежнему загружается Revit.
  • AppDomain.AssemblyResolve: это событие позволяет обработчику находить библиотеки DLL, которые Revit не смог бы в противном случае. Я использую обработчик для загрузки некоторых dll из папки addin, но проблема в том, что Revit может найти dll, и он использует неправильную. Мой обработчик AssemblyResolve никогда не срабатывает для DI.Abstractions.

Вот конец окна модулей VS при возникновении ошибки (столбцы Имя, Путь и Версия). Вы можете видеть, что некоторые библиотеки DLL загружаются из папок Revit и имеют версию 1.01.2.30427. EF Core хочет (и имеет в папке надстройки) 3.100.520.27007.

Microsoft.Data.Sqlite.dll
    <Addin Path>\Microsoft.Data.Sqlite.dll
    3.100.520.27007
AddinName.Database.dll
    <Addin Path>\AddinName.Database.dll
    1.00.0.20284
Microsoft.EntityFrameworkCore.dll
    <Addin Path>\Microsoft.EntityFrameworkCore.dll
    3.100.520.27007
Microsoft.Bcl.AsyncInterfaces.dll
    <Addin Path>\Microsoft.Bcl.AsyncInterfaces.dll
    4.700.20.21406
System.Threading.Tasks.Extensions.dll
    <Addin Path>\System.Threading.Tasks.Extensions.dll
    4.06.28619.1
AddinName.RevitUtils.dll
    <Addin Path>\AddinName.RevitUtils.dll
    1.00.0.20286
Microsoft.Extensions.DependencyInjection.Abstractions.dll
    C:\Program Files\Autodesk\Revit 2020\Addins\FabricationPartBrowser\Microsoft.Extensions.DependencyInjection.Abstractions.dll
    2.02.0.18315
System.ValueTuple.dll
  C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.ValueTuple\v4.0_4.0.0.0__cc7b13ffcd2ddd51\System.ValueTuple.dll
    4.08.3752.0
Microsoft.Extensions.DependencyInjection.dll
    C:\Program Files\Autodesk\Revit 2020\Addins\FabricationPartBrowser\Microsoft.Extensions.DependencyInjection.dll
    2.02.0.18315
Microsoft.Extensions.Logging.Abstractions.dll
    C:\Program Files\Autodesk\Revit 2020\AddIns\PnIDModeler\Microsoft.Extensions.Logging.Abstractions.dll
    1.01.2.30427
System.Diagnostics.DiagnosticSource.dll
    <Addin Path>\System.Diagnostics.DiagnosticSource.dll
    4.700.20.21406
Microsoft.EntityFrameworkCore.Abstractions.dll
    <Addin Path>\Microsoft.EntityFrameworkCore.Abstractions.dll
    3.100.520.27007
Microsoft.Extensions.Caching.Abstractions.dll
    C:\Program Files\Autodesk\Revit 2020\AddIns\PnIDModeler\Microsoft.Extensions.Caching.Abstractions.dll
    1.01.2.30427
AddinName.Styles.dll
    <Addin Path>\AddinName.Styles.dll
    1.00.0.20284
NetTopologySuite.dll
    <Addin Path>\NetTopologySuite.dll
    2.00.0.0
Microsoft.EntityFrameworkCore.Sqlite.dll
    <Addin Path>\Microsoft.EntityFrameworkCore.Sqlite.dll
    3.100.520.27007
Microsoft.EntityFrameworkCore.Relational.dll
    <Addin Path>\Microsoft.EntityFrameworkCore.Relational.dll
    3.100.520.27007
System.Transactions.dll
    C:\WINDOWS\Microsoft.Net\assembly\GAC_64\System.Transactions\v4.0_4.0.0.0__b77a5c561934e089\System.Transactions.dll
    4.8.3752.0 built by: NET48REL1
Microsoft.Extensions.Logging.dll
    C:\Program Files\Autodesk\Revit 2020\AddIns\PnIDModeler\Microsoft.Extensions.Logging.dll
    1.01.2.30427
System.Threading.Tasks.dll
    C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Threading.Tasks\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Threading.Tasks.dll
    4.08.3752.0
Microsoft.Extensions.Caching.Memory.dll
    C:\Program Files\Autodesk\Revit 2020\AddIns\PnIDModeler\Microsoft.Extensions.Caching.Memory.dll
    1.01.2.30427
Microsoft.Extensions.Options.dll
    C:\Program Files\Autodesk\Revit 2020\AddIns\PnIDModeler\Microsoft.Extensions.Options.dll
    1.01.2.30427

EDIT Еще одна вещь, которую я пробовал. Когда команда надстройки запускается (то есть до того, как загружаются вредоносные библиотеки DLL), я l oop просматривает все файлы dll в папке надстройки и загружает их с Assembly.LoadFrom. Revit по-прежнему загружает и использует старые DI.Abstractions, среди прочего, из собственных файлов. У меня загружаются обе версии dll, но вместо новой используется старая.

1 Ответ

1 голос
/ 20 июня 2020

Это впечатляющий список различных подходов, которые вы уже пробовали. Afaik, Revit поддерживает только один AppDomain, в который можно загрузить библиотеки. NET, поэтому я удивлен некоторыми частичными успехами, которые вы описываете. Одна окончательная и гарантированно успешная возможность - это использовать IP C для распутывания , т. Е. Полностью отделить проблемную c часть функциональности надстройки от основной надстройки, работающей внутри Revit exe, и просто обменивайтесь данными между внешней автономной частью и основной надстройкой, используя IP C для достижения необходимой функциональности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...