Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Комбинация managed/unmanaged в C++.NET  (Прочитано 4111 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« : 16-06-2013 11:54 » 

Речь о
Код:
#pragma managed
#pragma unmanaged
которые предписывают компилятору нижележащий код обрабатывать, соответственно, как управляемый (генерируя IL) или native (генерируя ассемблер целевой платформы).

Как показывает практика, по крайней мере в VS2008 механизм какой-то глючный.

Возможные глюки:

Если собрать статическую библиотеку с mixed-кодом, может возникнуть
LNK1127: Library is corrupt.

Но даже если библиотека переварена, всегда остаётся шанс для:
LNK1000: Internal unknown linker error.

Разумеется, у Microsoft никаких внятных объяснений для этих ошибок нет - по сути это нештатная ситуация.

Что надо делать:
1) Проверить, чтобы pragma была объявлена после всех include.
2) Если не помогает, удалить pragma из собственных header.
3) Если не помогает, удалить отовсюду.

Сборка тогда будет идти в соответствии с типом проекта: либо весь проект - управляемый код (в случае включенного /clr), либо весь проект - native-код. В последнем случае pragma игнорируется. И придётся по-разному собирающийся код раскидать по разным проектам.

Как вариант, можно вручную управлять параметром /clr в настройках каждого cpp-файла проекта, указывая, как его собирать. В любом случае, если такие глюки появились, придётся отказаться от mixed-кода внутри одной единицы компиляции (obj-файла).

Особенно неприятно получается с template-кодом, который как правило находится в header-файлах, и потому может собираться в разных местах в разных режимах, что не добавляет "здоровья" линкеру.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines