Fehlerbehebung bei Native Modules
Architekturbewertung erforderlich: Diese Dokumentation wurde zur Unterstützung der Entwicklung gegen die "alte" oder "Legacy"-Architektur von React Native geschrieben. Sie ist möglicherweise nicht direkt auf die Entwicklung mit der neuen Architektur anwendbar und muss überprüft und möglicherweise aktualisiert werden. Informationen zu React Native-Architekturen in React Native Windows finden Sie unter Neu vs. Alt Architektur.
Die neuesten Informationen zur nativen Entwicklung unter Windows finden Sie unter Native Plattform: Übersicht.
Sie haben ein neues natives Modul oder eine neue Methode zu einem Modul hinzugefügt, aber es funktioniert nicht. Was nun?!
Häufige Probleme
Meine native Methode wird im VS-Debugger nicht aufgerufen
Ein möglicher Grund, warum eine Methode nicht aufgerufen wird, ist eine Diskrepanz zwischen den erwarteten und den tatsächlichen Typen, die Ihre Methode akzeptiert/zurückgibt.
Um zu debuggen, was den Aufruf ablehnt, setzen Sie einen Haltepunkt in facebook::react::CxxNativeModule::invoke. Dieser Haltepunkt wird wahrscheinlich oft getroffen (jedes Mal, wenn ein Aufruf an eine native Methode erfolgt), daher möchten wir sicherstellen, dass wir nur dann anhalten, wenn *unsere* interessierende Methode beteiligt ist.
Klicken Sie mit der rechten Maustaste auf den Haltepunkt, um eine Bedingung hinzuzufügen. Nehmen wir an, die Methode, an der Sie interessiert sind, heißt getString. Die Bedingung für den bedingten Haltepunkt sollte den Namen der Methode mit dieser Zeichenfolge vergleichen: strcmp(method.name._Mypair._Myval2._Bx._Ptr, "getString")==0
Kompilierungsfehler 'XamlMetaDataProvider': ist kein Mitglied von 'winrt::MyModuleName'
Error C2039 'XamlMetaDataProvider': is not a member of 'winrt::MyModuleName'
Error C2039 'MyModuleName_XamlTypeInfo': is not a member of 'winrt::MyModuleName'
Dies kann passieren, wenn Ihr Modul XAML-Markup enthält und Sie die XAML-Typinformationen nicht aus Ihrer C++-App referenzieren. Um dies zu beheben, fügen Sie Ihrer C++-App-pch.h-Datei Folgendes hinzu:
#include <winrt/MyModuleName.MyNamespaceName_XamlTypeInfo.h>
(normalerweise sind MyModuleName und MyNamespaceName gleich, Sie können dies im Eigenschaftenfenster des C#-Projekts unter Root-Namespace überprüfen).
App stürzt beim Versuch ab, die C#-Komponente zu laden oder eine ihrer Typen zu instanziieren
Fehler 0x80131040 "Die Manifestdefinition der gefundenen Assembly stimmt nicht mit der Assemblyreferenz überein"
C++-Apps, die native Module in C# verwenden, erfordern besondere Sorgfalt. Es gibt einen Fehler in der Interoperabilität zwischen C# und C++: https://github.com/microsoft/dotnet/issues/1196.
Die Symptome sind, dass das Erstellen der App problemlos funktioniert, aber die C++-App zur Laufzeit abstürzt, wenn versucht wird, das C#-Modul mit dem Fehler 0x80131040: Die Manifestdefinition der gefundenen Assembly stimmt nicht mit der Assemblyreferenz überein. zu laden.
Eine Ausarbeitung des Problems finden Sie hier.
Ab RNW 0.62 können Sie eine Eigenschaft ConsumeCSharpModules in Ihrer C++-App aktivieren, um das Problem zu beheben
- Setzen Sie diese Eigenschaft in Ihrer .vcxproj-Datei innerhalb von
<PropertyGroup Label="ReactNativeWindowsProps">
<PropertyGroup Label="ReactNativeWindowsProps">
<ReactNativeWindowsDir Condition="'$(ReactNativeWindowsDir)' == ''">$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), 'node_modules\react-native-windows\package.json'))\node_modules\react-native-windows\</ReactNativeWindowsDir>
+ <ConsumeCSharpModules>true</ConsumeCSharpModules>
</PropertyGroup>
Wenn der obige Workaround nicht funktioniert, können Sie zwei weitere (ältere) Workarounds ausprobieren
- Stellen Sie die Ziel-Windows-Version Ihrer C#-Komponente auf Windows 10 Version 1703 (Build 15063) oder niedriger ein.
- Referenzieren Sie die .NET Native NuGet-Pakete in Ihrer C++-App
- Klicken Sie mit der rechten Maustaste auf die .vcxproj-Datei der App → NuGet-Pakete verwalten.
- Suchen Sie nach
Microsoft.Net.Native.Compilerund installieren Sie es. - Fügen Sie dann die folgenden Eigenschaften zur .vcxproj-Datei hinzu
<PropertyGroup> <UseDotNetNativeToolchain Condition="'$(Configuration)'=='Release'">true</UseDotNetNativeToolchain> <DotNetNativeVersion>2.2.3</DotNetNativeVersion> </PropertyGroup>
Zusätzliche Ressourcen
Weitere Informationen und Fehlerbehebungshinweise finden Sie in den folgenden Artikeln