Марк, я хотел бы увидеть полный пример

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

1) Я мог бы попытаться скомпилировать библиотеку с / clr и попробовать подход «Это просто работает».

2) Я мог бы написать управляемую оболочку в неуправляемую библиотеку.

Прежде всего, я хочу, чтобы моя библиотека работала БЫСТРО, как это было в неуправляемой среде. Таким образом, я не уверен, что первый подход не приведет к значительному снижению производительности. Однако, это, кажется, быстрее реализовать (не правильное слово :-)) (при условии, что это будет работать для меня).

С другой стороны, я думаю о некоторых проблемах, которые могут возникнуть при написании оболочки (например, как обернуть некоторую коллекцию STL (vector например)?) Я думаю о написании оболочки, находящейся в том же проекте, что и неуправляемый C ++, - это разумный подход (например,MyUnmanagedClass а такжеMyManagedClass в том же проекте вторая обертка другая)?

Что бы вы предложили в этой проблеме? Какое решение даст мне лучшую производительность полученного кода?

Заранее благодарю за любые предложения и подсказки!

ура

Ответы на вопрос(3)

Решение Вопроса

Разница в том, что Managed C ++ был первой попыткой Microsoft расширить C ++ для работы с .NET, и, честно говоря, это было ужасно.

Поэтому они отказались от этого и разработали C ++ / CLI, который работает намного лучше.

Во-вторых, действительный код C ++ долженпросто работай если вы компилируете его как C ++ / CLI, так что это кажется очевидным способом сделать это.

Конечно, для того, чтобы представить ваши типы C ++ для сборок .NET, вы должны будете написать несколько оболочек в любом случае. Для типов STL, вы можете посмотреть в MicrosoftSTL / CLR библиотека.

Но в общем, просто добавьте ключ / cli, скомпилируйте свой код как C ++ / CLI, а затем добавьте необходимые упаковщики. Нет никаких причин, по которым ваш код мог бы волшебным образом замедляться или что-то еще.

 Jamie10 янв. 2011 г., 01:24
Написание "управляемого C ++" Я думал о C ++ / CLI, очевидно :-) - теперь это редактируется, спасибо за это :)
 YeenFei10 янв. 2011 г., 02:16
столько ненависти к синтаксису двойного подчеркивания: P
 jalf10 янв. 2011 г., 01:39
Да, их часто путают. Но это также может привести к путанице. :)
 Billy ONeal10 янв. 2011 г., 02:57
Имейте в виду, что если ваш код содержитЛюбые нативные классы, то он не будет работать в ненадежном режиме. О чем подумать, если вы развернетесь и захотите развернуть что-то в xap Silverlight. Вы должны использовать/clr:pure затем, и это означает, что вы должны по существу переписать все.

Создать нормальный неуправляемый .lib. Убедитесь, что вы ссылаетесь на стандартную среду выполнения как DLL (требуется, если .lib находится в сборке)

Создайте сборку C ++ / CLI.

Добавьте .lib к ссылке как сборки

Создать управляемый интерфейс

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

Такие вещи, как std :: vector, должны быть упакованы вручную в System.Collections, но «это просто работает» хорошо для встроенных типов и даже указателей на функции.

Другие ошибки. Обратные вызовы должны быть stdcall, чтобы превратиться в делегата, а delgates, отправленные неуправляемым обратным вызовам, не содержат ссылку (поэтому, организуйте хранение ссылки где-нибудь еще или произойдет сбой, когда объект GC'd).

 Arman Bimatov18 авг. 2013 г., 00:21
Итак, шаг 4, я полагаю, с использованием подхода P / Invoke?
 Lou Franco20 авг. 2013 г., 04:24
Нет. В C ++ / CLI вы можете создавать управляемые классы и неуправляемые классы. P / Invoke отсутствует - оба класса находятся в одной сборке
 Arman Bimatov20 авг. 2013 г., 16:53
Я на самом деле только что понял это вскоре после моего комментария. Это IJW (это просто работает). Я фактически связываю неуправляемые библиотеки и библиотеки CLI как два проекта одного и того же решения через Visual Studio -> Add Reference, как в этом вопросе:stackoverflow.com/questions/18302784/... И да, мне пришлось написать преобразования для большинства массивов, векторов и других сложных типов. Библиотека MS Marshaling очень помогла:msdn.microsoft.com/en-us/library/vstudio/bb384865.aspx

вы должны рассмотреть возможность использованияSWIG, Он пишет весь код оболочки и взаимодействия для вас, и имеет предварительно написанные файлы интерфейса SWIG, которые поддерживают std :: vector, std :: string, windows windows и т. Д.

У меня есть полный пример, демонстрирующий неуправляемые функции C ++ DLL, если вам интересно.

 user130423217 февр. 2014 г., 23:26
Марк, я хотел бы увидеть полный пример

Ваш ответ на вопрос