Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом разделе описывается процесс добавления простого компонента C# в проект C++/WinRT.
Visual Studio позволяет легко создавать и развертывать собственные пользовательские типы среды выполнения Windows в проекте компонента среды выполнения Windows (WRC), написанном с помощью C# или Visual Basic, а затем ссылаться на этот WRC из проекта приложения C++ и использовать эти пользовательские типы из этого приложения.
Внутренние типы среды выполнения Windows могут использовать любые функции .NET, которые разрешены в приложении UWP.
Замечание
Более подробную информацию см. в компонентах среды выполнения Windows на C# и Visual Basic и .NET для приложений UWP.
Внешне, члены вашего типа могут предоставлять только типы среды выполнения Windows для параметров и возвращаемых значений. При сборке решения Visual Studio создает проект WRC .NET, а затем выполняет шаг сборки, создающий файл метаданных Windows (WINMD). Это компонент среды выполнения Windows (WRC), который Visual Studio включает в приложение.
Замечание
.NET автоматически сопоставляет некоторые часто используемые типы .NET, такие как примитивные типы данных и типы коллекций, с эквивалентами среды выполнения Windows. Эти типы .NET можно использовать в общедоступном интерфейсе компонента среды выполнения Windows и будут отображаться пользователями компонента в качестве соответствующих типов среды выполнения Windows. См. компоненты среды выполнения Windows с C# и Visual Basic.
Предпосылки
- Windows 10
- Microsoft Visual Studio
Создание пустого приложения
В Visual Studio создайте новый проект, используя шаблон проекта пустого приложения (C++/WinRT). Убедитесь, что используете шаблон (C++/WinRT), а не шаблон (Универсальная Windows).
Задайте имя нового проекта CppToCSharpWinRT, чтобы структура папок соответствовала пошаговому руководству.
Добавление компонента среды выполнения Windows C# в решение
В Visual Studio создайте проект компонента: в обозревателе решений откройте контекстное меню для решения CppToCSharpWinRT и выберите Добавить, а затем выберите Создать проект, чтобы добавить новый проект C# в решение. В разделе установленные шаблоны диалогового окна «Добавление нового проекта» выберите Visual C#, затем Windowsи Universal. Выберите шаблон компонента среды выполнения Windows (Universal Windows) и введите SampleComponent для имени проекта.
Замечание
В диалоговом окне Новый проект универсальной платформы Windows выберите Windows 10 Creators Update (10.0; Сборка 15063) в поле "Минимальная версия". Для получения дополнительной информации см. раздел Минимальная требуемая версия приложения ниже.
Добавление метода GetMyString на C#
В проекте SampleComponent измените имя класса с Class1 на Example. Затем добавьте два простых члена в класс, частное поле int
и метод экземпляра с именем GetMyString:
public sealed class Example { int MyNumber; public string GetMyString() { return $"This is call #: {++MyNumber}"; } }
Замечание
По умолчанию класс помечается общедоступным запечатанным. Все классы среды выполнения Windows, предоставляемые компонентом, должны быть запечатаны.
Замечание
Необязательно. Чтобы включить IntelliSense для новых добавленных участников, в обозревателе решений откройте контекстное меню проекта SampleComponent, а затем выберите Сборка.
Ссылка на пример C# SampleComponent из проекта CppToCSharpWinRT
В Проводнике решений в проекте C++/WinRT откройте контекстное меню для Ссылки, а затем выберите Добавить ссылку, чтобы открыть диалоговое окно Добавить ссылку. Выберите проекты, а затем выберите решение. Установите флажок для проекта SampleComponent и нажмите кнопку ОК, чтобы добавить ссылку.
Замечание
Необязательно. Чтобы включить IntelliSense для проекта C++/WinRT, в программе "Проводник решений" щелкните правой кнопкой мыши по проекту CppToCSharpWinRT, а затем выберите Сборка.
Измените MainPage.h
Откройте MainPage.h
в проекте CppToCSharpWinRT, а затем добавьте два элемента. Сначала добавьте #include "winrt/SampleComponent.h"
в конце инструкций #include
, а затем поле winrt::SampleComponent::Example
в структуру MainPage
.
// MainPage.h
...
#include "winrt/SampleComponent.h"
namespace winrt::CppToCSharpWinRT::implementation
{
struct MainPage : MainPageT<MainPage>
{
...
winrt::SampleComponent::Example myExample;
...
};
}
Замечание
В Visual Studio MainPage.h
перечислены в разделе MainPage.xaml
.
Измените MainPage.cpp
В MainPage.cpp
измените реализацию Mainpage::ClickHandler
, чтобы вызвать метод C# GetMyString
.
void MainPage::ClickHandler(IInspectable const&, RoutedEventArgs const&)
{
//myButton().Content(box_value(L"Clicked"));
hstring myString = myExample.GetMyString();
myButton().Content(box_value(myString));
}
Запуск проекта
Теперь вы можете создать и запустить проект. При каждом нажатии кнопки число в кнопке будет увеличиваться.
Подсказка
В Visual Studio создайте проект компонента. В обозревателе решений откройте контекстное меню для проекта CppToCSharpWinRT и выберите Свойства, а затем выберите отладку в разделе Свойства конфигурации. Установите тип отладчика на Управляемый и Собственный, если вы хотите отлаживать как код C# (управляемый), так и C++ (собственный).
свойств отладки C++
Минимальная версия приложения
Минимальная версия приложения
Подсказка
Рекомендуем использовать минимальные версии приложений ниже 16299, чтобы избежать дополнительной конфигурации сборки, если поддержка .NET Standard 2.0 или Arm64 не является необходимой.
Настройка для Windows 10 Fall Creators Update (10.0; Сборка 16299)
Выполните следующие действия, чтобы включить поддержку .NET Standard 2.0 или Windows Arm64 в проектах C#, на которые ссылается проект C++/WinRT.
В Visual Studio перейдите в обозреватель решений и откройте контекстное меню проекта CppToCSharpWinRT. Выберите Свойства и установите Мин. версию универсального приложения Windows на Windows 10 Fall Creators Update (10.0; Сборка 16299) (или более поздней версии). Выполните то же самое для проекта SampleComponent.
В Visual Studio откройте контекстное меню проекта CppToCSharpWinRT и выберите Выгрузить проект, чтобы открыть проект CppToCSharpWinRT.vcxproj
в текстовом редакторе.
Скопируйте и вставьте следующий XML-код в первый PropertyGroup
в CPPWinRTCSharpV2.vcxproj
.
<!-- Start Custom .NET Native properties -->
<DotNetNativeVersion>2.2.12-rel-31116-00</DotNetNativeVersion>
<DotNetNativeSharedLibrary>2.2.8-rel-31116-00</DotNetNativeSharedLibrary>
<UWPCoreRuntimeSdkVersion>2.2.14</UWPCoreRuntimeSdkVersion>
<!--<NugetPath>$(USERPROFILE)\.nuget\packages</NugetPath>-->
<NugetPath>$(ProgramFiles)\Microsoft SDKs\UWPNuGetPackages</NugetPath>
<!-- End Custom .NET Native properties -->
Значения DotNetNativeVersion
, DotNetNativeSharedLibrary
и UWPCoreRuntimeSdkVersion
могут отличаться в зависимости от версии Visual Studio. Чтобы установить их на правильные значения, откройте %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages
и просмотрите вложенный каталог для каждого значения в таблице ниже. В каталоге %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages\Microsoft.Net.Native.Compiler
будет вложенный каталог, содержащий установленную версию .NET Native, которая начинается с 2.2
. В приведенном ниже примере это 2.2.12-rel-31116-00
.
Переменная MSBuild Каталог Пример DotNetNativeVersion %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages\Microsoft.Net.Native.Compiler
2.2.12-rel-31116-00
DotNetNativeSharedLibrary %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages\runtime.win10-x64.microsoft.net.native.sharedlibrary
2.2.8-rel-31116-00
UWPCoreRuntimeSdkVersion %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages\Microsoft.Net.UWPCoreRuntimeSdk
2.2.14
Замечание
Существует несколько поддерживаемых архитектур для Microsoft.Net.Native.SharedLibrary. Замените x64
соответствующей архитектурой. Например, архитектура arm64
будет находиться в каталоге %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages\runtime.win10-arm64.microsoft.net.native.sharedlibrary
.
Затем сразу после первого PropertyGroup
добавьте следующее (без изменений).
<!-- Start Custom .NET Native targets -->
<!-- Import all of the .NET Native / CoreCLR props at the beginning of the project -->
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\Microsoft.Net.UWPCoreRuntimeSdk\$(UWPCoreRuntimeSdkVersion)\build\Microsoft.Net.UWPCoreRuntimeSdk.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x86.Microsoft.Net.UWPCoreRuntimeSdk\$(UWPCoreRuntimeSdkVersion)\build\runtime.win10-x86.Microsoft.Net.UWPCoreRuntimeSdk.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x64.Microsoft.Net.UWPCoreRuntimeSdk\$(UWPCoreRuntimeSdkVersion)\build\runtime.win10-x64.Microsoft.Net.UWPCoreRuntimeSdk.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-arm.Microsoft.Net.UWPCoreRuntimeSdk\$(UWPCoreRuntimeSdkVersion)\build\runtime.win10-arm.Microsoft.Net.UWPCoreRuntimeSdk.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\Microsoft.Net.Native.Compiler\$(DotNetNativeVersion)\build\Microsoft.Net.Native.Compiler.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x86.Microsoft.Net.Native.Compiler\$(DotNetNativeVersion)\build\runtime.win10-x86.Microsoft.Net.Native.Compiler.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x64.Microsoft.Net.Native.Compiler\$(DotNetNativeVersion)\build\runtime.win10-x64.Microsoft.Net.Native.Compiler.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-arm.Microsoft.Net.Native.Compiler\$(DotNetNativeVersion)\build\runtime.win10-arm.Microsoft.Net.Native.Compiler.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-arm64.Microsoft.Net.Native.Compiler\$(DotNetNativeVersion)\build\runtime.win10-arm64.Microsoft.Net.Native.Compiler.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x86.Microsoft.Net.Native.SharedLibrary\$(DotNetNativeSharedLibrary)\build\runtime.win10-x86.Microsoft.Net.Native.SharedLibrary.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x64.Microsoft.Net.Native.SharedLibrary\$(DotNetNativeSharedLibrary)\build\runtime.win10-x64.Microsoft.Net.Native.SharedLibrary.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-arm.Microsoft.Net.Native.SharedLibrary\$(DotNetNativeSharedLibrary)\build\runtime.win10-arm.Microsoft.Net.Native.SharedLibrary.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-arm64.Microsoft.Net.Native.SharedLibrary\$(DotNetNativeSharedLibrary)\build\runtime.win10-arm64.Microsoft.Net.Native.SharedLibrary.props" />
<!-- End Custom .NET Native targets -->
В конце файла проекта непосредственно перед закрывающим тегом Project
добавьте следующее (неизменённым).
<!-- Import all of the .NET Native / CoreCLR targets at the end of the project -->
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x86.Microsoft.Net.UWPCoreRuntimeSdk\$(UWPCoreRuntimeSdkVersion)\build\runtime.win10-x86.Microsoft.Net.UWPCoreRuntimeSdk.targets" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x64.Microsoft.Net.UWPCoreRuntimeSdk\$(UWPCoreRuntimeSdkVersion)\build\runtime.win10-x64.Microsoft.Net.UWPCoreRuntimeSdk.targets" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-arm.Microsoft.Net.UWPCoreRuntimeSdk\$(UWPCoreRuntimeSdkVersion)\build\runtime.win10-arm.Microsoft.Net.UWPCoreRuntimeSdk.targets" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\Microsoft.Net.Native.Compiler\$(DotNetNativeVersion)\build\Microsoft.Net.Native.Compiler.targets" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x86.Microsoft.Net.Native.Compiler\$(DotNetNativeVersion)\build\runtime.win10-x86.Microsoft.Net.Native.Compiler.targets" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x64.Microsoft.Net.Native.Compiler\$(DotNetNativeVersion)\build\runtime.win10-x64.Microsoft.Net.Native.Compiler.targets" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-arm.Microsoft.Net.Native.Compiler\$(DotNetNativeVersion)\build\runtime.win10-arm.Microsoft.Net.Native.Compiler.targets" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-arm64.Microsoft.Net.Native.Compiler\$(DotNetNativeVersion)\build\runtime.win10-arm64.Microsoft.Net.Native.Compiler.targets" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x86.Microsoft.Net.Native.SharedLibrary\$(DotNetNativeSharedLibrary)\build\runtime.win10-x86.Microsoft.Net.Native.SharedLibrary.targets" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x64.Microsoft.Net.Native.SharedLibrary\$(DotNetNativeSharedLibrary)\build\runtime.win10-x64.Microsoft.Net.Native.SharedLibrary.targets" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-arm.Microsoft.Net.Native.SharedLibrary\$(DotNetNativeSharedLibrary)\build\runtime.win10-arm.Microsoft.Net.Native.SharedLibrary.targets" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-arm64.Microsoft.Net.Native.SharedLibrary\$(DotNetNativeSharedLibrary)\build\runtime.win10-arm64.Microsoft.Net.Native.SharedLibrary.targets" />
<!-- End Custom .NET Native targets -->
Перезагрузите файл проекта в Visual Studio. Для этого в обозревателе решений Visual Studio откройте контекстное меню проекта CppToCSharpWinRT и выберите Перезагрузить проект.
Создание приложений с использованием .NET Native
Рекомендуется создавать и тестировать приложение с помощью компонента C#, построенного для .NET Native. В Visual Studio откройте контекстное меню проекта CppToCSharpWinRT и выберите Выгрузить проект, чтобы открыть проект CppToCSharpWinRT.vcxproj
в текстовом редакторе.
Затем задайте для свойства UseDotNetNativeToolchain
значение true
в конфигурациях Release и Arm64 в файле проекта C++.
В обозревателе решений Visual Studio откройте контекстное меню проекта CppToCSharpWinRT и выберите Перезагрузить проект.
<PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Configuration">
...
<UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
</PropertyGroup>
<PropertyGroup Condition="'$(Platform)'=='Arm64'" Label="Configuration">
<UseDotNetNativeToolchain Condition="'$(UseDotNetNativeToolchain)'==''">true</UseDotNetNativeToolchain>
</PropertyGroup>
Ссылка на другие пакеты nuget C#
Если компонент C# ссылается на другие пакеты nuget , файл проекта приложения может потребовать зависимостей файлов списка из пакета nuget в качестве содержимого развертывания. Например, если компонент C# ссылается на пакет Nuget Newtonsoft.Json, то в проекте приложения также следует ссылаться на тот же пакет nuget и зависимость файлов.
В файле SampleComponent.csproj добавьте ссылку на пакет nuget:
<PackageReference Include="Newtonsoft.Json">
<Version>13.0.1</Version>
</PackageReference>
В проекте CppToCSharpWinRT найдите файл packages.config и добавьте соответствующую ссылку на пакет nuget. При этом пакет nuget будет установлен в папку пакета решения.
В packages.configдобавьте ту же ссылку на пакет nuget:
<package id="Newtonsoft.Json" version="13.0.1" targetFramework="native" developmentDependency="true" />
Затем добавьте следующий код в файл проекта приложения, чтобы ссылаться на соответствующую зависимость файла из папки пакета решения. Например, в CppToCSharpWinRT.vcxproj добавьте следующее:
<ItemGroup>
<None Include="..\packages\Newtonsoft.Json.13.0.1\lib\netstandard2.0\Newtonsoft.Json.dll">
<Link>%(Filename)%(Extension)</Link>
<DeploymentContent>true</DeploymentContent>
</None>
</ItemGroup>