Поставщик OLEDB, похоже, исчезает во время выполнения программыC#

Место общения программистов C#
Ответить
Anonymous
 Поставщик OLEDB, похоже, исчезает во время выполнения программы

Сообщение Anonymous »

Прежде всего, я работаю в компании, которая не разрешает совместное использование кода в Интернете, поэтому я не смогу публиковать точные примеры кода, извините.
У меня действительно странная проблема с использованием OleDbConnection в программе C#. Целевой платформой является .NET Framework 4.7.2, а опция «Предпочитать 32-разрядную версию» в .csproj не оказывает никакого влияния на мою проблему; Я уже всё перепробовал в этом плане. Я работаю с Visual Studio 2022 и Office 2016.
У меня возникла классическая ошибка

Поставщик Microsoft.ACE.OLEDB.12.0 не зарегистрирован на локальном компьютере

при попытке открыть такое соединение:

Код: Выделить всё

using (OleDbConnection connexionPv = new OleDbConnection($"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:\\Temp\\doc.xlsx; Extended Properties='Excel 12.0';"))
{
connexionPv.Open();
}
Неожиданное поведение здесь заключается в следующем: этот точный код отлично работает при вызове в моей программе, пока я не вызову одну из наших библиотек DLL .NET Standard 2.0. После вызова этой DLL код выдает это исключение.
На моем компьютере установлен необходимый поставщик, и использование предоставленного фрагмента кода в пустом решении также работает нормально.
Пример:

Код: Выделить всё

// This works just fine.
using (OleDbConnection connection = new OleDbConnection($"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:\\Temp\\NeoPV_documentumExportTemp.xlsx; Extended Properties='Excel 12.0';"))
{
connection.Open();
}

// My .NET Standard 2.0 external lib
externalLib.DoWork();

Код: Выделить всё

// My .NET Standard 2.0 external lib
externalLib.DoWork();

// This throws the exception.
using (OleDbConnection connection = new OleDbConnection($"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:\\Temp\\NeoPV_documentumExportTemp.xlsx; Extended Properties='Excel 12.0';"))
{
connection.Open();
}
Внешняя библиотека никак не использует OleDb и не открывает файлы Excel или Word. Он использует itext7 для создания PDF-файлов и FileStream для чтения XML, и это почти все. Но каким-то образом это влияет на извлечение провайдера после его вызова, что для меня очень странно.
Я не знаю, какими важными подробностями я мог бы поделиться о NuGets и внешних DLL, используемых в этом контексте, но я могу добавить их, если спросят.
Вот несколько вариантов, которые я уже пробовал, но безрезультатно (каждый из них выполнялся после вызова моего внешнего приложения .NET Standard 2.0). :
  • Просмотр окна «Модули» не помогает, так как похоже, что DLL OleDb загружена в контексте COM.
  • Изменение версии OLE DB в строке подключения на 16.0.
  • Я также пробовал напрямую ссылаться на все библиотеки DLL, связанные с OleDb, в проекте.
  • Я пытался выполнить код в новый AppDomain, но и он не заработал.

Код: Выделить всё

AppDomain test = AppDomain.CreateDomain("test");
test.DoCallBack(() =>
{
using (OleDbConnection connection = new OleDbConnection($"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:\\Temp\\NeoPV_documentumExportTemp.xlsx; Extended Properties='Excel 12.0';"))
{
connection.Open();
}
});
Опять же, не стесняйтесь спрашивать любую важную деталь, которую я мог пропустить, поскольку я не могу опубликовать точную информацию во внешней библиотеке.
Спасибо за вашу помощь.>

Подробнее здесь: https://stackoverflow.com/questions/798 ... -execution
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»