C# 如何强制主机应用程序加载.Net加载项';s版本的可传递依赖项
我正在开发一个C#.NET Framework(4.7.2)插件,在让宿主应用程序加载我的可传递依赖项版本时遇到了问题。该加载项适用于Revit 2020(也是.NET 4.7.2),但我认为该问题对于.NET加载项主机上下文来说是通用的 我特别尝试使用实体框架核心3,它依赖于Microsoft.Extensions.DependencyInjection.Abstractions(这里是DI.Abstractions)。Revit本身不依赖于EF Core,如果它依赖于EF Core,我可以使用C# 如何强制主机应用程序加载.Net加载项';s版本的可传递依赖项,c#,.net,entity-framework-core,revit,ef-core-3.1,C#,.net,Entity Framework Core,Revit,Ef Core 3.1,我正在开发一个C#.NET Framework(4.7.2)插件,在让宿主应用程序加载我的可传递依赖项版本时遇到了问题。该加载项适用于Revit 2020(也是.NET 4.7.2),但我认为该问题对于.NET加载项主机上下文来说是通用的 我特别尝试使用实体框架核心3,它依赖于Microsoft.Extensions.DependencyInjection.Abstractions(这里是DI.Abstractions)。Revit本身不依赖于EF Core,如果它依赖于EF Core,我可以使
extern alias
加载所需的版本。但是,Revit的一个组件依赖于较旧版本的DI.Abstractions(1.01…),而不是EF Core(3.100…)。加载EF Core时,Revit使用自己的DI.Abstractations dll,这会导致“找不到方法”错误。还有一些其他dll似乎也有类似的问题,但如果我能找到一种方法来强制加载正确的dll,我很确定我会解决所有这些dll的问题
我尝试过的最值得注意的事情是,我在另一个项目中也使用了EF Core,通过使用ILMerge将Microsoft.Extensions.DependencyInjection(此处为DI)和DI.Abstracts结合起来,解决了同样的问题。据我所知,由于DI.Abstracts仅从DI中引用,这使Revit无法了解DI.Abstracts的存在。然而,在当前的项目中,这并没有起作用。我能看到的唯一区别是,我使用的是带有EF核心的Sqlite,而不是MySql。可能是触发了其他一些依赖链,导致DI.抽象从另一个角度加载
我尝试过的其他事情:
- 伊尔梅
- 我尝试合并整个加载项,但如果使用ILMerge合并,EF Core会使用一些反射中断
- EF Core的三个依赖项依次包括依赖链中的DI.抽象。我尝试将这三个库中每个库的所有依赖项合并到库本身中,正如我在上面对DI所做的那样。DI.抽象仍由Revit加载
- AppDomain.AssemblyResolve:此事件允许处理程序查找Revit无法找到的DLL。我使用处理程序从addin文件夹加载一些dll,但这里的问题是Revit可以找到dll,但它使用了错误的dll。我的AssemblyResolve处理程序从不为DI.Abstracts激发
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
Microsoft.Data.Sqlite.dll
\Microsoft.Data.Sqlite.dll
3.100.520.27007
AddinName.Database.dll
\AddinName.Database.dll
1.00.0.20284
Microsoft.EntityFrameworkCore.dll
\Microsoft.EntityFrameworkCore.dll
3.100.520.27007
Microsoft.Bcl.AsyncInterfaces.dll
\Microsoft.Bcl.AsyncInterfaces.dll
4.700.20.21406
System.Threading.Tasks.Extensions.dll
\System.Threading.Tasks.Extensions.dll
4.06.28619.1
AddinName.RevitUtils.dll
\AddinName.RevitUtils.dll
1.00.0.20286
Microsoft.Extensions.DependencyInjection.Abstractions.dll
C:\Program Files\Autodesk\Revit 2020\Addins\FactoryPartBrowser\Microsoft.Extensions.DependencyInjection.Abstractions.dll
2.02.0.18315
System.ValueTuple.dll
C:\WINDOWS\Microsoft.Net\assembly\GAC\U MSIL\System.ValueTuple\v4.0\U 4.0.0.0\UU CC7B13FFCD2DD51\System.ValueTuple.dll
4.08.3752.0
Microsoft.Extensions.DependencyInjection.dll
C:\Program Files\Autodesk\Revit 2020\Addins\FactoryPartBrowser\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.DiagnosticsSource.dll
\System.Diagnostics.DiagnosticsSource.dll
4.700.20.21406
Microsoft.EntityFrameworkCore.Abstractions.dll
\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
\AddinName.Styles.dll
1.00.0.20284
NetTopologySuite.dll
\NetTopologySuite.dll
2.00.0.0
Microsoft.EntityFrameworkCore.Sqlite.dll
\Microsoft.EntityFrameworkCore.Sqlite.dll
3.100.520.27007
Microsoft.EntityFrameworkCore.Relational.dll
\Microsoft.EntityFrameworkCore.Relational.dll
3.100.520.27007
System.Transactions.dll
C:\WINDOWS\Microsoft.Net\assembly\GAC_64\System.Transactions\v4.0.0.0_uuB77A5C561934E089\System.Transactions.dll
4.8.3752.0建造人: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.0.0_uuuB03F5F7F11D50A3A\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
编辑
我试过的另一件事。当addin命令运行时(在加载有问题的dll之前),我循环加载addin文件夹中的所有dll文件,并使用
Assembly.LoadFrom
加载它们。Revit仍然从自己的文件中加载和使用旧的DI.abstraction。我最终加载了两个版本的DLL,但使用的是旧版本而不是新版本。这是一个令人印象深刻的列表,列出了您已经尝试过的各种方法。另外,Revit仅支持一个