Udostępnij za pośrednictwem


Porady: migracja do /clr:pure (C++/CLI)

W tym temacie omówiono problemy mogą wystąpić podczas migracji do czystego MSIL za pomocą /clr:pure (patrz /clr (Kompilacja środowiska uruchomieniowego języka wspólnego) uzyskać więcej informacji).W tym temacie założono kod migrowanego obecnie zgodności jako mieszany zestawu za pomocą /clr opcji jako ścieżki migracji z kodu niezarządzanego do czystego MSIL nie jest bezpośrednie jeden.Kod niezarządzany, zobacz Porady: migracja do /clr przed przystąpieniem do migracji do czystego MSIL.

Podstawowe zmiany

Czysty MSIL składa się z instrukcje MSIL więc kod zawierający funkcje, które nie mogą być wyrażone w MSIL uniemożliwi kompilacji.Obejmuje to funkcje zdefiniowane jako inne niż przy użyciu konwencji wywoływania __clrcall. (Funkcji __clrcall nie może być wywoływany w składniku MSIL czystego, ale nie zdefiniowany.)

W celu zapewnienia bez błędów czasu wykonywania, należy włączyć ostrzeżenie C4412.Włączyć przez dodanie C4412 #pragma warning (default : 4412) do każdego compiland, który można skompilować z /clr:pure i który przekazuje typy języka C++ do i z IJW (/clr) lub kodu macierzystego.Aby uzyskać więcej informacji, zobacz Ostrzeżenie kompilatora (poziom 2) C4412.

Uwagi dotyczące architektury

Niektóre ograniczenia czystych zestawów MSIL wymienionych w Kod czysty i weryfikowalny (C++/CLI) wysokiego poziomu dotyczą strategii migracji i projektowania aplikacji.W szczególności w przeciwieństwie do zestawów mieszanych, czystych zestawów MSIL nie korzystają z pełnej zgodności z modułami niezarządzanego.

Czyste zestawy MSIL można wywoływać funkcje niezarządzanych, ale nie może być wywoływana przez funkcje niezarządzanych.W rezultacie czystego MSIL jest lepszym kandydatem kod klienta, który używa funkcji niezarządzanych niż kod serwera, który jest używany przez funkcje niezarządzanego.W przypadku funkcji zawartych w czysty zebranie MSIL używane przez funkcje niezarządzanych, mieszany zestaw musi służyć jako warstwy interfejsu.

Aplikacje korzystające z biblioteki ATL i MFC nie są dobrymi kandydatami do migracji do czystego MSIL jako biblioteki te nie są obsługiwane w tej wersji.Podobnie Windows SDK zawiera pliki nagłówków, które nie opracowują pod /clr:pure.

Podczas gdy czystych zestawów MSIL można wywoływać funkcje niezarządzanych, ta możliwość jest ograniczona do proste funkcje stylu C.Wykorzystanie bardziej złożonych niezarządzanych interfejsów API będzie prawdopodobnie wymagana jest funkcjonalność niezarządzanych będzie widoczna w postaci interfejsu COM lub mieszany zestaw, który może działać jako interfejs między MSIL czystego i składnik niezarządzany.Przy użyciu warstwy mieszany zestaw jest jedynym sposobem zastosowania niezarządzanych funkcje, których funkcji wywołania zwrotnego, na przykład jako czysty zebranie nie ma możliwości macierzystych funkcji wpłacone do wykorzystania jako wywołanie zwrotne.

Domeny aplikacji i konwencje telefonicznej

Choć jest możliwe dla czystego MSIL zespoły używać funkcji niezarządzanych, funkcje i dane statyczne są traktowane odmiennie.W czystych zestawów funkcje są implementowane przy użyciu __clrcall wywołanie Konwencji i danych statycznych jest przechowywana domeny aplikacji.To różni się od domyślnego niezarządzanych i mieszanych zestawów, które używają __cdecl konwencji wywoływania funkcji i przechowywać dane statyczne na podstawie poszczególnych procesów.

W kontekście czystego MSIL (i sprawdzalne kod skompilowany z /clr:safe) te wartości domyślne są przezroczyste, jako __clrcall jest domyślna konwencja wywołania CLR i domeny aplikacji są macierzystym zakres danych statycznych i globalnych w aplikacjach .NET.Jednak gdy relacje z elementów niezarządzanych lub mieszane, odmiennego traktowania funkcji i danych globalnych może powodować problemy.

Na przykład w przypadku czystego składnika MSIL wywołanie funkcji w bibliotece DLL niezarządzanych lub mieszane, pliku nagłówka dla biblioteki DLL posłuży do kompilowania czystego zestawu.Jednak, chyba, że wyraźnie wskazane jest konwencja wywołania dla każdej funkcji w nagłówku, one wszystkie zakłada się __clrcall.Później spowoduje błędy czasu wykonywania, jak te funkcje są narażone realizowane z __cdecl Konwencji.Funkcje w pliku nagłówka niezarządzanego może być wyraźnie oznaczony jako __cdecl, lub cały kod źródłowy DLL musi być ponownie kompilowana pod /clr:pure.

Podobnie, wskaźników funkcji są uznawane za wskaż __clrcall pod kontrolą /clr:pure kompilacji.Te zbyt musi być jawnie odnotowany z poprawną konwencję wywołania.

Aby uzyskać dodatkowe informacje, zobacz Domeny aplikacji i program Visual C++.

Łączenie ograniczenia

Linker Visual C++ nie będzie próbował połączyć pliki OBJ mieszane i czysty, ponieważ przechowywania Konwencji zakres i telefonicznej są różne.

Zobacz też

Informacje

Kod czysty i weryfikowalny (C++/CLI)