Udostępnij za pośrednictwem


Jak: Migrowanie do/CLR: czysty (C + +/ CLI)

W tym temacie omówiono problemy mogą wystąpić podczas migracji do czystego MSIL za pomocą /clr:pure (zobacz / CLR (kompilacja wspólnej Language Runtime) Aby uzyskać więcej informacji).W tym temacie założono obecnie przestrzegania kod migrowanego jako mieszanych zestawu za pomocą /clr opcji jako ścieżki migracji z kodu niezarządzanego do czystego MSIL nie jest jeden bezpośredni.Kod niezarządzany, zobacz Jak: Migrowanie 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 instrukcje 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ływane w czystych części MSIL, ale nie zdefiniowano.)

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

Uwagi dotyczące architektury

Niektóre ograniczenia czystych zestawów MSIL wymienionych w Kod czystej i zweryfikowania (C + +/ CLI) wysokiego szczebla dotyczą stosowania strategii projektowania i migracji.Przede wszystkim w przeciwieństwie do zestawów mieszanych czystych zestawów MSIL nie korzystają pełnej zgodności z modułów niezarządzanego.

Czystych zestawów MSIL można wywoływać funkcje niezarządzanego, ale nie można wywołać funkcji niezarządzanego.W wyniku czystego MSIL jest lepiej kandydat kod klienta, który korzysta z funkcji niezarządzanego niż kod serwera, który jest używany przez funkcje niezarządzanego.Jeśli funkcje zawarte w czystej zestawu MSIL używane przez funkcje niezarządzanego mieszany zestaw musi używane jako warstwy interfejsu.

Aplikacje używające 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.

Natomiast czystych zestawów MSIL można wywoływać funkcje niezarządzanego, ta możliwość jest ograniczona do proste funkcje c styl.Wykorzystanie bardziej złożonych API niezarządzanego prawdopodobnie wymagana jest funkcjonalność niezarządzanego narażonych w formie interfejsu COM lub mieszane zespół, który może działać jako interfejs między MSIL czystego i składniki niezarządzanego.Przy użyciu warstwy zestawu mieszany jest jedynym sposobem Użyj funkcje niezarządzanego, używające funkcji wywołania zwrotnego, na przykład jako czysty zestawu nie jest w stanie przewidzieć macierzystych funkcji wpłacone jako wywołania zwrotnego.

Domen aplikacji i konwencji wywołania

Chociaż możliwe jest dla MSIL czystych zestawów używać funkcji niezarządzanego, funkcje i dane statyczne są ukazywane w inny sposób.W czystych zestawów funkcje są realizowane z __clrcall wywołania Konwencji i danych statycznych jest przechowywana domeny dla aplikacji.Różni się ona z domyślnego dla zespołów niezarządzanych i mieszanych, które używają __cdecl konwencji wywoływania funkcji i przechowywania danych statycznych na podstawie każdego procesu.

W kontekście czystego MSIL (i zweryfikowania kod skompilowany z /clr:safe) są przejrzyste, jak te ustawienia domyślne __clrcall jest domyślna konwencja wywołania CLR i domeny aplikacji są macierzystym zakres danych statycznych i globalnych w.NET applications.Gdy relacje z elementów niezarządzanych lub mieszane, funkcji i danych globalnych odmiennego traktowania może spowodować problemy.

Na przykład w przypadku czystego składnika MSIL do wywołania funkcji w bibliotece DLL niezarządzanych lub mieszane, nagłówek pliku dla biblioteki DLL będzie używane do kompilowania zestawu czystych.Jednakże, chyba że wyraźnie wskazane jest konwencja wywołania dla każdej funkcji w nagłówku, one będą wszystkie założyć __clrcall.Później spowoduje awarie runtime, jak te funkcje są prawdopodobnie z __cdecl Konwencji.Funkcje w pliku nagłówkowym niezarządzanego może być wyraźnie oznaczony jako __cdecl, lub całego kodu źródłowego DLL musi ponownie skompilowana, pod /clr:pure.

Podobnie, wskaźników funkcji są przyjmowane jako wskaż __clrcall funkcje pod /clr:pure kompilacji.Te zbyt musi być wyraźnie oznaczone poprawne konwencję wywołania.

Aby uzyskać więcej informacji, zobacz Domen aplikacji i Visual C++.

Łączenie ograniczenia

Program łączący Visual C++ nie będzie próbował połączyć pliki OBJ mieszane i czysty, konwencje magazynu zakresu i telefonicznej są różne.

Zobacz też

Informacje

Kod czystej i zweryfikowania (C + +/ CLI)