Почему .NET 4.0 выдает ошибку «CRT not initialized» при загрузке неуправляемой DLL? - PullRequest
2 голосов
/ 20 октября 2010

У меня есть DLL, поставляемая сторонней организацией, и сопровождающая ее сборка .NET 2.0, которая оборачивает ее. Если я создаю проект .NET 3.5 с VS2008, я могу вызвать DLL через сборку оболочки, и она работает нормально. Однако, если я создаю эквивалентный проект .NET 4.0 с VS2010, я получаю ошибку R6030 - CRT not initialized в окне сообщения во время загрузки DLL.

Что я могу сделать, чтобы заставить это работать в проекте .NET 4.0? Может ли это быть связано с изменениями в CAS или чем-то еще?

Сейчас я продолжаю свою работу в VS2008, но было бы хорошо понять, что происходит ...

Ответы [ 2 ]

4 голосов
/ 20 октября 2010

Это не ошибка .NET, это ошибка MS C Runtime (CRT, MSCRT).

Ваш сторонний dll предположительно использует какой-то MSCRT dll (существует множество версий).При запуске процесса собственного приложения CRT инициализируется (он содержит точку входа в программу, которая затем вызывает main).Существует также точка входа для новых потоков, обеспечивающая правильную настройку данных для каждого потока.

Если среда выполнения .NET 2 1 по умолчанию использует тот же MSCRTкак нативный код, тогда он будет правильно инициализирован..NET 4 предположительно использует более новую версию (новые версии MSCRT, как правило, поставляются с новыми версиями VS, как и .NET), тогда более старая версия MSCRT загружается только как зависимость и не используется для запуска приложения.

Большую часть времени MSCT обрабатывает это правильно, но если сторонний dll делает что-то «умное», он может обойти некоторую инициализацию, и это просто работает, если в .NET используется та же версия MSCRT.Примером такого неправильного использования является непосредственный вызов CreateThread вместо использования оболочки MSCRT _beginthread.

Для первопричины вам потребуется достаточное понимание 3-й части dll иобертка - более вероятно, что вам нужно предоставить воссоздание третьему лицу для исправления.


1 Помните, что V3.5 просто лишнийсборки поверх 2.0 CLI.

1 голос
/ 20 октября 2010

Это происходит только при отладке или при запуске?

На ум приходят две вещи:

1) Тип приложения по умолчанию для .NET нацелен на .NET Client Framework, что является наиболее раздражающим, и мне приходится все время его менять. Вы можете получить всевозможные странные ошибки, если сохраните его в качестве клиента, которому ничего не поделаешь. Попробуйте изменить это.

2) Вам нужна VS 2010 или .NET 4.0? Если только VS 2010, то вы можете установить целевую платформу на 3.5 и попытаться выяснить, является ли проблема VS 2010 или .NET 4.0.

Если посмотреть на ошибку в Интернете, похоже, что это проблема синхронизации, а среда выполнения C не загружена - поведение, похожее на измененное в .NET 4.0. Понятия не имею, как это исправить.

...