Смешивание кода C # и управляемого кода C ++ в Windows с Visual Studio

StackOverflow https://stackoverflow.com/questions/76629

Вопрос

Я хотел бы вызвать свои неуправляемые библиотеки C ++ из моего кода на C #.Каковы потенциальные подводные камни и меры предосторожности, которые необходимо принять?Спасибо вам за уделенное время.

Это было полезно?

Решение

Этот вопрос слишком широк.Единственный разумный ответ - P / Invoke, но это все равно что сказать, что если вы хотите программировать под Windows, вам нужно знать Win32 API.

О P / Invoke написано довольно много целых книг (http://www.amazon.com/NET-COM-Complete-Interoperability-Guide/dp/067232170X), и, конечно же, были созданы целые веб-сайты: http://www.pinvoke.net/.

Другие советы

Есть пара путей, по которым вы можете пойти с этим - во-первых, вы можете обновить свои неуправляемые библиотеки C ++, чтобы иметь оболочку управляемых расширений C ++ вокруг них, и заставить C # использовать эти классы напрямую.Это немного отнимает много времени, но обеспечивает хороший переход к устаревшему неуправляемому коду.Но имейте в виду, что управляемые расширения C ++ иногда немного сложны для навигации сами по себе, поскольку синтаксис похож на неуправляемый C ++, но достаточно близок, чтобы очень наметанный глаз смог увидеть различия.

Другой путь, по которому можно пойти, - это заставить ваш управляемый C ++ реализовать COM-классы и заставить C # использовать его через автоматически созданную сборку взаимодействия.Этот способ проще, если вы достаточно хорошо разбираетесь в COM.

Надеюсь, это поможет.

Вы описываете P / Invoke.Это означает, что ваша библиотека C ++ должна будет предоставлять доступ к себе через интерфейс DLL, и интерфейс должен быть достаточно простым для описания в P / Invoke через атрибуты вызова.Когда управляемый код вызывает неуправляемый мир, параметры должны быть маршалированы, поэтому, похоже, может произойти небольшое снижение производительности, но вам придется провести некоторое тестирование, чтобы увидеть, является ли маршалинг значительным или нет.

Самый простой способ начать - убедиться, что вся функциональность C ++ представлена в виде функций в стиле "C".Обязательно объявите функцию как _stdcall .

внешний "C" __declspec(dllexport) int _stdcall Foo(int a)

Убедитесь, что вы правильно выполнили маршалинг, особенно такие вещи, как указатели и wchar_t *.Если вы поймете это неправильно, это может быть трудно отладить.

Отлаживайте его с любой стороны, но не с обеих.При смешанной отладке native & managed отладчик может работать очень медленно.Отладка с одной стороны за раз экономит массу времени.

Для получения более подробной информации потребовался бы более конкретный вопрос.

Вы также можете вызвать неуправляемый код через P /Invoke .Это может быть проще, если ваш код в данный момент не использует COM.Я предполагаю, что вам, вероятно, нужно было бы написать некоторые конкретные точки экспорта в вашем коде, используя привязки "C", если бы вы пошли этим путем.

Вероятно, самое большое, на что вам следует обратить внимание по моему опыту, это то, что отсутствие детерминированной сборки мусора означает, что ваши деструкторы не будут запускаться, когда вы, возможно, думали, что они будут запускаться ранее.Вам нужно иметь это в виду и использовать IDisposable или какой-либо другой метод, чтобы убедиться, что ваш управляемый код очищен, когда вы этого захотите.

Конечно, там тоже всегда есть PInvoke, если вы упаковали свой код в виде библиотек DLL с внешними точками входа.Ни один из вариантов не является безболезненным.Они зависят либо от а) вашего умения писать COM- или управляемые C-оболочки, либо от того, насколько вы рискуете своими силами в PInvoke.

Я бы хотел взглянуть на глоток, мы используем это с пользой для нашего проекта, чтобы предоставить доступ к нашему C ++ API для других языковых платформ.

Это хорошо поддерживаемый проект, который эффективно создает тонкую оболочку вокруг вашей библиотеки C ++, которая может позволить таким языкам, как C #, напрямую взаимодействовать с вашим машинным кодом, избавляя вас от необходимости внедрять (и отлаживать) склеенный код.

Если вам нужны хорошие примеры PInvoke, вы можете посмотреть на PInvoke.net.В нем есть примеры того, как вызывать большинство функций win api.

Также вы можете воспользоваться инструментом из этой статьи Clr Наизнанку:ПИнвоук это переведет ваш файл .h в оболочку c #.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top