#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 # и не обрабатывал вызванное ею исключение.