2014-01-08 2 views
2

У меня есть собственная библиотека C++ (статическая i.eib цель). Я хочу использовать некоторые из функций этого файла в моих проектах на C#. Для dlls я мог бы их вытолкнуть. Как это сделать для статических библиотек?Пинквитирующие функции из статической библиотеки C

Я прочитал this question, и там ответ Дэвида говорит, что вы можете вызывать только для библиотек dll, а не для libs.

+0

Давид прав. Если вы хотите вызвать lib, вы должны сначала создать DLL (используя C++). Затем вы можете PInvoke эту DLL. –

+0

Итак, это означало бы создание dll (действующего как средний уровень), который вызывает эти функции .lib, а затем выворачивает функцию dll из C#? –

+3

Да. Lib не является исполняемым. Невозможно «называть это». Сначала вы должны создать исполняемый файл (dll) из lib. –

ответ

2

Статическая библиотека используется, связывая ее с большим модулем. В Windows это означает DLL или исполняемый файл.

Они не стоят в одиночестве и имеют смысл только при привязке их к более крупному модулю. Таким образом, это подразумевает, что для использования pinvoke вам необходимо построить DLL, которая включает в себя библиотеку, и pinvoke для этой DLL.

В качестве альтернативы pinvoke вы можете создать сборку C++/CLI в смешанном режиме. Свяжите статическую библиотеку с этой сборкой C++/CLI и предоставите функциональность через управляемый класс C++. Этот управляемый класс может быть затем использован вашим кодом C#.

+0

Спасибо. Чтобы прояснить, зачем было использовать этот проект на C++ .lib, а не DLL? Если решение содержит только проекты C++, возможно ли вызывать функции из .lib или .dll? Итак, почему бы просто не делать .dlls всегда –

+0

Это позволяет потребителю создавать код в один исполняемый файл и поэтому не нужно перераспределять дополнительные DLL. –

+0

Альтернатива, которую вы упоминаете, к сожалению, не всегда возможна. Статическая библиотека, построенная с флагом '\ MT', не может быть связана в проекте C++'/clr'. Вы получите _error LNK2038: обнаружено несоответствие для 'RuntimeLibrary': значение '** MTd ** _ StaticDebug' не соответствует значению '** MDd ** _ StaticDebug'_. Чтобы исправить это, вы должны поместить проект C++/CLI в режим '\ MD', но вы не можете. Вы получите ошибку в том, что параметры командной строки «/ MT» и «/ clr» несовместимы. Таким образом, для сводки она будет работать только в том случае, если ваш собственный lib был создан с флагом '\ MD' ** (динамически ссылка к времени выполнения). – cid

Смежные вопросы