Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何强制主机应用程序加载.Net加载项';s版本的可传递依赖项_C#_.net_Entity Framework Core_Revit_Ef Core 3.1 - Fatal编程技术网

C# 如何强制主机应用程序加载.Net加载项';s版本的可传递依赖项

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,我可以使

我正在开发一个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激发
下面是发生错误时VS的模块窗口的尾部(名称、路径和版本列)。您可以看到许多DLL正在从Revit文件夹中加载,它们的版本为1.01.2.30427。EF Core想要(并且已经在addin文件夹中)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
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仅支持一个