无法使用 COM 加载文件或程序集“Microsoft.Extensions.DependencyInjection.Abstractions" [英] Could not load file or assembly 'Microsoft.Extensions.DependencyInjection.Abstractions using COM

查看:22
本文介绍了无法使用 COM 加载文件或程序集“Microsoft.Extensions.DependencyInjection.Abstractions"的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

[最近的笔记]

如果不是 com-visible 方面,这个问题将与

我还尝试从调试"菜单中找到模块"窗口,但没有看到.

检查

但是当我查看 RegEdit 时,它已经是 1

[更新]

阅读汉斯·帕桑特的评论后在 com 可见库中,我添加了

其中引用了问题库的 2 个版本.

我还注意到我的标准库有一个分析器抱怨

0} 是一个内部 API,它支持 Entity Framework Core 基础设施,不受与公共 API 相同的兼容性标准的约束.它可能会在任何版本中更改或删除,恕不另行通知.

[更新]

如果我在我的 com 可见框架项目中创建一个 .exe 并运行它,没有问题.如果我尝试单元测试,就会出现问题.

Fusion 日志显示以下内容

 *** 组装活页夹日志条目 (02-Mar-20 @ 7:54:23 AM) ***操作失败.绑定结果:hr = 0x80131040.没有可用的描述.从以下位置加载的程序集管理器:C:WindowsMicrosoft.NETFrameworkv4.0.30319clr.dll在可执行文件 C:Program Files (x86)Microsoft Visual Studio2019PreviewCommon7IDEExtensionsTestPlatform	esthost.x86.exe 下运行--- 详细的错误日志如下.=== 预绑定状态信息 ===日志:DisplayName = Microsoft.Extensions.DependencyInjection.Abstractions,版本=3.1.0.0,Culture=neutral,PublicKeyToken=adb9793829ddae60(完全指定)日志:Appbase = file:///C:/Dev2/Combridge/SBD.ComBridge/UnitTestProject1/bin/Debug日志:初始 PrivatePath = NULL日志:动态基数 = NULL日志:缓存基数 = NULL日志:AppName = NULL调用程序集:Microsoft.Extensions.DependencyInjection,Version=3.1.2.0,Culture=neutral,PublicKeyToken=adb9793829ddae60.===LOG:此绑定在默认加载上下文中启动.LOG:使用应用程序配置文件:C:Program Files (x86)Microsoft Visual Studio2019PreviewCommon7IDEExtensionsTestPlatform	esthost.x86.exe.ConfigLOG:使用主机配置文件:日志:使用来自 C:WindowsMicrosoft.NETFrameworkv4.0.30319configmachine.config 的机器配置文件.日志:政策后参考:Microsoft.Extensions.DependencyInjection.Abstractions,版本=3.1.0.0,文化=中性,PublicKeyToken=adb9793829ddae60日志:GAC 查找失败.日志:正在尝试下载新的 URL 文件:///C:/Dev2/Combridge/SBD.ComBridge/UnitTestProject1/bin/Debug/Microsoft.Extensions.DependencyInjection.Abstractions.DLL.LOG:程序集下载成功.正在尝试设置文件:C:Dev2CombridgeSBD.ComBridgeUnitTestProject1inDebugMicrosoft.Extensions.DependencyInjection.Abstractions.dll日志:进入从源运行设置阶段.日志:程序集名称为:Microsoft.Extensions.DependencyInjection.Abstractions,版本=3.1.2.0,文化=中性,PublicKeyToken=adb9793829ddae60警告:比较程序集名称导致不匹配:内部版本号ERR: 程序集引用与找到的程序集定义不匹配.ERR:从源运行设置阶段失败,hr = 0x80131040.ERR: 未能完成程序集的设置 (hr = 0x80131040).探测终止.*** 组装活页夹日志条目 (02-Mar-20 @ 7:54:23 AM) ***操作失败.绑定结果:hr = 0x80131040.没有可用的描述.从以下位置加载的程序集管理器:C:WindowsMicrosoft.NETFrameworkv4.0.30319clr.dll在可执行文件 C:Program Files (x86)Microsoft Visual Studio2019PreviewCommon7IDEExtensionsTestPlatform	esthost.x86.exe 下运行--- 详细的错误日志如下.=== 预绑定状态信息 ===日志:DisplayName = Microsoft.Extensions.DependencyInjection.Abstractions,版本=3.1.0.0,Culture=neutral,PublicKeyToken=adb9793829ddae60(完全指定)日志:Appbase = file:///C:/Dev2/Combridge/SBD.ComBridge/UnitTestProject1/bin/Debug日志:初始 PrivatePath = NULL日志:动态基数 = NULL日志:缓存基数 = NULL日志:AppName = NULL调用程序集:Microsoft.Extensions.DependencyInjection,Version=3.1.2.0,Culture=neutral,PublicKeyToken=adb9793829ddae60.===LOG:此绑定在默认加载上下文中启动.LOG:使用应用程序配置文件:C:Program Files (x86)Microsoft Visual Studio2019PreviewCommon7IDEExtensionsTestPlatform	esthost.x86.exe.ConfigLOG:使用主机配置文件:日志:使用来自 C:WindowsMicrosoft.NETFrameworkv4.0.30319configmachine.config 的机器配置文件.日志:政策后参考:Microsoft.Extensions.DependencyInjection.Abstractions,版本=3.1.0.0,文化=中性,PublicKeyToken=adb9793829ddae60日志:GAC 查找失败.日志:正在尝试下载新的 URL 文件:///C:/Dev2/Combridge/SBD.ComBridge/UnitTestProject1/bin/Debug/Microsoft.Extensions.DependencyInjection.Abstractions.DLL.LOG:程序集下载成功.正在尝试设置文件:C:Dev2CombridgeSBD.ComBridgeUnitTestProject1inDebugMicrosoft.Extensions.DependencyInjection.Abstractions.dll日志:进入从源运行设置阶段.日志:程序集名称为:Microsoft.Extensions.DependencyInjection.Abstractions,版本=3.1.2.0,文化=中性,PublicKeyToken=adb9793829ddae60警告:比较程序集名称导致不匹配:内部版本号ERR: 程序集引用与找到的程序集定义不匹配.ERR:从源运行设置阶段失败,hr = 0x80131040.ERR: 未能完成程序集的设置 (hr = 0x80131040).探测终止.

我注意到一些版本差异!

我尝试在另一台装有 VS 16.4.4 的机器上运行测试,以防它是 Visual Studio 预览版的问题,但问题又出现了.

在我的框架测试项目中,我尝试

但还是报错

无法加载文件或程序集Microsoft.Extensions.DependencyInjection.Abstractions,版本=3.1.0.0

我也试过下载 1.1.1 版本的 microsoft.data.sqlclient.sni

[更新]我决定尝试回滚.netstandard2.0项目中的实体框架来使用

 <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.0"/>

现在,当我使用 com 可见框架项目进行单元测试时,我得到

 System.Exception: vivadbridgestd:GetValidCarriers line: 20 error:System.Exception: kg1System.IO.FileLoadException: 无法加载文件或程序集 'System.ComponentModel.Annotations, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 或其依赖项之一.定位的程序集的清单定义与程序集引用不匹配.(来自 HRESULT 的异常:0x80131040)文件名:'System.ComponentModel.Annotations,版本=4.2.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a'在 Microsoft.EntityFrameworkCore.Metadata.Conventions.Infrastructure.RelationalConventionSetBuilder.CreateConventionSet()在 Microsoft.EntityFrameworkCore.Metadata.Conventions.SqlServerConventionSetBuilder.CreateConventionSet()在 Microsoft.EntityFrameworkCore.Metadata.Conventions.Internal.RuntimeConventionSetBuilder.CreateConventionSet()在 Microsoft.EntityFrameworkCore.Infrastructure.ModelSource.CreateModel(DbContext 上下文,IConventionSetBuilder 约定SetBuilder)在 Microsoft.EntityFrameworkCore.Infrastructure.ModelSource.GetModel(DbContext 上下文,IConventionSetBuilder 约定SetBuilder)在 Microsoft.EntityFrameworkCore.Internal.DbContextServices.CreateModel()在 Microsoft.EntityFrameworkCore.Internal.DbContextServices.get_Model()在 Microsoft.EntityFrameworkCore.Infrastructure.EntityFrameworkServicesBuilder.<>c.<TryAddCoreServices>b__7_3(IServiceProvider p)在 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitFactory(FactoryCallSite factoryCallSite, RuntimeResolverContext context)在 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument 参数)在 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitCache(ServiceCallSite callSite, RuntimeResolverContext context, ServiceProviderEngineScope serviceProviderEngine, RuntimeResolverLock lockType)在 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScopeCache(ServiceCallSite singletonCallSite, RuntimeResolverContext context)在 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument 参数)在 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, RuntimeResolverContext context)在 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument 参数)在 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitCache(ServiceCallSite callSite, RuntimeResolverContext context, ServiceProviderEngineScope serviceProviderEngine, RuntimeResolverLock lockType)在 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScopeCache(ServiceCallSite singletonCallSite, RuntimeResolverContext context)在 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument 参数)在 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.Resolve(ServiceCallSite callSite, ServiceProviderEngineScope scope)在 Microsoft.Extensions.DependencyInjection.ServiceLookup.DynamicServiceProviderEngine.<>c__DisplayClass1_0.<RealizeService>b__0(ServiceProviderEngineScope 范围)在 Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(Type serviceType, ServiceProviderEngineScope serviceProviderEngineScope)在 Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type serviceType)在 Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)在 Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider)在 Microsoft.EntityFrameworkCore.DbContext.get_DbContextDependencies()在 Microsoft.EntityFrameworkCore.DbContext.get_InternalServiceProvider()在 Microsoft.EntityFrameworkCore.DbContext.get_DbContextDependencies()在 Microsoft.EntityFrameworkCore.DbContext.get_Model()在 Microsoft.EntityFrameworkCore.Internal.InternalDbSet`1.get_EntityType()在 Microsoft.EntityFrameworkCore.Internal.InternalDbSet`1.get_EntityQueryable()在 Microsoft.EntityFrameworkCore.Internal.InternalDbSet`1.System.Linq.IQueryable.get_Provider()在 System.Linq.Queryable.SingleOrDefault[TSource](IQueryable`1 源,Expression`1 谓词)在 SBDSTD.Standard.Helpers.LogHelper.InnerLogMessage(String message, JobHeaderLogInfo logInfo, Boolean sendEmail, ApiDbContext connect)

这也会导致我的 exe 失败.

然后我尝试了3.1.0版本的EFCore我现在在框架测试项目中得到以下内容

测试方法 UnitTestProject1.UnitTest1.T225_ValidCarriers 抛出异常:System.Exception: vivadbridgestd:GetValidCarriers line: 20 error:System.Exception: kg1System.Exception: Line 53 System.IO.FileLoadException: 无法加载文件或程序集 'Microsoft.Extensions.DependencyInjection.Abstractions, Version=3.1.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60' 或其依赖项之一.定位的程序集的清单定义与程序集引用不匹配.(来自 HRESULT 的异常:0x80131040)文件名:'Microsoft.Extensions.DependencyInjection.Abstractions,版本=3.1.0.0,文化=中性,PublicKeyToken=adb9793829ddae60'在 Microsoft.EntityFrameworkCore.Internal.ServiceProviderCache.<>c__DisplayClass4_0.<GetOrAdd>g__BuildServiceProvider|3()在 Microsoft.EntityFrameworkCore.Internal.ServiceProviderCache.<>c__DisplayClass4_0.<GetOrAdd>b__2(Int64 k)在 System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)在 Microsoft.EntityFrameworkCore.Internal.ServiceProviderCache.GetOrAdd(IDbContextOptions options, Boolean providerRequired)在 Microsoft.EntityFrameworkCore.DbContext..ctor(DbContextOptions 选项)在 SBDSTD.Standard.Entities.ApiDbContext..ctor(DbContextOptions`1 选项)在 SBDSTD.Standard.Services.Helper.MakeContext(String connectionString)从以下位置加载的程序集管理器:C:WindowsMicrosoft.NETFrameworkv4.0.30319clr.dll在可执行文件 C:Program Files (x86)Microsoft Visual Studio2019PreviewCommon7IDEExtensionsTestPlatform	esthost.x86.exe 下运行--- 详细的错误日志如下.=== 预绑定状态信息 ===日志:DisplayName = Microsoft.Extensions.DependencyInjection.Abstractions,版本=3.1.0.0,Culture=neutral,PublicKeyToken=adb9793829ddae60(完全指定)日志:Appbase = file:///C:/Dev2/Combridge/SBD.ComBridge/UnitTestProject1/bin/Debug日志:初始 PrivatePath = NULL调用程序集:Microsoft.Extensions.DependencyInjection,Version=3.1.1.0,Culture=neutral,PublicKeyToken=adb9793829ddae60.===LOG:此绑定在默认加载上下文中启动.LOG:使用应用程序配置文件:C:Program Files (x86)Microsoft Visual Studio2019PreviewCommon7IDEExtensionsTestPlatform	esthost.x86.exe.ConfigLOG:使用主机配置文件:日志:使用来自 C:WindowsMicrosoft.NETFrameworkv4.0.30319configmachine.config 的机器配置文件.日志:政策后参考:Microsoft.Extensions.DependencyInjection.Abstractions,版本=3.1.0.0,文化=中性,PublicKeyToken=adb9793829ddae60日志:正在尝试下载新的 URL 文件:///C:/Dev2/Combridge/SBD.ComBridge/UnitTestProject1/bin/Debug/Microsoft.Extensions.DependencyInjection.Abstractions.DLL.警告:比较程序集名称导致不匹配:内部版本号ERR: 未能完成程序集的设置 (hr = 0x80131040).探测终止.在 SBDSTD.Standard.Services.Helper.MakeContext(String connectionString)

也在 .exe 中发生

我想知道 这个关于 entityframework.core 的问题 是相关的,但我只能在 Nuget 上找到 Microsoft.EntityFrameworkCore.

[更新单元测试现在有效]

我现在可以进行单元测试了.我需要在单元测试项目

的顶部附近包含以下内容

 <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects><GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType></PropertyGroup>

正如在这个问题中所讨论的那样关于程序集绑定

但是我仍然需要解决在 VB6 中使用我的 com 可见库

解决方案

我一直在为完全相同的问题而苦苦挣扎并且能够解决它.

就我而言,问题 DLL 是 Microsoft.Extensions.Logging.这是我的例外:

无法加载文件或程序集System.IO.FileNotFoundException:无法加载文件或程序集"Microsoft.Extensions.Logging,版本=2.2.0.0,文化=中性,PublicKeyToken=adb9793829ddae60' 或其依赖项之一.该系统找不到指定的文件.

解决方案非常简单,基本上 app.config 适用于使用 COM 公开的 .NET 类的 VB6 EXE.您只需要使用 <assemblyBinding> 标签创建一个常规的 app.config,它就会起作用.棘手的部分是该配置的放置位置以及如何命名.

  1. 当您从 IDE (VB6) 运行 EXE 时,在 C:Program Files (x86)Microsoft Visual StudioVB98 中创建 VB6.exe.config.创建配置后,不要忘记重新启动 IDE.
  2. 当您从 EXE 直接运行时,在与您的 ExeName.exe 相同的文件夹中创建 ExeName.exe.config

这里是关于它如何在更改后解决重定向的 Fusion 日志(从 IDE 案例运行):

调用程序集:Unity.Microsoft.Logging,版本=5.11.1.0,Culture=neutral,PublicKeyToken=489b6accfaf20ef0.===LOG:此绑定在 LoadFrom 加载上下文中开始.警告:不会在 LoadFrom 上下文中探测本机图像.本机图像只会在默认加载上下文中被探测,就像 Assembly.Load().LOG:使用应用程序配置文件:C:Program Files (x86)Microsoft Visual StudioVB98VB6.EXE.configLOG:使用主机配置文件:日志:使用来自 C:WindowsMicrosoft.NETFrameworkv4.0.30319configmachine.config 的机器配置文件.日志:在应用程序配置文件中发现重定向:2.2.0.0 重定向到 5.0.0.0.日志:政策后参考:Microsoft.Extensions.Logging,版本=5.0.0.0,文化=中性,PublicKeyToken=adb9793829ddae60LOG:绑定成功.从 C:Program Files (x86)RetailCommonMicrosoft.Extensions.Logging.dll 返回程序集.日志:程序集在 LoadFrom 加载上下文中加载.

[Recent Note]

If it were not for the com-visible aspect, this question would be a duplicate of this question on assembly binding. I had struggled for days because I did not realize that I needed to alter my unit test project as well as the com visible project. If you don't want to read through my struggles realizing this, skip to the last update.

[Pre-amble]

I feared it may be a bridge to far trying to access a dotnet standard 2.0 library from VB6 via a COM Visible Framework 4.7.2 library, but wanted to try.

Hello World does work. ( i.e calling a simple function that returns a string )

However I get this error when I try and run the VB6 program via the IDE or as a .EXE.

The error message indicates the problem is occuring in the code of the c# dotnet standard2.0 library.

System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.Extensions.DependencyInjection.Abstractions, 
Version=3.1.0.0, Culture=neutral, 
PublicKeyToken=adb9793829ddae60' or one of its dependencies. 
The system cannot find the file specified.
File name: 'Microsoft.Extensions.DependencyInjection.Abstractions, Version=3.1.0.0,
Culture=neutral, PublicKeyToken=adb9793829ddae60'
at Microsoft.EntityFrameworkCore.Internal.ServiceProviderCache.<>c__DisplayClass4_0.<GetOrAdd>g__BuildServiceProvider|3()
at Microsoft.EntityFrameworkCore.Internal.ServiceProviderCache.<>c__DisplayClass4_0.<GetOrAdd>b__2(Int64 k)
at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
at Microsoft.EntityFrameworkCore.Internal.ServiceProviderCache.GetOrAdd(IDbContextOptions options, Boolean providerRequired)
at Microsoft.EntityFrameworkCore.DbContext..ctor(DbContextOptions options)
at SBDSTD.Standard.Entities.ApiDbContext..ctor(DbContextOptions options)
at SBDSTD.Standard.Services.Helper.MakeContext(String connectionString)

The library code where the error is occurs is

public static ApiDbContext MakeContext(string connectionString)
{
       var optionsBuilder = new DbContextOptionsBuilder<ApiDbContext>();
       optionsBuilder.UseSqlServer(connectionString );
       var options = optionsBuilder.Options;
       return new ApiDbContext(options); // Error occurs here
}

The context class contains

public class ApiDbContext : DbContext
{
    public ApiDbContext(DbContextOptions<ApiDbContext> options)
        : base(options)
    {
    }
 // etc

I managed to work around the issue by creating a Framework console exe , then getting vb6 to shell out to it.

Dim num As Long
num = ShellSync(cmd, vbMinimizedNoFocus)

Where code for shellsync is in a module

Option Explicit
Private Const INFINITE = &HFFFFFFFF
Private Const SYNCHRONIZE = &H100000
Private Const PROCESS_QUERY_INFORMATION = &H400&

Private Declare Function CloseHandle Lib "kernel32" ( _
    ByVal hObject As Long) As Long

Private Declare Function GetExitCodeProcess Lib "kernel32" ( _
    ByVal hProcess As Long, _
    lpExitCode As Long) As Long

Private Declare Function OpenProcess Lib "kernel32" ( _
    ByVal dwDesiredAccess As Long, _
    ByVal bInheritHandle As Long, _
    ByVal dwProcessId As Long) As Long

Private Declare Function WaitForSingleObject Lib "kernel32" ( _
    ByVal hHandle As Long, _
    ByVal dwMilliseconds As Long) As Long

Public Function ShellSync( _
    ByVal PathName As String, _
    ByVal WindowStyle As VbAppWinStyle) As Long
    'Shell and wait.  Return exit code result, raise an
    'exception on any error.
    Dim lngPid As Long
    Dim lngHandle As Long
    Dim lngExitCode As Long

    lngPid = Shell(PathName, WindowStyle)
    If lngPid <> 0 Then
        lngHandle = OpenProcess(SYNCHRONIZE _
                             Or PROCESS_QUERY_INFORMATION, 0, lngPid)
        If lngHandle <> 0 Then
            WaitForSingleObject lngHandle, INFINITE
            If GetExitCodeProcess(lngHandle, lngExitCode) <> 0 Then
                ShellSync = lngExitCode
                CloseHandle lngHandle
            Else
                CloseHandle lngHandle
                Err.Raise &H8004AA00, "ShellSync", _
                          "Failed to retrieve exit code, error " _
                        & CStr(Err.LastDllError)
            End If
        Else
            Err.Raise &H8004AA01, "ShellSync", _
                      "Failed to open child process"
        End If
    Else
        Err.Raise &H8004AA02, "ShellSync", _
                  "Failed to Shell child process"
    End If
End Function

Interestingly if I call shell instead of shellsync I get the error

System.Exception: kg1System.IO.FileNotFoundException: Could not load file or assembly 'System.Threading.Tasks.Extensions, Version=4.2.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' or one of its dependencies. The system cannot find the file specified.
File name: 'System.Threading.Tasks.Extensions, Version=4.2.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'
   at SBDSTD.Standard.Helpers.LogHelper.LogMessage(String message, 

[Update]

I added the following to my code to the com visible library

    [DispId(2)]
    [ComVisible(true)]
    public string ReferenceCheck()
    {
        var factory = new Microsoft.Extensions.DependencyInjection.DefaultServiceProviderFactory();
        return "";
    }

but it did not help.

I tried to use Fuslogvw but the log viewer is empty, even after I change the settings to Log in exception text and attempt to troubleshoot

I tried using Procmon and can see the following sort of thing

I also tried to find the Modules window from the Debug menu but dont see it.

Checking This link

[Update]

I notice I have assembly binding logging turned off.

But when I look in RegEdit it is already 1

[Update]

After reading Hans Passant's comment In the com visible library I added some code to resolve assemblies

My test method in the com visible library shows the following error information.

System.TypeInitializationException: 
The type initializer for 'Microsoft.Data.SqlClient.TdsParser' 
threw an exception. ---> 
System.TypeInitializationException: 
The type initializer for 'Microsoft.Data.SqlClient.SNILoadHandle' threw an exception. 
---> System.TypeInitializationException: 
The type initializer for 'Microsoft.Data.SqlClient.SNINativeMethodWrapper' threw an exception. ---> 
System.ComponentModel.Win32Exception: Failed to load C:Dev2UnitTestProjectStandardinDebugx86SNI.dll ---> System.ComponentModel.Win32Exception: 
The specified module could not be found
  Stack Trace: 
    SNINativeMethodWrapper.cctor() line 64
    --- End of inner exception stack trace ---
    SNINativeMethodWrapper.SNIInitialize()
    SNILoadHandle.ctor() line 36
    SNILoadHandle.cctor() line 17
    --- End of inner exception stack trace ---
    TdsParser.cctor() line 166
    --- End of inner exception stack trace ---
    DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection) line 1411
    DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection) line 1310
    DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection) line 357
    DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions) line 773
    DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions) line 72
    SqlConnection.TryOpenInner(TaskCompletionSource`1 retry) line 1860
    SqlConnection.TryOpen(TaskCompletionSource`1 retry) line 1853
    SqlConnection.Open() line 1421
    RelationalConnection.OpenDbConnection(Boolean errorsExpected)
    RelationalConnection.Open(Boolean errorsExpected)
    RelationalCommand.ExecuteReader(RelationalCommandParameterObject parameterObject)
    Enumerator.InitializeReader(DbContext _, Boolean result)
    SqlServerExecutionStrategy.Execute[TState,TResult](TState state, Func`3 operation, Func`3 verifySucceeded)
    Enumerator.MoveNext()
    Enumerable.SingleOrDefault[TSource](IEnumerable`1 source)
    lambda_method(Closure , QueryContext )
    QueryCompiler.Execute[TResult](Expression query)
    EntityQueryProvider.Execute[TResult](Expression expression)
    Queryable.FirstOrDefault[TSource](IQueryable`1 source)

[Update]

This issue on GitHub seems related

I tried reinstalling the c** redistributable

[Update]

I finally got Fuslogvw to work with the help of this question

Which references 2 versions of the problem library.

I also noticed that my standard library has an analyzer complaining

0} is an internal API that supports the Entity Framework Core infrastructure and not subject to the same compatibility standards as public APIs. It may be changed or removed without notice in any release.

[Update]

If I make a .exe in my com visible framework project, and run it , there is no problem. The problem occurs if I try a unit test.

Fusion log shows the following

   *** Assembly Binder Log Entry  (02-Mar-20 @ 7:54:23 AM) ***

The operation failed.
Bind result: hr = 0x80131040. No description available.

Assembly manager loaded from:  C:WindowsMicrosoft.NETFrameworkv4.0.30319clr.dll
Running under executable  C:Program Files (x86)Microsoft Visual Studio2019PreviewCommon7IDEExtensionsTestPlatform	esthost.x86.exe
--- A detailed error log follows. 

=== Pre-bind state information ===
LOG: DisplayName = Microsoft.Extensions.DependencyInjection.Abstractions, Version=3.1.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
 (Fully-specified)
LOG: Appbase = file:///C:/Dev2/Combridge/SBD.ComBridge/UnitTestProject1/bin/Debug
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = NULL
LOG: AppName = NULL
Calling assembly : Microsoft.Extensions.DependencyInjection, Version=3.1.2.0, Culture=neutral, PublicKeyToken=adb9793829ddae60.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:Program Files (x86)Microsoft Visual Studio2019PreviewCommon7IDEExtensionsTestPlatform	esthost.x86.exe.Config
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:WindowsMicrosoft.NETFrameworkv4.0.30319configmachine.config.
LOG: Post-policy reference: Microsoft.Extensions.DependencyInjection.Abstractions, Version=3.1.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
LOG: GAC Lookup was unsuccessful.
LOG: Attempting download of new URL file:///C:/Dev2/Combridge/SBD.ComBridge/UnitTestProject1/bin/Debug/Microsoft.Extensions.DependencyInjection.Abstractions.DLL.
LOG: Assembly download was successful. Attempting setup of file: C:Dev2CombridgeSBD.ComBridgeUnitTestProject1inDebugMicrosoft.Extensions.DependencyInjection.Abstractions.dll
LOG: Entering run-from-source setup phase.
LOG: Assembly Name is: Microsoft.Extensions.DependencyInjection.Abstractions, Version=3.1.2.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
WRN: Comparing the assembly name resulted in the mismatch: Build Number
ERR: The assembly reference did not match the assembly definition found.
ERR: Run-from-source setup phase failed with hr = 0x80131040.
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.

*** Assembly Binder Log Entry  (02-Mar-20 @ 7:54:23 AM) ***

The operation failed.
Bind result: hr = 0x80131040. No description available.

Assembly manager loaded from:  C:WindowsMicrosoft.NETFrameworkv4.0.30319clr.dll
Running under executable  C:Program Files (x86)Microsoft Visual Studio2019PreviewCommon7IDEExtensionsTestPlatform	esthost.x86.exe
--- A detailed error log follows. 

=== Pre-bind state information ===
LOG: DisplayName = Microsoft.Extensions.DependencyInjection.Abstractions, Version=3.1.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
 (Fully-specified)
LOG: Appbase = file:///C:/Dev2/Combridge/SBD.ComBridge/UnitTestProject1/bin/Debug
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = NULL
LOG: AppName = NULL
Calling assembly : Microsoft.Extensions.DependencyInjection, Version=3.1.2.0, Culture=neutral, PublicKeyToken=adb9793829ddae60.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:Program Files (x86)Microsoft Visual Studio2019PreviewCommon7IDEExtensionsTestPlatform	esthost.x86.exe.Config
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:WindowsMicrosoft.NETFrameworkv4.0.30319configmachine.config.
LOG: Post-policy reference: Microsoft.Extensions.DependencyInjection.Abstractions, Version=3.1.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
LOG: GAC Lookup was unsuccessful.
LOG: Attempting download of new URL file:///C:/Dev2/Combridge/SBD.ComBridge/UnitTestProject1/bin/Debug/Microsoft.Extensions.DependencyInjection.Abstractions.DLL.
LOG: Assembly download was successful. Attempting setup of file: C:Dev2CombridgeSBD.ComBridgeUnitTestProject1inDebugMicrosoft.Extensions.DependencyInjection.Abstractions.dll
LOG: Entering run-from-source setup phase.
LOG: Assembly Name is: Microsoft.Extensions.DependencyInjection.Abstractions, Version=3.1.2.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
WRN: Comparing the assembly name resulted in the mismatch: Build Number
ERR: The assembly reference did not match the assembly definition found.
ERR: Run-from-source setup phase failed with hr = 0x80131040.
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.

I note some version differences!

I tried running the test on a different machine with VS 16.4.4 in case it was an issue with the Preview version of Visual Studio, however the problem was repeated.

In my framework test project I tried installing the 3.1.1 version of Microsoft.Extensions.DependencyInjectionAbstractions and noticed a warning

Severity    Code    Description Project File    Line    Suppression State
Warning NU1605  Detected package downgrade: Microsoft.Extensions.DependencyInjection.Abstractions from 3.1.2 to 3.1.1. Reference the package directly from the project to select a different version. 
 UnitTestProject1 -> SBD.CombridgeVivadStd -> SBDSTD.Standard 1.0.0-CI-20200301-211054 -> Microsoft.EntityFrameworkCore 3.1.2 -> Microsoft.Extensions.DependencyInjection 3.1.2 -> Microsoft.Extensions.DependencyInjection.Abstractions (>= 3.1.2) 
 UnitTestProject1 -> Microsoft.Extensions.DependencyInjection.Abstractions (>= 3.1.1)   UnitTestProject1    C:Dev2CombridgeSBD.ComBridgeUnitTestProject1UnitTestProject1.csproj    1   

I retried Simon's advice to install microsoft.data.sqlclient.sni manually

but still got the error

Could not load file or assembly 'Microsoft.Extensions.DependencyInjection.Abstractions, Version=3.1.0.0

I also tried downloading the 1.1.1 version of microsoft.data.sqlclient.sni

[Update] I decided to try rolling back entity framework in the .netstandard2.0 project to use

 <PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.0" />
 <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.0" />

Now when I unit test with the com visible framework project I get

 System.Exception: vivadbridgestd:GetValidCarriers line: 20 error:System.Exception: kg1System.IO.FileLoadException: Could not load file or assembly 'System.ComponentModel.Annotations, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
    File name: 'System.ComponentModel.Annotations, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
       at Microsoft.EntityFrameworkCore.Metadata.Conventions.Infrastructure.RelationalConventionSetBuilder.CreateConventionSet()
       at Microsoft.EntityFrameworkCore.Metadata.Conventions.SqlServerConventionSetBuilder.CreateConventionSet()
       at Microsoft.EntityFrameworkCore.Metadata.Conventions.Internal.RuntimeConventionSetBuilder.CreateConventionSet()
       at Microsoft.EntityFrameworkCore.Infrastructure.ModelSource.CreateModel(DbContext context, IConventionSetBuilder conventionSetBuilder)
       at Microsoft.EntityFrameworkCore.Infrastructure.ModelSource.GetModel(DbContext context, IConventionSetBuilder conventionSetBuilder)
       at Microsoft.EntityFrameworkCore.Internal.DbContextServices.CreateModel()
       at Microsoft.EntityFrameworkCore.Internal.DbContextServices.get_Model()
       at Microsoft.EntityFrameworkCore.Infrastructure.EntityFrameworkServicesBuilder.<>c.<TryAddCoreServices>b__7_3(IServiceProvider p)
       at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitFactory(FactoryCallSite factoryCallSite, RuntimeResolverContext context)
       at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
       at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitCache(ServiceCallSite callSite, RuntimeResolverContext context, ServiceProviderEngineScope serviceProviderEngine, RuntimeResolverLock lockType)
       at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScopeCache(ServiceCallSite singletonCallSite, RuntimeResolverContext context)
       at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
       at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, RuntimeResolverContext context)
       at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
       at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitCache(ServiceCallSite callSite, RuntimeResolverContext context, ServiceProviderEngineScope serviceProviderEngine, RuntimeResolverLock lockType)
       at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScopeCache(ServiceCallSite singletonCallSite, RuntimeResolverContext context)
       at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
       at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.Resolve(ServiceCallSite callSite, ServiceProviderEngineScope scope)
       at Microsoft.Extensions.DependencyInjection.ServiceLookup.DynamicServiceProviderEngine.<>c__DisplayClass1_0.<RealizeService>b__0(ServiceProviderEngineScope scope)
       at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(Type serviceType, ServiceProviderEngineScope serviceProviderEngineScope)
       at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type serviceType)
       at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
       at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider)
       at Microsoft.EntityFrameworkCore.DbContext.get_DbContextDependencies()
       at Microsoft.EntityFrameworkCore.DbContext.get_InternalServiceProvider()
       at Microsoft.EntityFrameworkCore.DbContext.get_DbContextDependencies()
       at Microsoft.EntityFrameworkCore.DbContext.get_Model()
       at Microsoft.EntityFrameworkCore.Internal.InternalDbSet`1.get_EntityType()
       at Microsoft.EntityFrameworkCore.Internal.InternalDbSet`1.get_EntityQueryable()
       at Microsoft.EntityFrameworkCore.Internal.InternalDbSet`1.System.Linq.IQueryable.get_Provider()
       at System.Linq.Queryable.SingleOrDefault[TSource](IQueryable`1 source, Expression`1 predicate)
       at SBDSTD.Standard.Helpers.LogHelper.InnerLogMessage(String message, JobHeaderLogInfo logInfo, Boolean sendEmail, ApiDbContext connect)

This causes my exe to fail as well.

Then I tried the 3.1.0 version of EFCore I now get the following in the framework test project

Test method UnitTestProject1.UnitTest1.T225_ValidCarriers threw exception: 
System.Exception: vivadbridgestd:GetValidCarriers line: 20 error:System.Exception: kg1System.Exception: Line 53 System.IO.FileLoadException: Could not load file or assembly 'Microsoft.Extensions.DependencyInjection.Abstractions, Version=3.1.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
File name: 'Microsoft.Extensions.DependencyInjection.Abstractions, Version=3.1.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'
   at Microsoft.EntityFrameworkCore.Internal.ServiceProviderCache.<>c__DisplayClass4_0.<GetOrAdd>g__BuildServiceProvider|3()
   at Microsoft.EntityFrameworkCore.Internal.ServiceProviderCache.<>c__DisplayClass4_0.<GetOrAdd>b__2(Int64 k)
   at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
   at Microsoft.EntityFrameworkCore.Internal.ServiceProviderCache.GetOrAdd(IDbContextOptions options, Boolean providerRequired)
   at Microsoft.EntityFrameworkCore.DbContext..ctor(DbContextOptions options)
   at SBDSTD.Standard.Entities.ApiDbContext..ctor(DbContextOptions`1 options)
   at SBDSTD.Standard.Services.Helper.MakeContext(String connectionString)

Assembly manager loaded from:  C:WindowsMicrosoft.NETFrameworkv4.0.30319clr.dll
Running under executable  C:Program Files (x86)Microsoft Visual Studio2019PreviewCommon7IDEExtensionsTestPlatform	esthost.x86.exe
--- A detailed error log follows. 

=== Pre-bind state information ===
LOG: DisplayName = Microsoft.Extensions.DependencyInjection.Abstractions, Version=3.1.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
 (Fully-specified)
LOG: Appbase = file:///C:/Dev2/Combridge/SBD.ComBridge/UnitTestProject1/bin/Debug
LOG: Initial PrivatePath = NULL
Calling assembly : Microsoft.Extensions.DependencyInjection, Version=3.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:Program Files (x86)Microsoft Visual Studio2019PreviewCommon7IDEExtensionsTestPlatform	esthost.x86.exe.Config
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:WindowsMicrosoft.NETFrameworkv4.0.30319configmachine.config.
LOG: Post-policy reference: Microsoft.Extensions.DependencyInjection.Abstractions, Version=3.1.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
LOG: Attempting download of new URL file:///C:/Dev2/Combridge/SBD.ComBridge/UnitTestProject1/bin/Debug/Microsoft.Extensions.DependencyInjection.Abstractions.DLL.
WRN: Comparing the assembly name resulted in the mismatch: Build Number
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.

   at SBDSTD.Standard.Services.Helper.MakeContext(String connectionString)

also happening in the .exe

I wondered if this question about entityframework.core is related but I can only find Microsoft.EntityFrameworkCore on Nuget.

[Update unit test now works]

I now have my unit test working. I needed to include the following near the top of the unit test project

   <PropertyGroup>
    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
    <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>    
   </PropertyGroup>

As discussed in this question on assembly binding

However I still need to a work around to use my com visible library in VB6

解决方案

I've been struggling with exactly the same problem and was able to solve it.

In my case the problem DLL was Microsoft.Extensions.Logging. Here's my exception:

Could not load file or assembly 'System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.Extensions.Logging, 
Version=2.2.0.0, Culture=neutral, 
PublicKeyToken=adb9793829ddae60' or one of its dependencies. 
The system cannot find the file specified.

The solution was insanely simple, basically app.config works for your VB6 EXE that is consuming COM exposed .NET classes. You just need to create a regular app.config with your <assemblyBinding> tags and it will work. The tricky part is where to place this config and how to name it.

  1. When you run your EXE from IDE (VB6) create VB6.exe.config in C:Program Files (x86)Microsoft Visual StudioVB98. Don't forget to restart the IDE after you created the config.
  2. When you run from EXE directly create ExeName.exe.config in the same folder as your ExeName.exe

Here's the Fusion log on how it resolves the redirection after the change (run from IDE case):

Calling assembly : Unity.Microsoft.Logging, Version=5.11.1.0, Culture=neutral, PublicKeyToken=489b6accfaf20ef0.
===
LOG: This bind starts in LoadFrom load context.
WRN: Native image will not be probed in LoadFrom context. Native image will only be probed in default load context, like with Assembly.Load().
LOG: Using application configuration file: C:Program Files (x86)Microsoft Visual StudioVB98VB6.EXE.config
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:WindowsMicrosoft.NETFrameworkv4.0.30319configmachine.config.
LOG: Redirect found in application configuration file: 2.2.0.0 redirected to 5.0.0.0.
LOG: Post-policy reference: Microsoft.Extensions.Logging, Version=5.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
LOG: Binding succeeds. Returns assembly from C:Program Files (x86)RetailCommonMicrosoft.Extensions.Logging.dll.
LOG: Assembly is loaded in LoadFrom load context.

这篇关于无法使用 COM 加载文件或程序集“Microsoft.Extensions.DependencyInjection.Abstractions"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆