Система.Исключение OutOfMemoryException при компиляции кода с COM-компонентом в 32-разрядной версии и использовании в 64-разрядной системе

#c# #.net #com #32bit-64bit

#c# #.net #com #32bit-64bit

Вопрос:

Мой код отлично работает в 32-разрядной системе. Я просто ссылаюсь на COM-компонент, который считывает / записывает xml. Итак, я попытался скомпилировать в ‘X86’, а затем запустить в 64-разрядной системе, когда получил сообщение об ошибке ниже.

Произошло следующее исключение: System.Исключение OutOfMemoryException: не удалось создать экземпляр COM-компонента с CLSID {59D5FDED-B01B-47F4-BBBC-56941A2F4873} из IClassFactory из-за следующей ошибки: 8007000e.

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

1. Можете ли вы опубликовать интерфейс, который вы использовали? Есть большая вероятность, что он использует int или другой тип данных с неправильным размером указателя где-нибудь.

2. Кроме того, почему вы используете COM-компонент для записи XML, когда есть целое . Пространство имен NET, предназначенное для обработки XML?

3. Это крупное серверное приложение, которое существует более 10 лет. Он должен быть развернут на 64-разрядном сервере. Я использую . Теперь пространство имен NET для всех моих потребностей в XML.

4. В коде нет ошибки. Я просто создаю объект ‘Query’, затем инициализирую и устанавливаю XML-транзакцию. Затем я прочитал поля id и site. Это всего четыре строки кода и работает на 32-разрядной машине.

5. Об этом сообщается как об ошибке Windows (ошибка # 14), переведенной в управляемое исключение типа OOM. Трудно догадаться, откуда это происходит, но обычно это ошибка, генерируемая загрузчиком Windows. Что-то идет не так, когда загружается DLL.

Ответ №1:

Случайные предложения:

  • Подключите отладчик как собственный и посмотрите, есть ли интересные собственные исключения.
  • Постарайтесь, чтобы ваш exe-файл «не знал о большом пространстве памяти».
  • Проверьте, загружается ли приложение как 32-разрядное.
  • Попробуйте создать компонент с собственным кодом, чтобы убедиться, что он правильно установлен в системе.

Примечание: если ваш COM-компонент использует MSXML для работы с XML, загрузка его в управляемое приложение не поддерживается из-за несовместимости между управлением памятью. Вряд ли это вызовет проблему, которую вы видите, но больше для общего ознакомления.

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

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

Ответ №2:

Для меня это происходило потому, что COM-компонент C вызывал библиотеку C # и не обрабатывал вызванное ею исключение.