Udostępnij za pośrednictwem


Jak: Migrowanie do/CLR

W tym temacie omówiono problemy pojawiające się podczas kompilowania kodu macierzystego z /clr (zobacz / CLR (kompilacja wspólnej Language Runtime) Aby uzyskać więcej informacji)./clrpozwala wywołać i wywołać z modułów Visual C++.NET zestawów zachowując zgodność z modułów niezarządzanego.Zobacz Mieszane (macierzystych i zarządzanych) i Macierzysty i.NET interoperacyjności więcej informacji na temat korzyści z kompilacji z /clr.

Znane problemy kompilacji biblioteki projektów/CLR

Visual Studio zawiera niektóre znane problemy występujące podczas kompilowania projektów biblioteki z /clr:

  • Kod może zbadać typów w czasie wykonywania, z CRuntimeClass::FromName.Jednakże jeśli typ jest w bibliotece .dll MSIL (skompilowany z /clr), wywołanie CRuntimeClass::FromName może się nie powieść, jeśli występuje przed uruchomieniem konstruktory statyczne w zarządzanych .dll (nie widać problem wywołanie nazwa od sytuacji po kodu została wykonana w zarządzanych .dll).Aby obejść ten problem, można wymusić budowy zarządzanych konstruktora statycznego definiowania funkcji w dll zarządzanych, eksportując je i wywoływanie go z aplikacji MFC macierzystej.Na przykład:

    // Extension DLL Header file:
    __declspec( dllexport ) void EnsureManagedInitialization () {
       // managed code that won't be optimized away
       System::GC::KeepAlive(System::Int32::MaxValue);
    }
    

Kompiluj w języku Visual C++

Przed rozpoczęciem korzystania z /clr na dowolny moduł w projekcie najpierw skompilować i połączyć projekt macierzystych z Visual Studio 2010.

Następujące kroki, w kolejności, zapewnić Najłatwiejszą do /clr kompilacji.Jest ważne, aby skompilować i uruchomić projekt po każdym z tych kroków.

ms173265.collapse_all(pl-pl,VS.110).gifWersje wcześniejsze Visual C++ 2003

Uaktualniania do programu Visual Studio 2010 z wersji wcześniejszej niż Visual C++ 2003, mogą pojawić się błędy kompilatora związane z rozszerzonych zgodność standard C++ w Visual C++ 2003

ms173265.collapse_all(pl-pl,VS.110).gifUaktualnianie z programu Visual C++ 2003

Również najpierw należy zebrać poprzednich projektów z Visual C++ 2003 bez /clr jak Visual Studio teraz zwiększył ANSI/ISO zgodności i niektóre zmiany podziału.Jest prawdopodobnie najbardziej uwagi wymagają zmiany Funkcje zabezpieczeń w CRT.Kod, który używa CRT jest bardzo prawdopodobne, produkować oczekiwany ostrzeżenia.Ostrzeżenia te mogą być pomijane, ale migracja do nowych Wersje funkcji CRT zwiększonych zabezpieczeń jest preferowane, jak zapewnić lepsze zabezpieczenia i może ujawnić problemy dotyczące zabezpieczeń w kodzie.

ms173265.collapse_all(pl-pl,VS.110).gifUaktualnianie z rozszerzenia zarządzane dla języka C++

Projekty z Visual C++.NET lub Visual C++ 2003 i używane rozszerzenia zarządzane dla języka C++ wymaga przynajmniej jedną zmianę ustawień projektu, jak te rozszerzenia są teraz przestarzałe.W rezultacie kod napisany w C++ rozszerzeń zarządzanych nie będzie kompilować pod /clr.Użyj /clr:oldSyntax zamiast.

Konwertuj c kod języka C++

Chociaż Visual Studio będzie kompilować pliki C, należy przekonwertować je na C++ dla /clr kompilacji.Rzeczywiste nazwy pliku nie ma być zmienione. you can use /Tp (see / Tc, /TP /Tp, /TC, (Określ typ pliku źródłowego).) Należy zauważyć, że chociaż pliki kodu źródłowego języka C++ są wymagane dla /clr, nie jest konieczne re-factor kod, aby użyć paradygmatów zorientowane obiektowo.

Kod c jest bardzo prawdopodobne, wymagają zmiany, gdy kompilowany jako plik C++.Zasady bezpieczeństwa typu C++ są ścisłe, tak konwersje typów musi jawnie z poświaty.Na przykład malloc zwraca wskaźnik void, ale może być przypisana do wskaźnika do dowolnego typu c z rzutowania:

int* a = malloc(sizeof(int));   // C code
int* b = (int*)malloc(sizeof(int));   // C++ equivalent

Wskaźników funkcji są również ściśle typ palety w C++, więc następujący kod c wymagają modyfikacji.W języku C++ jest najlepiej jest tworzyć typedef definiuje typ wskaźnika funkcji, a następnie użyć tego typu do oddania wskaźników funkcji:

NewFunc1 = GetProcAddress( hLib, "Func1" );   // C code
typedef int(*MYPROC)(int);   // C++ equivalent
NewFunc2 = (MYPROC)GetProcAddress( hLib, "Func2" );

C++ również wymaga funkcji albo prototyp lub w pełni zdefiniowane przed ich odwołania lub wywoływane.

Identyfikatory używane w kodzie c do słów kluczowych języka C++ (takie jak virtual, new, delete, bool, true, false, itp) muszą być zmienione.Zazwyczaj można to zrobić z proste operacje wyszukiwania i zamieniania.

Wreszcie wywołania COM w stylu języka c wymaga jawnego użycia tabeli v-table i this wskaźnik, C++ nie obsługuje:

COMObj1->lpVtbl->Method(COMObj, args);  // C code
COMObj2->Method(args);  // C++ equivalent

Skonfiguruj ponownie ustawienia projektu

Po projekcie kompiluje i wykonuje w Visual Studio 2010, należy utworzyć nowe konfiguracje projektu dla /clr zamiast modyfikować domyślne konfiguracje./clrjest niezgodny z niektóre opcje kompilatora i tworzenie oddzielnych konfiguracje umożliwia budowanie projektu jako macierzysty lub zarządzany.Gdy /clr jest zaznaczona w polu okna dialogowego właściwości strony, ustawienia projektu nie jest zgodny z /clr są wyłączone (i wyłączone opcje nie były automatycznie przywracane, jeśli /clr jest następnie zaznaczona).

ms173265.collapse_all(pl-pl,VS.110).gifUtwórz nowe konfiguracje projektu

Można użyć Kopiuj ustawienia z opcji w Okno dialogowe konfiguracji dla nowego projektu do tworzenia konfiguracji Projekt, oparty na istniejących ustawień projektu.W tym raz dla konfiguracji debugowania i raz dla wydania konfiguracji.Kolejne zmiany można następnie zastosować do /clr -szczególnych tylko konfiguracje, pozostawiając bez zmian konfiguracji oryginalnego projektu.

Projektów, które używają niestandardowe zasady tworzenia mogą wymagać szczególnej uwagi.

Ten krok ma wpływ różnych projektów, które używają Makefile.W tym przypadku można skonfigurować osobne docelowych kompilacji lub specyficzne dla wersji /clr kompilacji mogą być tworzone kopię oryginału.

ms173265.collapse_all(pl-pl,VS.110).gifZmień ustawienia projektu

/clrmożna wybrać w środowisku projektowym, postępując zgodnie z instrukcjami w / CLR (kompilacja wspólnej Language Runtime).Jak już wspomniano, ten krok zostanie automatycznie wyłączyć powodujące konflikt ustawienia projektu.

[!UWAGA]

Podczas uaktualniania biblioteki zarządzane lub projektu usługi sieci web z programu Visual C++ 2003, /Zl będzie opcja kompilatora, dodaje się wiersza polecenia stronę właściwości.Spowoduje to LNK2001.Usuń /Zl z wiersza polecenia stronę właściwości, aby rozwiązać.Zobacz /ZL (Brak domyślnej nazwy biblioteki) i Jak: Otwórz strony właściwości projektu Aby uzyskać więcej informacji.Dodać do programu łączącego msvcrt.lib i łączona Dodatkowe zależności właściwości.

Zbudowany z Makefile projektów, opcje kompilatora niezgodne należy wyłączyć ręcznie po /clr jest dodawany.Zobacz // CLR ograniczeń informacji na temat opcji kompilatora, które nie są zgodne z /clr.

ms173265.collapse_all(pl-pl,VS.110).gifWstępnie skompilowana nagłówki

Wstępnie skompilowana nagłówki są obsługiwane w ramach /clr.Jednakże jeśli tylko kompilacji niektóre pliki CPP z /clr (reszta jako macierzystej kompilacji) niektóre zmiany będzie wymagana, ponieważ wstępnie skompilowana nagłówki generowane z /clr nie są zgodne z tymi generowane bez /clr.Jest to niezgodności ze względu na fakt, że /clr generuje i wymaga metadanych.Moduły skompilowany /clr zatem nie można użyć wstępnie skompilowanym nagłówki, które nie zawierają metadane, i /clr moduły nie można użyć nagłówka wstępnie skompilowanych plików, które zawierają dane meta.

Najprostszym sposobem kompilowania projektu, w którym niektóre moduły są kompilowane /clr jest całkowicie wyłączyć nagłówki wstępnie skompilowana.(W oknie dialogowym właściwości strony projektu, otwórz węzeł c i C++ i wybierz nagłówki wstępnie skompilowana.Następnie zmień właściwość Utwórz/używanie wstępnie skompilowana nagłówków na "Nie przy użyciu wstępnie skompilowana nagłówki".)

Szczególnie w przypadku dużych projektów, wstępnie skompilowana nagłówki zapewnia jednak znacznie lepszą szybkość kompilacji, więc wyłączenie tej funkcji nie jest pożądane.W takim przypadku najlepiej skonfigurować jest /clr i /clr pliki, aby używać oddzielnych nagłówków wstępnie skompilowana.Można to zrobić w jednym kroku przez multi-selecting moduły, które mają być zestawiane /clr za pomocą Solution Explorer, grupy prawym przyciskiem myszy i wybierając polecenie Właściwości.Następnie zmień utwórz/Użyj PCH za pośrednictwem pliku i plik nagłówka, wstępnie skompilowana właściwości, aby używać innego nagłówka Nazwa pliku i plik PCH odpowiednio.

Naprawianie błędów

Kompilowanie z /clr może spowodować błędy kompilatora, program łączący lub runtime.W tej części omówiono najczęstsze problemy.

ms173265.collapse_all(pl-pl,VS.110).gifMetadane w korespondencji seryjnej

Różne wersje typów danych może spowodować łączący się niepowodzeniem, ponieważ nie pasuje do metadanych generowanych dla dwóch typów.(Jest to zazwyczaj spowodowane członków typu warunkowo są zdefiniowane, ale warunki nie są takie same dla wszystkich plików CPP typie.) W takim przypadku program łączący zawiedzie, zgłoszenie tylko nazwę symbolu i nazwę drugiego pliku OBJ, których typ został zdefiniowany.Często jest to przydatne do rotacyjnej zmiany kolejności, że pliki OBJ są wysyłane do łączący odnajdowanie lokalizacji wersja typu danych.

ms173265.collapse_all(pl-pl,VS.110).gifModuł ładujący Lock zakleszczenia

W programie Visual C++.NET i Visual C++ 2003, inicjowanie pod /clr został wrażliwych-deterministyczny zakleszczenia.Ten problem jest znany jako "zakleszczenia blokady modułu ładującego".W Visual Studio 2010, zakleszczenia, tym łatwiej jest unikać, jest wykrywane i zgłoszone w czasie wykonywania i nie jest już nie deterministyczny.Wystąpią problem blokady modułu ładującego jest nadal możliwe, ale teraz jest znacznie łatwiejsze uniknąć i naprawić.Zobacz Inicjowanie mieszanych zestawów szczegółowe tła, wytycznych i rozwiązań.

ms173265.collapse_all(pl-pl,VS.110).gifWywóz danych

Eksportowanie danych biblioteki DLL jest podatne i nie jest zalecane.Wynika to z sekcji danych biblioteki DLL nie jest gwarantowane zainicjowana, dopóki nie wykonano zarządzanych część biblioteki DLL.Odwołuje się do metadanych z # za pomocą dyrektywy (C++).

ms173265.collapse_all(pl-pl,VS.110).gifWidoczność typu

Typy macierzystym są teraz prywatnych domyślnie.W programie Visual C++.NET 2002 i Visual C++ 2003 macierzysty typy były domyślnie publiczne.Może to spowodować, że typ macierzysty nie jest widoczna na zewnątrz biblioteki DLL.Usunąć ten błąd przez dodanie public do tych typów.Zobacz Widoczność typów i członków Aby uzyskać więcej informacji.

ms173265.collapse_all(pl-pl,VS.110).gifSzybująca punkt i wyrównanie problemów

__controlfpnie jest obsługiwana na common language runtime (zobacz _control87, _controlfp, __control87_2 Aby uzyskać więcej informacji).Środowisko CLR zostanie również nie do Wyrównanie (C++).

ms173265.collapse_all(pl-pl,VS.110).gifInicjowanie COM

Common Language Runtime inicjuje automatycznie COM, gdy moduł jest inicjowany (gdy COM jest inicjowany automatycznie skorzystała jako MTA).Jawne inicjowanie COM daje w wyniku kody powrotne, wskazując, że COM jest już zainicjowany.Próby zainicjowania COM wyraźnie z jednego modelu wątkowości podczas CLR już zainicjowany COM do innego modelu wątkowości może spowodować awarię aplikacji.

Common language runtime uruchamiania MTA COM domyślnie; Użyj / CLRTHREADATTRIBUTE (atrybut Zestaw CLR wątku) Aby zmienić to ustawienie.

ms173265.collapse_all(pl-pl,VS.110).gifProblemy z wydajnością

Mogą być widoczne obniżenie wydajności pośrednio nazywane są generowane w celu MSIL metod macierzystych C++ (wywołania funkcji wirtualnych lub za pomocą wskaźników funkcji).Aby uzyskać więcej informacji na ten temat, zobacz Podwójne pośredniczeniem (C++).

Podczas przenoszenia z macierzystym MSIL, można zauważyć zwiększenie rozmiaru zestawu roboczego.Wynika to z plików wykonywalnych języka wspólnego udostępnia wiele funkcji, aby zapewnić, że programy działać poprawnie.Jeśli Twój /clr aplikacja nie działa poprawnie, można włączyć C4793 (domyślnie wyłączony), zobacz Kompilator ostrzeżenia (poziom 1 i 3) C4793 Aby uzyskać więcej informacji.

ms173265.collapse_all(pl-pl,VS.110).gifProgram awarii przy zamykaniu systemu

W niektórych przypadkach CLR można zamknięcia systemu przed zakończeniem zarządzanego kodu z systemem.Za pomocą std::set_terminate i SIGTERM może to spowodować.Zobacz sygnał stałych i set_terminate (<exception>) Aby uzyskać więcej informacji.

Nowe funkcje programu Visual C++

Po skompiluje aplikacji, łącza i działa można rozpocząć korzystanie z.Funkcje netto w dowolny moduł skompilowany z /clr.Aby uzyskać więcej informacji, zobacz Składnik rozszerzeń dla platform Runtime.

Jeśli użyto rozszerzenia zarządzane dla języka C++, można przekonwertować kodu, aby użyć nowych składni.Podsumowanie różnice składniowe, zobacz Managed Extensions for C++ Syntax Upgrade Checklist.Szczegółowe informacje o konwertowaniu rozszerzenia zarządzane dla języka C++ C + +/ CLI migracji Elementarz.

Aby uzyskać informacje dotyczące.NET Programowanie w języku Visual C++, zobacz:

Zobacz też

Koncepcje

Mieszane (macierzystych i zarządzanych)