2009-04-24 5 views
3

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

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

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

ТИА

+1

Уже ответил здесь http://stackoverflow.com/questions/761930/getting-object-functionallity-out-of-c-code-in-c/762012#762012, а также множество других сообщений; в последнее время это очень распространенный вопрос. –

ответ

1

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

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

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

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

0

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

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++ - service.

1

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

1

У вас есть два варианта: один называется 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++ один раз, но я не помню, что я думал об этом.

3

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

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