C # .NET Core 2.2 - C # MongoDB.Driver - Исключение - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть 4 проекта:

A - проект .NET Core 2.2 - ссылка на B и D (ничего не знает о C)

B - .NET 4.7.2 Библиотека классов - ссылкав C и D

C - библиотека классов .NET 4.7.2 - ссылка D и драйвер MongoDB C # (версия 2.7.30), установленный с NuGet.

D - .NET 4.7.2 Библиотека классов - просто контейнер для классов DTO

Все проекты создаются и выполняются.

===

B - хранилище общих данных,

C - это контекст базы данных, в котором используется драйвер MongoDB C #.

Оба проекта B и C работают без ошибок, когда я использую их в «нормальном» .NET 4.7.2,также 4.5.2 проектов.

===

Ошибка:

Когда я звоню из .NET Core проекта A в B, который заканчивается на C, яполучить ошибку в этот момент:

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: не удалось загрузить тип 'System.Runtime.Remoting.Messaging.CallContext' from Assembly 'mscorlib, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken = b77a5c561934e089 '.в MongoDB.Driver.Core.Events.EventContext.AsyncLocal 1.get_Value() at MongoDB.Driver.Core.Events.EventContext.BeginOperation(Nullable 1 operationId) в MongoDB.Driver.Core.Operations.FindCommandOperation 1.Execute(IReadBinding binding, CancellationToken cancellationToken) at MongoDB.Driver.Core.Operations.FindOperation 1.Execute (связывание IReadBinding, CancellationToken cancellationToken) в MongoDB.Dripera.ExactionTResult] (привязка IReadBinding, IReadOperation 1 operation, CancellationToken cancellationToken) at MongoDB.Driver.MongoCollectionImpl 1.ExecuteReadOperation [TResult] (сеанс IClientSessionHandle, IReadOperation 1 operation, ReadPreference readPreference, CancellationToken cancellationToken) at MongoDB.Driver.MongoCollectionImpl 1.ExecuteReadOperation [TResult] (сеанс IClientSessionHandle, IReadOperation 1 operation, CancellationToken cancellationToken) at MongoDB.Driver.MongoCollectionImpl 1.FindSynition ICessionShief [TPO1037 * 2 варианта, CancellationToken CancellationToken) в MongoDB.Driver.MongoCollectionImpl 1.<>c__DisplayClass41_0 1.b__0 (сеанс IClientSessionHandle) в MongoDB.Driver.MongoCollectionImpl 1.UsingImplicitSession[TResult](Func 2 функции, CancellationToken CancellationToken * переход на 1 * в 10 моноблоков., FindOptions 2 options, CancellationToken cancellationToken) at MongoDB.Driver.FindFluent 2.ToCursor (CancellationToken cancellationToken) в MongoDB.Driver.IAsyncCursorSourceExtensions.ToList [TDocument] (IAsyncCursorSource`1 источник, CancellationToken можетcellationToken) ...}

(извините за полное исключение, но я думал, что это поможет)

Мой вопрос:

Что я могусделать, чтобы решить эту проблему?

Как я уже говорил выше - похоже, это проблема .NET Core, так как проекты работают без ошибок в других проектах.

Ответы [ 2 ]

0 голосов
/ 10 апреля 2019

В моем случае в моем базовом стандартном библиотечном проекте использовался обычный библиотечный проект, даже если я изменился на 4,5, 4,52, 4,61, 4,72, но проблема никогда не заканчивалась до преобразования обычного библиотечного проекта в стандартный библиотечный проект.Я предлагаю преобразовать в стандартную библиотеку lib

0 голосов
/ 26 февраля 2019

После отладки и тестирования бесчисленных сценариев я выяснил, в чем дело.

Человек, это было действительно трудно выяснить, потому что здесь был только один небольшой намек на SO, который помог мне.

Итак, история от начала до конца:

1.) У меня есть «нормальная» библиотека .NET 4.7.2, в которой находится мой пользовательский контекст MongoDB.

2.)Чтобы сделать это, я установил пакет MongoDB Nuget в эту DLL.

3.) Пакет работал хорошо и, как и ожидалось, в сотрудничестве с другими "обычными" .NET 4.7.2 DLL.Нет проблем.Очень рад.

4.) При попытке использовать мою библиотеку 4.7.2 с проектом .NET Core, я получаю исключение в стартовом посте.Черт.

5.) Что нужно иметь в виду: когда вы устанавливаете пакет nuget, он, похоже, устанавливает и ссылается на библиотеки DLL, предназначенные для той же (ближайшей?) Платформы.В моем случае целью был 4.7.2, поэтому NuGet установила 4.5 версии MongoDB.Driver и MongoDB.Driver.Core.

6.) Что вам действительно нужно, при работе с .NET Core НЕ являетсяВерсии 4.5, но версии NetStandard 1.5 ОБА MongoDB.Driver и MongoDB.Driver.Core.

7.) Поэтому я вручную загрузил пакеты Nuget для MongoDB.Driver и MongoDB.Driver.Core.Пакеты NuGet - это просто * .zip файлы, поэтому я изменил расширение и распаковал их.

8.) Внутри каждого пакета вы найдете папку lib с двумя папками: net45 и netstandard1.5

9.) Я извлек нетоксичные версии 1.5 ОБА MongoDB.Driver и MongoDB.Driver.Core.

10.) Я заменил ссылки ОБА MongoDB.Driver и MongoDB.Driver.Core в моем .NET4.7.2 DLL с версиями Netstandard 1.5 - БУМ!Работаю!

Итак, все вкратце:

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;
}

Я действительно надеюсь, что мой ответ спасет другие часы или даже дни чистого замешательства.

...