2012-10-19 13 views
11

Mam następujący scenariusz: Data lib w C# skompilowany jako składnik środowiska wykonawczego Windows.Wyjątek podczas próby odczytania łańcucha pustego w komponencie C# WinRT z WinJS

Jednym z jego zajęć jest wygląda następująco:

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

UI jest w WinJS i mam następujący:

var b = dataInstance.theGoods; 

Problem polega na tym, że mam wyjątek i obiekcie dodaje się w nim:

System.ArgumentNullException na System.StubHelpers.HStringMarshaler.ConvertToNative (String udało)

Patrząc na implementację HStringMarshaler.ConvertToNative, wydaje się wyrzucać, jeśli ciąg znaków jest pusty.

Czy to oznacza, że ​​nie można wystawić łańcucha pustego na WinJS? Czy to jest ograniczenie WinJS, czy też dotyczy to wszystkich WinRT?

Podczas gdy string.Empty działa, to nie jest semantycznie takie samo jak null, aw niektórych przypadkach puste jest poprawne i inne niż zero.

Jeśli zmienię typ właściwości na "obiekt", to działa, ale wydaje się nieprzyjemne, aby wystawić obiekt, gdy naprawdę powinien być ciągiem. Jakieś pomysły? Dokumenty są dość lekkie na temat tego

Odpowiedz

13

Typ łańcucha wykonawczego Windows jest typem wartości i nie ma wartości null. Projekcja .NET nie zezwala na przekazywanie pustego łańcucha .NET przez granicę Windows Runtime ABI z tego powodu.

Typ ciągu używany przez środowisko wykonawcze systemu Windows to typ HSTRING. Chociaż ten typ nie ma wartości pustej, ma on zerową reprezentację (czyli w C++, HSTRING s = nullptr; jest poprawna). HSTRING z reprezentacją zerową jest pustym ciągiem.

Projekcja .NET konwertuje tę pustą reprezentację na pusty ciąg znaków (String.Empty) dla łańcuchów przychodzących z granicy ABI i zabrania przekazywania rzeczywistych zerowych łańcuchów .NET przez granicę ABI.

+0

Czy dla C# można bezpiecznie powiedzieć, że konstruktory klas powinny zainicjować ciągi znaków do stringów? Byłoby miło, gdyby dokumenty zostały zaktualizowane, aby o tym wspomnieć. http://msdn.microsoft.com/en-us/library/windows/apps/br230301.aspx#PassingManaged –

+0

Cóż, to zależy. Typ ciągu .NET jest nadal typem referencyjnym i może mieć wartość null. Dopiero po przejściu łańcucha znaków na granicy ABI wartość null jest niedozwolona (tzn. Gdy ciąg .NET jest konwertowany na środowisko wykonawcze systemu Windows HSTRING). Być może nadal istnieją przypadki, w których ciągi zerowe są użyteczne, wystarczy sprawdzić ciągi znaków, zanim przekroczą granicę ABI. –

+0

Tak ... dla typów zwracanych do WinRT, bezpośrednio lub za pośrednictwem interfejsu, ciągi powinny być inicjowane jako puste. Dzięki! –