.NET-приложение в 64-разрядной версии: проблема с ODBC

#c# #.net #dll #odbc #target-platform

#c# #.net #dll #odbc #целевая платформа

Вопрос:

В настоящее время я работаю над более крупным .NET-приложением, предоставленным компанией. При обработке большого объема данных возникает проблема, связанная с нехваткой памяти в системе. После некоторых исследований я решил сделать шаг и изменить целевую платформу приложения на 64-разрядную. В Visual Studio 2017 есть возможность изменить платформу проектов … . При запуске сборки приложения я несколько раз получаю предупреждение CNDL1138 в консоли вывода, но сборка в любом случае проходит успешно. При запуске приложения я получаю разные сообщения об ошибках / исключениях:

  • Генерируется исключение: ‘System.IO.FileNotFoundException’ в mscorlib.dll
  • Генерируется исключение: ‘System.Data.Odbc.OdbcException’ в System.Data.dll
  • Генерируется исключение: ‘System.Data.Odbc.OdbcException’ в System.Data.dll
  • Возникло исключение: ‘System.Исключение InvalidOperationException’ в системе.Windows.Forms.dll

Итак, я начал решать проблемы шаг за шагом. Первое, что я попытался решить, была проблема с ODCB. При запуске проблемы во всплывающем окне сообщается, что существует несоответствие между драйвером и приложением. Но я проверил установленные драйверы, они 64-разрядные, как и приложение. Я понятия не имею, в чем может быть проблема с драйверами.

Итак, есть ли здесь кто-нибудь с такой же проблемой и мог бы ее решить?

(Дополнительная информация: я использую Visual Studio 2017, .NET Framework 4.6.1 и программирую на C #)

Комментарии:

1. необходимо проверить, что зависимости приложения поддерживают 64-разрядную версию. Какой драйвер odbc вы используете? Для чего вы это используете? Другой распространенной проблемой являются собственные зависимости, но, вероятно, здесь это не так.

2. @JonasH Я новичок в этой теме. Не могли бы вы объяснить мне, где проверять зависимости. У меня есть драйвер Microsoft access, oracle в oraclient12Home и sql server. Приложение импортирует, экспортирует данные из разных баз данных, доступных по всему миру

Ответ №1:

Как вы, возможно, знаете, Odbc — это стандартизированный интерфейс базы данных. Для его работы необходим драйвер, специфичный для реального ядра базы данных.

Конкретная проблема, о которой я знаю, — это механизм access odbc. Драйвер JET раньше был обычным, но он только 32-разрядный. Заменой является драйвер ACE, который существует как в вариантах x64, так и в x86. Это должно быть установлено в системе с использованием распространяемого, насколько я знаю, нет законного способа просто включить DLL-файлы в приложение. Он также включен в установки office (по крайней мере, тот вариант, который я использовал в то время), но office по умолчанию использует x86-варианты всех компонентов, вам нужно явно выбрать x64 во время установки.

Я думаю, вы можете установить распространяемый драйвер ace для x64 параллельно с установкой office x86, но моя память может быть неисправна.

Я понятия не имею, есть ли подобные проблемы с драйвером oracle. Я подозреваю, что проблема проще с драйвером MSSQL, поскольку 64-разрядная операция была стандартной в течение гораздо более длительного времени.

.Net разрешает большинство зависимостей по требованию, обычно это делается при компиляции первого фрагмента кода, использующего зависимость, то есть перед его первым запуском. Способ проверить, какой драйвер вызывает у вас проблемы, — это проверить, где возникает исключение, то есть какую базу данных он пытался использовать.

Комментарии:

1. Когда я открываю администратора источника данных ODBC (64-разрядный), будут показаны только 64-разрядные драйверы, я не прав? Я думал, что при изменении целевой платформы в Visual Studi 2017 изменяется, тогда все библиотеки DLL должны быть изменены,

2. @user15150542 библиотеки DLL .Net обычно нацелены на любой процессор и компилируются для любой платформы. Но некоторые компоненты, такие как драйверы odbc, являются собственными и зависят от платформы. Существует множество правил, касающихся того, как разрешаются и используются эти компоненты, о которых я мало что знаю, чтобы дать хороший ответ. Возможно, можно использовать Process Monitor для точного отслеживания того, какие библиотеки DLL пытается загрузить приложение.

3. Хорошо, я понимаю, я не знал, что библиотеки DLL не зависят от платформы. Спасибо. Я установил Process Monitor и ищу несоответствия между обеими версиями.