Обертки Управляемого С++ для библиотек C++ прежней версии

Ваш код совершенно неверный, синтаксическая ошибка.

Но вы можете сделать это:

$str = '<h1>Hello World</h1>';

switch ($action) {
    case 'view':
        echo $str;
        break;
    case 'save':
        file_put_contents($file, $str, FILE_APPEND);
        break;
    default:
        throw new Exception('Invalid action');
}
6
задан 2 revs 9 February 2010 в 21:21
поделиться

5 ответов

Мне было легко обычно вполне перенести некоторые существующие библиотеки C++ в C++ / CLI и встреченный сравнительно немного ловушек. Те, которых я могу помнить, были:

  • Смешивание неуправляемого кода C++ и C++ / код CLI в том же исполняемом файле/DLL является действительно плохой идеей. Я столкнулся с проблемами с конкурирующими диспетчерами памяти во время завершения работы, когда путь (в основном время выполнения.NET и регулярное время выполнения C++, где, ступая на пальцы ног друг друга, когда это пришло к чистке памяти на завершении работы, приводящем к недетерминированному поведению, относительно которого освободил что). Вместо того, чтобы связать статическую библиотеку C++ прежней версии в C++ / библиотека CLI, я создал DLL, содержащий C++ прежней версии, и связал это против C++ / CLI DLL, который решил проблему раз и навсегда.
  • Если Ваш код использует перечисления, необходимо перенести перечисления в соответствующем C++ / классы Enum CLI, иначе другие языки.NET не смогут видеть и использовать их.
  • C++ / объекты CLI может только содержать указатели на неуправляемые объекты C++. К сожалению, в определенных случаях, это означает, что необходимо будет создать тонкие слои обертки для обработки определенных объектов. Мой "фаворит" был то, что я должен был или перенести повышение:: shared_ptrs тот путь (и таким образом добавляют другой слой косвенности) или помещают их в shared_ptrs с пустыми средствами удаления после пересечения границы.NET/собственного компонента. Ни один не очень хорош, когда необходимо иметь дело с API, которые используют этот вид конструкции много. RAII не пересекает эту границу, так предупреждается, необходимо будет инвестировать некоторое время в тонкую настройку его для соответствия.NET путь.
  • C++ / CLI не делает множественного наследования, поэтому если Ваша библиотека прежней версии использует это, Вам, возможно, придется смоделировать это использование интерфейсы и т.д.
  • Внутренний код маршалинга, кажется, может обработать большинство преобразований POD, но Вы будете иметь, находят/одалживают код, который преобразовывает станд.:: строки и т.д. Этот код вокруг, несколько минут на Google должны поднять его (извините, не имейте никаких ссылок удобными здесь в данный момент).
6
ответ дан 9 December 2019 в 22:41
поделиться

Просто некоторые проблемы, с которыми мы встретились:

  • Управление времени жизни памяти/Ресурса (GC/IDisposable по сравнению с Деструкторами). Я думаю, что это известно, и сообщение Rob имеет несколько вещей об этом, таким образом, я не буду вдаваться в подробности здесь...
  • Строковое кодирование/декодирование. Если Ваш собственный код является сборкой UNICODE, Вы не должны будете волноваться об этом много, но в противном случае, думают осторожные относительно кодировки при преобразовании между собственными строками и.Net Strings.
  • C++ не соблюдает [Условное выражение ("Отладка")], означая ту Отладку. Утверждайте, Отладка. Трассировку и т.д. также назовут в сборках конечных версий. Используйте традиционные макросы C++ вместо этого.
  • 64-разрядная поддержка: .NET по умолчанию генерирует 32 или 64-битный код в зависимости от платформы, но Ваш собственный код, вероятно, будет 32-разрядным только...
1
ответ дан 9 December 2019 в 22:41
поделиться

Я просто добавлю к тому, что все уже сказали,

pin_ptr wch = PtrToStringChars (строка); (где строкой является Система:: Строка)

станет Вашим другом.

Вы не можете непосредственно включать неуправляемый класс в управляемый класс, но можно поместить указатель на неуправляемый класс и новый он в конструкторе и удалить его в деструкторе.

У меня не было проблем Timo Geusch, упомянутый со смешиванием C++ и C++ / код CLI в одном DLL. Мой DLL использует обоих экстенсивно без проблем.

C++ / CLI не является трудным (если Вы знаете C++ и.NET), и работает отлично.

1
ответ дан 9 December 2019 в 22:41
поделиться

Это довольно просто и работает хорошо. Это намного легче, чем PInvoke.

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

Кроме того, не упустите объектное время жизни. Легко представить утечки памяти, так как многие программисты.NET не привыкли к чистке после себя. Удостоверьтесь любые классы обертки, которые Вы создаете, доступны, если они содержат указатели и удостоверяются, что Вы избавляетесь от них в своем управляемом коде. Синтаксис для IDisposable в управляемом С++ является также странным, но это находится в документах.

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

Эта статья идет другим путем, но это имеет некоторые полезные точки.

Пользуйтесь нашей библиотекой ManWrap для получения лучшей из.NET в собственном компоненте код C++

См. также

Управляемый код в Visual Studio 2005 и
Удаление управляемых объектов, перенося библиотеку, и больше

2
ответ дан 9 December 2019 в 22:41
поделиться

Для получения дополнительных ответов прочитайте эту превосходную серию сообщений разработчика пользовательского интерфейса Office о том, почему они решили создать новый пользовательский интерфейс для Office 2007. Основные причины сводились к:

  • Старый пользовательский интерфейс на основе панели инструментов уже был переполнен, и не было места для установки новых функций.
  • Пользователям было трудно обнаружить уже имеющиеся функции.
-121--4690671-

Корпорация Майкрософт опубликовала документ по этому вопросу. Я его не читал.

http://download.microsoft.com/download/1/6/f/16fd06b3-7059-4e21-adf4-9fbdcb9a2853/MsftOfficeUIAnsResearch.pdf

-121--4690675-

Как говорили другие: 98% времени он просто работает, его можно и быстро.

То, с чем я не сталкивался до сих пор:

  • Не компилируйте все устаревшие коды c++ как управляемые. Было несколько статей, предлагающих, что это было бы полезно, но обычно это просто медленнее.
  • Не забудьте поймать неуправляемые исключения и вернуть их в управляемые.
  • Если вы используете MFC, обратите внимание, что вы не можете использовать среду выполнения .lib, поэтому вы также будете развертывать среды выполнения MFC.
  • OpenMP (библиотека многопоточности) не будет работать в C + +/CLI.
  • У нас были некоторые проблемы сборки в VS2005, когда мы сделали библиотеку C + +/CLI зависимой от C # dlls из нашего собственного кода.

Это даже сработало настолько хорошо, что я начал писать код C + +/CLI для выполнения единичных тестов кода C++. NUnit/Resharper с радостью найдет и запустит модульный тест в библиотеке DLL C + +/CLI, которая может напрямую вызвать ваш собственный код на ЛЮБОМ УРОВНЕ, даже протестировать ваши классы контейнеров шаблонов.

1
ответ дан 9 December 2019 в 22:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: