Смешивание кода C # и неуправляемого кода C ++ в Windows с помощью Visual Studio - PullRequest
6 голосов
/ 17 сентября 2008

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

Ответы [ 8 ]

3 голосов
/ 17 сентября 2008

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

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

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

1 голос
/ 17 сентября 2008

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

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

1 голос
/ 17 сентября 2008

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

extern "C" __declspec (dllexport) int _stdcall Foo (int a)

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

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

Для уточнения потребуется более конкретный вопрос.

1 голос
/ 17 сентября 2008

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

0 голосов
/ 17 сентября 2008

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

Также вы можете использовать инструмент из этой статьи. Clr Inside Out: PInvoke , который переведет ваш файл .h в обертки c #.

0 голосов
/ 17 сентября 2008

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

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

0 голосов
/ 17 сентября 2008

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

0 голосов
/ 17 сентября 2008

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

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

...