2012-10-19 6 views
11

Ich habe das folgende Szenario: Data-Bibliothek in C# als Windows-Laufzeitkomponente kompiliert. Ausnahme beim Versuch, Nullzeichenfolge in C# WinRT-Komponente aus WinJS

Einer der Klassen ist wie folgt aussieht:

public sealed class MyData 
{ 
    string TheGoods { get; private set;} 
} 

Die Benutzeroberfläche ist in WinJS, und ich habe folgende:

var b = dataInstance.theGoods; 

Das Problem ist, dass ich eine Ausnahme und Eigentum erhalten hat folgendes drin:

System.ArgumentNullException bei System.StubHelpers.HStringMarshaler.ConvertToNative (String verwaltet)

Mit Blick auf die Implementierung von HStringMarshaler.ConvertToNative scheint es zu werfen, wenn die Zeichenfolge null ist.

Bedeutet das, dass es unmöglich ist, eine Null-Zeichenfolge für WinJS verfügbar zu machen? Ist das eine WinJS-Einschränkung oder gilt das für alle WinRT?

Während string.Empty funktioniert, ist das nicht semantisch das gleiche wie null und in einigen Fällen ist leer gültig und anders als null.

Wenn ich den Typ der Eigenschaft zu "Objekt" ändern, dann funktioniert es, aber es scheint unangenehm, ein Objekt zu entlarven, wenn es wirklich eine Zeichenfolge sein sollte. Irgendwelche Ideen? Die Dokumente sind ziemlich hell auf diesem

Antwort

13

Der Windows-Laufzeit-Zeichenfolgetyp ist ein Werttyp und hat keinen Nullwert. Die .NET-Projektion verbietet aus diesem Grund das Übergeben einer leeren .NET-Zeichenfolge über die ABI-Grenze von Windows Runtime.

Der von der Windows-Laufzeit verwendete Zeichenfolgetyp ist HSTRING. Während dieser Typ keinen Nullwert hat, hat er eine Null Darstellung (das heißt, in C++ ist HSTRING s = nullptr; gültig). Eine HSTRING mit einer Null-Darstellung ist eine leere Zeichenfolge. Die .NET-Projektion konvertiert diese Nulldarstellung in eine leere Zeichenfolge (String.Empty) für Zeichenfolgen, die von der ABI-Grenze kommen, und verbietet die Ausgabe von tatsächlichen null .NET-Zeichenfolgen über die ABI-Grenze hinaus.

+0

Also für C#, wäre es sicher zu sagen, dass Klassenkonstruktoren die Zeichenfolgen zu string.Empty initialisieren sollten? Es wäre nett, wenn die Dokumente aktualisiert würden, um es zu erwähnen. http://msdn.microsoft.com/en-us/library/windows/apps/br230301.aspx#PassingManaged –

+0

Nun, das hängt davon ab. Der .NET-Zeichenfolgetyp ist immer noch ein Referenztyp und möglicherweise null. Nur wenn eine Zeichenkette über die ABI-Grenze geführt wird, ist NULL nicht zulässig (d. H. Wenn die .NET-Zeichenkette in eine Windows-Laufzeit-HSTRING konvertiert wird). Also, vielleicht gibt es noch Fälle, in denen Null-Strings nützlich sind, Sie müssen nur sicherstellen, Strings zu überprüfen, bevor sie die ABI-Grenze überschreiten. –

+0

Richtig ... also für die Typen, die entweder direkt oder über Schnittstelle an WinRT zurückgegeben werden, sollten Strings als leer initialisiert werden. Danke! –

Verwandte Themen