Фоновое приложение C ++ Windows 10 IoT Core, ссылающееся на компонент среды выполнения C #

Я пытаюсь использовать фоновое приложение Windows 10 IoT Core C ++ (на основе заголовка шаблоны MSFT IoT).

Мой сценарий включает создание собственного (C ++) фонового приложения, которое использует существующий управляемый (C #) компонент среды выполнения. Я могу создать такое решение в Visual Studio, и оно отлично компилируется и развертывается на устройстве IoT.

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

Exception thrown at 0x76C92052 in backgroundTaskHost.exe: Microsoft C++ 
exception: Platform::ClassNotRegisteredException ^ at memory location 
0x02B0F4A8. HRESULT:0x80040154 Class not registered

WinRT information: Class not registered

Stack trace:
[External Code]
backgroundapplicationcpp.dll!BackgroundApplicationCpp::StartupTask::
[Windows::ApplicationModel::Background::IBackgroundTask]::Run
(Windows::ApplicationModel::Background::IBackgroundTaskInstance ^ 
taskInstance) Line 13

Частью обещания среды выполнения Windows является взаимодействие языков (C ++, C #, JS, VB) ... этот сценарий отлично работает со стандартным приложением UWP вместо фонового приложения IoT.

Как этот сценарий может работать для фоновых приложений ???


person Brian Fjeldstad    schedule 02.09.2016    source источник


Ответы (1)


Часть целевой системы Visual Studio, которая обрабатывает фоновые приложения, обрабатывает каждую библиотеку в проекте так, как если бы она была на том же языке (C ++), что и фоновое приложение.

В этом случае управляемый компонент среды выполнения рассматривается как компонент C ++. Из-за этого библиотеки .NET не включаются в развертывание.

Следующая версия Visual Studio должна содержать исправление для этого, но до тех пор я добавил это в vcxproj моего фонового приложения:

<!-- Workaround for bug in MSBuild regarding Native Background Applications referencing Managed Conponents -->
<PropertyGroup>
  <CopyNuGetImplementations>true</CopyNuGetImplementations>
  <NuGetRuntimeIdentifier>win10-$(PlatformTarget.ToLower())</NuGetRuntimeIdentifier>
</PropertyGroup>
<Target Name="_LocalResolvePrimaryProjectWinmdFiles" BeforeTargets="BeforeGenerateAppxManifest" AfterTargets="_ResolvePrimaryProjectWinmdFiles" Condition="'$(OutputType)' != 'exe' and '$(AppxPackage)' == 'true' AND '$(ContainsStartupTask)' == 'true'">
  <ItemGroup>
    <_AppxWinmdFilesToHarvest Remove="@(_AppxWinmdFilesToHarvest)" />
    <_AppxWinmdFilesToHarvest Include="@(PackagingOutputs)" Condition="'%(PackagingOutputs.Extension)' == '.winmd' and '%(PackagingOutputs.ProjectName)' == '$(ProjectName)' and '%(PackagingOutputs.ResolvedFrom)' != 'GetSDKReferenceFiles'">
      <!-- This covers the Managed Background Application winmd which does NOT have a WinMDFileType value set -->
      <ImageRuntime Condition="'$(PrimaryProjectWinmdImageRuntimeOverride)' == ''">WindowsRuntime 1.4;CLR v4.0.30319</ImageRuntime>
      <!-- This covers the C++ Background Application winmd which does NOT have a WinMDFileType value set -->
      <ImageRuntime Condition="'$(PrimaryProjectWinmdImageRuntimeOverride)' == '' and '@(Language)' == 'C++'">WindowsRuntime 1.4</ImageRuntime>
      <!-- This covers Managed Windows Runtime Component winmds -->
      <ImageRuntime Condition="'$(PrimaryProjectWinmdImageRuntimeOverride)' == '' and '%(PackagingOutputs.WinMDFileType)' == 'Managed'">WindowsRuntime 1.4;CLR v4.0.30319</ImageRuntime>
      <!-- This covers Native Windows Runtime Component winmds -->
      <ImageRuntime Condition="'$(PrimaryProjectWinmdImageRuntimeOverride)' == '' and '%(PackagingOutputs.WinMDFileType)' == 'Native'">WindowsRuntime 1.4</ImageRuntime>
      <!-- This covers Native Windows Runtime Component winmds for DynamicLibrary projects -->
      <ImageRuntime Condition="'$(PrimaryProjectWinmdImageRuntimeOverride)' == '' and '%(PackagingOutputs.ProjectType)' == 'DynamicLibrary'">WindowsRuntime 1.4</ImageRuntime>
      <!-- This provides an override -->
      <ImageRuntime Condition="'$(PrimaryProjectWinmdImageRuntimeOverride)' != ''">$(PrimaryProjectWinmdImageRuntimeOverride)</ImageRuntime>
    </_AppxWinmdFilesToHarvest>
  </ItemGroup>
</Target>

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

person Brian Fjeldstad    schedule 02.09.2016