3

Windows 10 IoT 핵심 C++ 배경 응용 프로그램 (the MSFT IoT templates 기반)을 사용하려고합니다.Windows 10 IoT 핵심 C++ 배경 응용 프로그램을 C# 런타임 구성 요소를 참조하는 경우

내 시나리오에는 기존 관리되는 (C#) 런타임 구성 요소를 활용하는 네이티브 (C++) 백그라운드 응용 프로그램 만들기가 포함됩니다. 나는 Visual Studio에서 그런 솔루션을 만들 수 있으며 컴파일하고 IoT 장치에 배포 할 수 있습니다. , Windows 런타임의 약속의

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 

부분은 언어 (C++, C#을의 상호 운용성이다 : 나는 응용 프로그램을 실행할 때

그러나, 나는 관리되는 구성 요소를 사용하는이 언제나 같은 런타임 예외를 참조 JS, VB) ...이 시나리오는 IoT 백그라운드 응용 프로그램 대신 표준 UWP 응용 프로그램에서 잘 작동합니다.

이 시나리오는 백그라운드 응용 프로그램에서 어떻게 작동합니까?

답변

3

백그라운드 응용 프로그램을 처리하는 Visual Studio 대상 시스템의 일부는 백그라운드 응용 프로그램과 동일한 언어 (C++) 인 것처럼 프로젝트의 모든 라이브러리를 처리합니다.

이 경우 관리되는 런타임 구성 요소는 C++ 구성 요소처럼 취급됩니다. 이 때문에 .NET 라이브러리는 배포에 포함되지 않습니다.

비주얼 스튜디오의 다음 버전이에 대한 수정을 포함해야하지만, 그때까지, 내 ​​배경 응용 프로그램의 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> 

, 닷넷 라이브러리와 함께 배포 백그라운드 응용 프로그램과 원시 코드가 관리되는 구성 요소에 성공적으로 액세스 할 수 있습니다.

관련 문제