Как мне скомпилировать код C ++ / CLI для Silverlight? - PullRequest
4 голосов
/ 20 ноября 2010

У меня есть библиотека C ++ / CLI, которую я хотел бы использовать в приложении Silverlight.Предполагается, что можно написать код для Silverlight на любом языке .NET, но до сих пор я только разработал, как компилировать C #.Silverlight, похоже, не может использовать библиотеки DLL, скомпилированные для .NET.

Я использую Visual Studio 2010 и Silverlight 4. Единственные новые проекты, доступные для Silverlight, - это проекты на C #.Перенос кода на C # не является практичным вариантом.

Как скомпилировать код C ++ / CLI для Silverlight?

Ответы [ 5 ]

10 голосов
/ 21 ноября 2010

Я думаю, что я получил проект библиотеки классов C ++ / CLI VS2010 для сборки со ссылками (только) на сборки Silverlight.

Обновление

Хорошо, возможно . Но это не приятно .

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

  • Установите для вашего проекта C ++ / CLI "Common Language Runtime Support" значение /clr:safe
  • Далее, в разделе Ссылки удалите все ссылки.
  • Далее, в свойствах проекта C ++ / CLI, в C ++> Командная строка введите /d1clr:nomscorlib /FU"C:\Program Files (x86)\Microsoft Silverlight\4.0.50917.0\mscorlib.dll"
  • Теперь сохраните проект и выйдите из Visual Studio. Откройте .vcxproj в текстовом редакторе и измените настройку версии платформы. Вы хотите, чтобы он был таким же, как проект C # Silverlight:

    <TargetFrameworkIdentifier>Silverlight</TargetFrameworkIdentifier> <TargetFrameworkVersion>v4.0</TargetFrameworkVersion> <SilverlightVersion>$(TargetFrameworkVersion)</SilverlightVersion>

  • Теперь снова откройте Visual Studio и соберите проект. Вы получите ошибку, потому что компилятор автоматически сгенерировал файл с #using<mscorlib>, и путь поиска сначала находит версию .NET Framework.

    Silverlight,Version=v4.0.AssemblyAttributes.cpp(1): fatal error C1197: cannot reference 'c:\windows\microsoft.net\framework\v4.0.30319\mscorlib.dll' as the program has already referenced 'c:\program files (x86)\microsoft silverlight\4.0.50917.0\mscorlib.dll'

  • Дважды щелкните ошибку, чтобы открыть автоматически сгенерированный файл. Замените ссылку без пути, например, на (здесь вы помещаете свои ссылки, а не в свойствах проекта)

    #using <c:\program files (x86)\microsoft silverlight\4.0.50917.0\mscorlib.dll>

    #using <c:\program files (x86)\microsoft silverlight\4.0.50917.0\System.dll>

    #using <c:\program files (x86)\microsoft silverlight\4.0.50917.0\System.Core.dll>

  • К счастью, компилятор оставляет ваши изменения на месте. Так что вы должны быть хорошими, пока никто не очистит ваш временный каталог.

  • Строительство теперь должно быть успешным.

Затем вам нужно добавить DLL, созданную проектом C ++ / CLI, в ваше приложение Silverlight. Обратите внимание, что вы не можете установить ссылку на проект, потому что VS2010 все еще не убежден, что C ++ / CLI является проектом Silverlight. Таким образом, вам придется просмотреть и добавить ссылку в виде файла сборки. (И он не будет автоматически переключаться между Debug и Release, чтобы соответствовать приложению Silverlight).

Заключительные замечания

Я получил его для запуска пустого приложения Silverlight в режиме отладки и остановки на точке останова в середине кода C ++ / CLI. Также код C ++ / CLI успешно вернул значение в C #, и локальная переменная в C # получила правильное значение. Так что я думаю, что это работает.

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

2 голосов
/ 07 декабря 2011

Бен Фойгт, спасибо за это, у меня это тоже сработало.

Кроме того, если ваш код C ++ делает что-то специфичное для языка C ++ (т.е. не полностью переносимое по IL), например, используя семантику стека для массива, вы получите следующую ошибку:

could not find assembly 'Microsoft.VisualC.dll' etc.

Если вы перекомпилируете с полной версией .NET Framework, а затем сбросите код IL, вы найдете ссылки на "''. $ ArrayType $$$ BY06 $$ CB_W modopt" или что-то подобное. Это говорит вам, где изменить код.

Я обнаружил, что после того, как я установил Silverlight SDK, и он был добавлен в "\ Program Files (x86) \ Reference Assemblies", мне не нужно было проходить все шаги Бена Фойгта, достаточно просто изменить файл проекта.

Еще одно примечание, вы также можете использовать:

<TargetFrameworkProfile>WindowsPhone71</TargetFrameworkProfile>

, если вы хотите настроить таргетинг на Windows Phone (сначала установите SDK).

1 голос
/ 20 ноября 2010

Silverlight не является такой мощной платформой разработки, как .NET, которая тесно интегрирована с операционной системой.Во-первых, предполагается, что silverlight работает в любой операционной системе, поэтому в Silverlight нет выбора Native API.

Silverlight также не полностью поддерживает MSIL, поэтому при его компиляции и перекомпиляции возникает много проблем.на уровне IL.

Можете ли вы рассказать подробнее о том, какой у вас код C ++ / CLI?Большинство богатых интернет-приложений (цель Silverlight) не включают в себя какие-либо высокопроизводительные вычисления, вместо этого они представляют собой простые простые альтернативы HTML + JS.Для мощной графики вы можете использовать поддержку PixelShadder от Silverlight.

Reflector

В качестве альтернативы вы можете скомпилировать C ++ / CLI в обычную .NET DLL, использовать Reflectorчтобы разобрать и сгенерировать исходный код C # из вашей dll, он может быть не идеален, но большая часть вашей логики будет преобразована обратно в C #.

1 голос
/ 20 ноября 2010

Silverlight не поддерживает собственные библиотеки C ++ и сценарии P / Invoke из-за проблем безопасности.Если ваша библиотека чистая .Net, вы можете декомпилировать ее с помощью ILDASM и перекомпилировать для Silverlight с ILASM.

0 голосов
/ 30 января 2014

Мне удалось решение Бена Фойгта работать с некоторыми незначительными изменениями в Visual Studio 2013 Вот что я сделал по-другому.

  • Выгрузите проект Silverlight, в который вы хотите сослаться. Щелкните правой кнопкой мыши и выберите команду edit project.csproj
  • Скопируйте настройки целевой структуры. Для меня это было

    <TargetFrameworkIdentifier>Silverlight</TargetFrameworkIdentifier>
    <TargetFrameworkVersion>v5.0</TargetFrameworkVersion>
    <SilverlightVersion>$(TargetFrameworkVersion)</SilverlightVersion>
    
  • Для переключателя компилятора /d1clr:nomscorlib Это не сработало для меня. Также ссылка на mscorlib для silverlight была автоматически добавлена ​​к выполненному выводу без указания ее в параметрах командной строки. Вот как я обошел это.

  • Открыть проект в Просто деомпилировать

  • Загрузить плагин редактора сборки

  • Перейдите по дереву к ссылкам

  • Удалите ссылку на mscorlib без Silverlight из меню reflexil.

  • Щелкните правой кнопкой мыши верхний уровень дерева для сборки и сохраните как в меню reflexil.

Я не тестировал все функции, но те, которые я тестировал до сих пор, работали как ожидалось.

Спасибо, Бен, твой пост сэкономил мне много времени. Я думал, что мне нужно будет перенести мою библиотеку:)

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