Ошибка связывания dll в родном / смешанном режиме в vs2010 - PullRequest
3 голосов
/ 26 июня 2011

Я пытаюсь понять, как нативный код может взаимодействовать с кодом .NET, и в основном пытаюсь реализовать пример в ответе на эту тему . Код примера состоит из двух частей, одна из которых входит в .dll, скомпилированную с параметром / clr:

__declspec(dllexport) bool toUpper(void)
{
    return true;
}

и код, который должен вызывать эту функцию, попадает в приложение win32, которое изначально скомпилировано:

bool toUpper(void);

int _tmain(int argc, _TCHAR* argv[])
{
    bool b = toUpper();
    return 0;
}

Однако vs2010 выдает следующую ошибку компоновщика:

ошибка LNK2019: неразрешенная внешняя символ "bool __cdecl toUpper (void)" (? toUpper @@ YA_NXZ) упоминается в функция _wmain

Как только я отключаю параметр / clr в проекте dll, все работает, поэтому я предполагаю, что все зависимости между проектами настроены правильно. Любые предложения о том, что я сделал не так?

1 Ответ

3 голосов
/ 26 июня 2011

Вы должны использовать Project + Project Dependencies, чтобы заставить это работать без / clr.Да, это не работает, если проект скомпилирован с / clr.Использование .lib для управляемого кода довольно необычно.Вы должны явно указать компоновщику, чтобы он связывал .lib вашего управляемого проекта.

Щелкните правой кнопкой мыши проект EXE, Свойства, Компоновщик, Ввод, Дополнительные зависимости.Предполагая, что оба проекта находятся в одном решении, введите это:

..\$(ConfigurationName)\mumble.lib

Где mumble - имя вашего управляемого проекта.Повторите эти действия для конфигурации выпуска.

Помните, что использование управляемого кода таким способом плохо масштабируется.Компилятор C ++ / CLI автоматически генерирует thunk для экспортируемой функции, который обеспечивает загрузку и инициализацию CLR перед вызовом управляемой функции.Это, однако, обходится дорого, я рассчитал его на скорости 640 наносекунд на звонок на своем ноутбуке, не считая затрат на инициализацию CLR.Использование COM является эффективным способом избежать таких затрат.Или вы можете самостоятельно разместить CLR, ищите CorBindToRuntimeEx ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...