открыть неуправляемую библиотеку классов c ++ для c # - PullRequest
3 голосов
/ 24 апреля 2009

На самом деле у меня есть две неповрежденные библиотеки c ++, одна из которых использует другую. И то, и другое довольно большое, поэтому переписывание для меня не вариант.

Я прочитал кое-что о создании управляемой библиотеки c ++, которая оборачивает неуправляемый код. Но я не совсем понимаю, как начать и как объединить все это в одном проекте ...

Есть ли какие-нибудь пошаговые руководства или хорошие простые для понимания примеры, как это сделать?

ТИА

Ответы [ 5 ]

3 голосов
/ 28 апреля 2009

Вы можете написать оболочку COM для своего кода C ++ с использованием ATL. Я показываю, как это сделать, в сообщении в блоге . Вот как Microsoft предоставляет функциональность, написанную на C ++ (например, функции библиотек Windows 7). COM легко потребляется .NET / C # (см. этот пост ). Если вы пойдете по этому пути, вы можете рассмотреть без регистрации COM , если вам не нужно делиться своей оберткой с другими.

1 голос
/ 28 апреля 2009

у вас есть два варианта, один называется ijw, «он просто работает», где вы можете написать управляемый c ++ и вызвать неуправляемый c ++. Другой вариант требует использования pinvoke.

если вы используете pinvoke, у вас будет что-то вроде этого

C #

somefunction("str1", "str2", "str3", "str4"); 

[DllImport(@"myproj.dll", EntryPoint = "somefunction")]
public static extern IntPtr SomeFunction([MarshalAs(UnmanagedType.LPWStr)]string jarg1, [MarshalAs(UnmanagedType.LPWStr)]string jarg2, [MarshalAs(UnmanagedType.LPWStr)]string jarg3, [MarshalAs(UnmanagedType.LPWStr)]string jarg4);

C ++

extern "C" __declspec(dllexport) void* __stdcall somefunction(wchar_t * jarg1, wchar_t * jarg2, wchar_t * jarg3, wchar_t * jarg4) 
{
//do some stuff with strings
}

если вы используете SWIG, swig попытается автоматически сгенерировать приведенный выше код, но это суровый мастер.

Я однажды использовал управляемый c ++, но не совсем помню, что я об этом думал.

1 голос
/ 24 апреля 2009

Вы можете написать управляемый и неуправляемый C ++ в одном проекте. Таким образом, вы можете написать оболочку в Managed C ++, которая вызывает ваши собственные классы c ++ и т. Д. Затем в C # ваши управляемые классы C ++ будут выглядеть так же, как и любая другая ссылка .net. В этом случае не нужно использовать P / Invoke.

1 голос
/ 24 апреля 2009

Я думаю, это зависит от того, сколько функциональных возможностей библиотеки вам действительно нужно предоставить.

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

  1. Используйте SWIG для автоматической генерации оболочек C # PInvoke для ваших классов C ++. Такого рода работы, но на самом деле они того стоят, если вам нужно выставить лот классов и членов. По моему опыту, автоматически сгенерированный код все еще нуждался в ручной настройке.

  2. Пишите неуправляемые оболочки C для нужной вам функциональности, экспортируйте их из DLL и вручную пишите несколько оболочек PInvoke, которые необходимо импортировать в C #. Я обнаружил, что это более уместно в некоторых случаях, например, есть большая библиотека классов C ++, которая выполняет различные типы преобразований файлов изображений, но все, что вы действительно хотите показать, - это одна функция DoTheConversion(LPWSTR inputFile). Моей программе на C # не нужно было знать все тонкости базовой библиотеки классов.

0 голосов
/ 24 апреля 2009

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

http://www.ondotnet.com/pub/a/dotnet/2004/03/29/mcpp_part3.html http://www.codeguru.com/cpp/cpp/cpp_managed/interop/article.php/c6867

Ни один из этих подходов не использует p / invoke, и это подход, который мы используем в проектах, над которыми я работаю, где нам нужно взаимодействовать с безумно старой библиотекой c ++ - службы.

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