【问题标题】:C# .NET Core 2.2 - C# MongoDB.Driver - ExceptionC# .NET Core 2.2 - C# MongoDB.Driver - 异常
【发布时间】:2019-04-10 16:03:48
【问题描述】:

我有 4 个项目:

A - .NET Core 2.2 项目 - 对 B 和 D 的引用(对 C 一无所知)

B - .NET 4.7.2 类库 - 对 C 和 D 的引用

C - .NET 4.7.2 类库 - 参考 D 和随 NuGet 一起安装的 MongoDB C# 驱动程序(版本 2.7.30)。

D - .NET 4.7.2 类库 - 只是 DTO 类的容器

所有项目都会构建和运行。

===

B 是通用数据存储库。

C 是一个数据库上下文,它使用 MongoDB C# 驱动程序。

当我在“普通”.NET 4.7.2 和 4.5.2 项目中使用它们时,项目 B 和 C 都运行良好,没有任何错误。

===

错误:

当我从 .NET Core 项目 A 调用以 C 结尾的 B 时,此时出现错误:

private IMongoCollection<T> _Collection;
public IMongoCollection<T> Collection
{
    get
    {
        if (_Collection == null)
        {
            //This is still ok!
            _Collection = _DataBase.GetCollection<T>("MyTableName");
        }
        return _Collection;
    }
}

public IEnumerable<T> All
{
    get
    {
           try
           {
               //Collection is NOT Null and was loaded from the DB
               return Collection.Find(new BsonDocument()).ToList();
           }
           catch (Exception ex)
           {
               //THE EXCEPTION APPEARS HERE                    
           }
           return null;
    }
}

异常详情如下:

{System.TypeLoadException:无法从程序集“mscorlib,版本=4.0.0.0,文化=中性,PublicKeyToken=b77a5c561934e089”加载类型“System.Runtime.Remoting.Messaging.CallContext”。 在 MongoDB.Driver.Core.Events.EventContext.AsyncLocal1.get_Value() at MongoDB.Driver.Core.Events.EventContext.BeginOperation(Nullable1 operationId) 在 MongoDB.Driver.Core.Operations.FindCommandOperation1.Execute(IReadBinding binding, CancellationToken cancellationToken) at MongoDB.Driver.Core.Operations.FindOperation1.Execute(IReadBinding 绑定,CancellationToken cancelToken) 在 MongoDB.Driver.OperationExecutor.ExecuteReadOperation[TResult](IReadBinding 绑定,IReadOperation1 operation, CancellationToken cancellationToken) at MongoDB.Driver.MongoCollectionImpl1.ExecuteReadOperation[TResult](IClientSessionHandle 会话,IReadOperation1 operation, ReadPreference readPreference, CancellationToken cancellationToken) at MongoDB.Driver.MongoCollectionImpl1.ExecuteReadOperation[TResult](IClientSessionHandle 会话,IReadOperation1 operation, CancellationToken cancellationToken) at MongoDB.Driver.MongoCollectionImpl1.FindSync [TProjection](IClientSessionHandle session, FilterDefinition1 filter, FindOptions2 options, CancellationToken cancelToken) 在 MongoDB.Driver.MongoCollectionImpl1.&lt;&gt;c__DisplayClass41_01.b__0(IClientSessionHandle 会话) 在 MongoDB.Driver.MongoCollectionImpl1.UsingImplicitSession[TResult](Func2 func, CancellationToken cancelToken) 在 MongoDB.Driver.MongoCollectionImpl1.FindSync[TProjection](FilterDefinition1 过滤器,FindOptions2 options, CancellationToken cancellationToken) at MongoDB.Driver.FindFluent2.ToCursor(CancellationToken cancelToken) 在 MongoDB.Driver.IAsyncCursorSourceExtensions.ToList[TDocument](IAsyncCursorSource`1 源,CancellationToken cancelToken) ...}

(对不起,我认为这会有所帮助)

我的问题:

我可以做些什么来解决这个问题?

正如我之前所说 - 这似乎是一个 .NET Core 问题,因为这些项目在其他项目中运行时没有任何错误。

【问题讨论】:

    标签: c# mongodb .net-core asp.net-core-webapi


    【解决方案1】:

    在调试和测试了无数场景后,我发现了问题所在。

    伙计,这真的很难找到,因为这里只有一个关于 SO 的小提示对我有帮助。

    所以故事从头到尾:

    1.) 我有一个“普通”的 .NET 4.7.2 DLL,它托管我的自定义 MongoDB 上下文。

    2.) 为此,我将 MongoDB Nuget 包安装到此 DLL 中。

    3.) 与其他“普通”.NET 4.7.2 DLL 协作时,该包运行良好,符合预期。没问题。很开心。

    4.) 在尝试将我的 4.7.2 DLL 与 .NET Core 项目一起使用时,我在开始帖子中遇到异常。妈的。

    5.) 您必须记住的事项:当您安装 nuget 包时,它似乎会安装并引用针对相同(最近?)框架的 DLL。在我的例子中,目标是 4.7.2,所以 NuGet 安装了 4.5 版本的 MongoDB.Driver 和 MongoDB.Driver.Core。

    6.) 使用 .NET Core 时,您真正需要的不是 4.5 版本,而是 MongoDB.Driver 和 MongoDB.Driver.Core 的 NetStandard 1.5 版本。

    7.) 所以我手动下载了 MongoDB.Driver 和 MongoDB.Driver.Core 的 Nuget 包。 NuGet 包只是 *.zip 文件,所以我更改了扩展名并解压缩了它们。

    8.) 在每个包中,您会发现一个包含两个文件夹的 lib 文件夹:net45 和 netstandard1.5

    9.) 我提取了 MongoDB.Driver 和 MongoDB.Driver.Core 的 netstandard 1.5 版本。

    10.) 我用 Netstandard 1.5 版本替换了 .NET 4.7.2 DLL 中 MongoDB.Driver 和 MongoDB.Driver.Core 的引用 - 轰!工作!

    总结一下:

    If (.NET Core + MongoDB)
    {
       use MongoDB.Driver      Netstandard 1.5;
       use MongoDB.Driver.Core Netstandard 1.5;
    }
    If (.NET + MongoDB)
    {
       use MongoDB.Driver      Net 4.5;
       use MongoDB.Driver.Core Net 4.5;
    }
    

    我真的希望,我的回答可以节省其他人几个小时甚至几天的纯粹困惑。

    【讨论】:

      【解决方案2】:

      在我的情况下,我的核心标准库项目使用普通库项目,即使我已经更改了 4.5、4.52、4.61、4.72 与但问题直到将普通库项目转换为标准库项目才结束。 我建议转换为标准库

      【讨论】:

        猜你喜欢
        • 2020-04-27
        • 2020-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-21
        • 1970-01-01
        • 2021-12-11
        相关资源
        最近更新 更多