2012-05-02 10 views
5

Zauważyłem, że większość (wszystkie?) .winmd pliki mają wersję 255.255.255.255 jak:Co oznacza wersja 255.255.255.255 dla plików winmd?

Windows Version = 255.255.255.255, Culture = neutral, TokenKluczaPublicznego = null

Aplikacje metra mają odniesienie do takich złożeń z tym numerem wersji.


Ponadto sama Windows.winmd odniesienia:

mscorlib, wersja = 255.255.255.255, Kultura = neutralne TokenKluczaPublicznego = b77a5c561934e089

Jednak zespół tego numeru wersji nie istnieją, o ile wiem.

Czy ten numer wersji ma specjalne znaczenie? Czy jest jakaś dokumentacja do tego?

+0

@HenkHolterman - Tak, ale co to oznacza? Czy ma jakieś specjalne znaczenie? – logicnp

+0

Prawdopodobnie wybrał numer wersji, który nie ma znaczenia dla rozwoju, i użyje prawdziwego, jeśli chodzi o wydanie. Być może uniemożliwić [powtórzenie systemu Windows 3.95] (http://blogs.msdn.com/b/oldnewthing/archive/2004/02/13/72476.aspx)? –

+0

@ ta.speot.is: Nie, jest to liczba arbitralna. To mogło być cokolwiek. –

Odpowiedz

8

Zespoły ECMA 335 muszą mieć numer wersji. Jednak algorytm rozwiązywania typu środowiska wykonawczego systemu Windows nie używa numeru wersji, więc zespół tworzący format winmd wybrał arbitralny numer wersji 255.255.255.255 dla numeru wersji zespołu.

Pomaga to zagwarantować, że nikt nie będzie próbował użyć algorytmu rozdzielczości typu .Net podczas wykonywania rozdzielczości typu (nie jest doskonały, niestety niektóre narzędzia nadal używają algorytmu rozdzielczości typu .Net).

No i odniesienie mscorlib jest pro-forma referencyjna - ECMA 335 wymaga, aby wszystkie typeref mają odpowiednią assemblyref i format pliku WINMD postanowiła wykorzystać typerefs ECMA 335 do niektórych typów jako wskaźniki określonego typu. Na przykład konstrukcja "enum" winrt jest reprezentowana jako typ rozszerzający "System.Enum" - dla pliku winmd część "System.Enum" jest po prostu ciągiem znaków (mogło to być cokolwiek) i nie można go rozwiązać prawdziwy typ. Ten ciąg jest reprezentowany w metadanych jako typeref, a typerefs musi mieć assemblyref - zdecydowaliśmy się użyć wersji mscorlib System.Enum jako assemblyref dla wyliczenia, ponieważ było to wygodne.

+0

Btw, jeśli kiedykolwiek zobaczysz komentarz, że plik .winmd "musi być silny o nazwie", oznacza to, że używasz zestawu narzędzi, który rozumie zespoły .Net, ale nie zawiera metadanych środowiska wykonawczego Windows. –

3

Należy pamiętać, że pliki .winmd zawierają metadane dla interfejsów WinRT. System Windows nie może założyć, że używana będzie jakaś konkretna wersja .NET. Windows 8 będzie trwał znacznie dłużej niż .NET 4.5

Nie można również założyć, że projekt .NET będzie działał na jakiejś konkretnej wersji systemu Windows. Powinien działać równie dobrze na Windows 8 jak na Windows 10.

Tak więc interpretuj 255.255.255.255 jako "dowolną wersję".

+0

Ma to sens. Ale czy interfejsy WinRT same się nie zmienią w miarę upływu czasu, więc myślę, że lepiej byłoby nadać plikom winmd wyraźny numer wersji. – logicnp

+0

Wersje WinRT działają inaczej. Nie wiem w jaki sposób, wspomniano "jest inaczej" podczas sesji konferencji Build, ale bez dalszych wyjaśnień. –

+0

@HansPassant: każdy typ środowiska wykonawczego systemu Windows ma funkcję Windows.Foundation.Atrybut Metadata.VersionAttribute wskazujący wersję, w której wprowadzono typ. –