У меня действительно странная проблема с использованием 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();
}
На моем компьютере установлен необходимый поставщик, и использование предоставленного фрагмента кода в пустом решении также работает нормально.
Пример:
Код: Выделить всё
// 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();
}
Я не знаю, какими важными подробностями я мог бы поделиться о 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
Мобильная версия