Sdílet prostřednictvím


Postupy: Přenos na /clr

Toto téma popisuje problémy, které vznikají při kompilaci nativního kódu s /clr (další informace, viz /clr (Common Language Runtime Compilation). /clr umožňuje modulům Visual C++ vyvolat se a být vyvolán z rozhraní sestavení .NET a přitom zachovat kompatibilitu s nespravovanými moduly. Viz Smíšená (nativní a spravovaná) sestavení a Nativní a vzájemná funkční spolupráce rozhraní .NET další informace o výhodách kompilace s /clr.

Známé problémy kompilace projektů knihovny s /clr

Visual Studio obsahuje některé známé problémy, při kompilaci projektů knihovny s /clr:

  • Váš kód může dotazovat typy za běhu s CRuntimeClass::FromName. Avšak pokud je typ v jazyku MSIL.dll (kompilace s /clr), volání CRuntimeClass::FromName může selhat v případě, že k ní dojde před spuštěním statického konstruktoru ve spravované knihovně dll (neuvidíte tento problém v případě, že FromName volání provedení kódu je ve spravované knihovně DLL). Chcete-li tento problém vyřešit, můžete vynutit konstrukce staticky spravovaného konstruktoru definovaný funkcemi ve spravované knihovně .dll, jeho exportem a vyvoláním ho z nativní aplikace knihovny MFC. Příklad:

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

Kompilace s Visual C++

Před použitím /clr na libovolný modul projektu první kompilace a propojit nativní projektu Visual Studio 2010.

Následující kroky, následované v pořadí poskytují nejjednodušší cestu ke kompilaci /clr. Je to důležité ke kompilaci a spuštění Vašeho projektu po každém z těchto kroků.

Verze předcházející Visual C++ 2003

Pokud provádíte inovaci na Visual Studio 2010 z verze před k Visual C++ 2003, zobrazí rozšířený standard C++ shodu Visual C++ 2003 týkající se chyby kompilátoru

Inovace z aplikace Visual C++ 2003

Předchozí projekty vytvořené pomocí Visual C++ 2003 se také poprvé vypracují bez /clr jako Visual Studio nyní zvýšila ANSI/ISO soulad a některé dodatečné změny. Změna, která bude pravděpodobně vyžadovat největší pozornost je Security Enhancements in the CRT. Kód, který používá CRT velmi pravděpodobně produkuje odmítání upozornění. Tato upozornění mohou být potlačena, ale přenesení do nové Security-Enhanced Versions of CRT Functions je upřednostňována, protože poskytuje lepší zabezpečení a může odhalit problémy bezpečnostní problematiku ve Vašem kódu.

Upgradování ze spravovaných rozšíření jazyka C++

Projekty vytvořené pomocí Visual C++ .NET nebo Visual C++ 2003, které používají Spravované rozšíření jazyka C++ budou vyžadovat alespoň jednu změnu nastavení projektu, jako tyto rozšíření jsou nyní zastaralá. V důsledku toho nebude kód zapsaný se Spravovaným rozšířením jazyka C++ chtít kompilaci menší než /clr. Použití /clr:oldSyntax namísto.

Převedení kódu jazyka C do jazyka C++

Ačkoli Visual Studio bude kompilace c soubory, je nutné převést do jazyka C++ pro /clr kompilace. Skutečný název souboru nemusí být změněna; můžete použít /Tp (viz /Tc, /Tp, /TC, /TP (Specify Source File Type).) Přestože souborů zdrojového kódu jazyka C++ jsou požadovány pro /clr, není nutné, re-factor kódu pomocí objektově orientované paradigmata.

Kód jazyka C je velmi pravděpodobně vyžadován ke změnám při kompilaci jako soubor jazyka C++. Pravidla bezpečnosti typů jazyka C++ jsou přísné, tak převody musí být vyrobeny explicitně s vysíláním. Například malloc vrací neplatný ukazatel, ale nemůže být přiřazen k ukazateli na libovolný typ v jazyce C s vysíláním:

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

Funkce ukazatelů jsou také přísně bezpečné typy v jazyce C++, takže následující kód jazyka C vyžaduje změnu. V jazyce C++ je nejlepší vytvořit typedef , který definuje typ ukazatele funkce a potom pomocí typu odevzdaných ukazatelů funkcí:

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

Jazyk C++ také vyžaduje, aby funkce byly buď prototypem nebo plně definované dříve, než mohou být vyvolány či odkazovány.

Identifikátory použité v kódu jazyka C, které se stanou klíčovovými slovy v jazyce C++ (například virtual, new, delete, bool, true, false atd.) musí být přejmenovány. Toto může být obecně provedeno s jednoduchými operacemi vyhledávání a nahrazování.

Konečně vzhledem k tomu, že volání jazyka C styl modelu COM vyžaduje explicitní použití tabulky-v a ukazatel this, C++ nepodporuje:

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

Překonfigurování nastavení projektu

Po projektu zkompiluje a spustí v roce 2010 Visual Studio, měli byste vytvořit nový projekt konfigurace pro /clr spíše než Změna výchozí konfigurace. /clr není kompatibilní s možnostmi kompilátoru a umožňuje vytvoření samostatných konfigurací vytváření Vašeho projektu jako nativní nebo spravované. Když je /clr vybrán ve vlastnostech stránky dialogového okna, nastavení projektu není kompatibilní s /clr jsou neaktivní (a neaktivní možnosti nebudou automaticky obnoveny pokud /clr je následně nevybrané).

Vytvořit nové konfigurace projektu

Můžete použít volbu Kopírovat nastavení z v New Project Configuration Dialog Box chcete-li vytvořit projekt konfigurace na základě existujícího nastavení projektu. Provést to jednou pro konfiguraci ladění a jednou pro vydanou verzi konfigurace. Následné změny potom mohou být použity k /clr -pouze zvláštní konfigurace ponechá původní konfigurace projektu beze změny.

Projekty, používající vlastní pravidla sestavení mohou vyžadovat zvláštní pozornost.

Tento krok má různé důsledky pro projekty, používající makefiles. V tomto případě lze nakonfigurovat samostatnou cílovou databázy sestavení nebo verze, které jsou specifické pro kompilaci /clr, která může být vyvtořena z kopie originálu.

Změna nastavení projektu

/clr můžou být vybrány ve vývojovém prostředí postupujícím podle pokynů v /clr (Common Language Runtime Compilation). Jak již bylo zmíněno dříve, tento krok automaticky zakáže konfliktní nastavení projektu.

Poznámka

Při upgradu z Visual C++ 2003 spravovaných knihovny nebo projekt webové služby /Zl Kompilátor možnost bude přidána do příkazového řádku stránka vlastností. Tento postup způsobí LNK2001. Odstranění /Zl z Příkazový řádek vlastnost stránky k přeložení. Další informace naleznete v tématu /Zl (Omit Default Library Name) a Postupy: Stránky vlastností Otevření projektu. Nebo přidat msvcrt.lib a msvcmrt.lib do propojovacího programu vlastnosti Další závislosti.

Pro projekty vytvořené pomocí makefiles nekompatibilní možnosti kompilátoru musí být zakázána ruční /clr je přidána. Viz //clr Restrictions informace o možnostech kompilátoru, které nejsou kompatibilní s /clr.

Předkompilované hlavičky

Předkompilovaná záhlaví jsou podporována v rámci /clr. Avšak v případě, že některé kompilované soubory CPP s /clr (kompilování zbytku jako nativní) některé změny budou požadovýny, protože předkompilována záhlaví generována s /clr nejsou kompatibilní s generovanými bez /clr. Tato nekompatibilita je způsobena faktem, že /clr generuje a vyžaduje metadata. Kompilované moduly /clr proto nelze použít předkompilovanou hlavičku, která nezahrnuje metadata a moduly /clr nelze použít předkompilované hlavičky souborů, které neobsahují metadata.

Nejjednodušší způsob k sestavení projektu, kde jsou některé moduly zkompilovány /clr je k neaktivním hlavičkám neuplný. (V dialogovém okně projektu vlastnosti stránky, otevřete uzel C/C++ a vybrte předkompilované záhlaví. Potom změňte vlastnost Vytvořte/Použijte předkompilování vlastnosti záhlaví k "Není použití předkompilování záhlaví".)

Nicméně, zvláště pro velké projekty předkompilovaná záhlaví poskytují mnohem lepší rychlost kompilace proto zakázání této funkce není žádoucí. V tomto případě je nejlepší ke konfiguraci /clr a non /clr soubory pro použití samostatných předkompilovaných záhlaví. To lze provés v jednom kroku podle hromadného vybírání modulů ke kompilaci /clr použitím Průzkumníka řešení, kliknutím pravým tlačítkem myši na seskupit a vybrat Vlastnosti. Poté změňte obojí Vytvořit/Použit soubor PCH Trouhg a předkompilováné vlastnosti záhlaví souboru k použití odlišnému návu souboru záhlaví a příslušné soubory PCH.

Oprava chyb

Kompilace s /clr může mít za následek v kompilátoru propojovací program nebo chyby runtime. Tato část popisuje nejběžnější problémy.

Sloučení metadat

Rozdílné verze typů dat můžou způsobit, že se propojovací program nezdaří, protože jsou generovány pro dva typy neodpovídajících metadat. (To je obvykle způsobeno, když členové typu jsou podmíněně definovány, ale podmínky nejsou stejné pro všechny soubory CPP, které používají typ.) V tomto případě propojovací program selže, pouze vykazování názvu druhého souboru OBJ, kde byl definován typ. Je to často užitečné k rotaci pořadí, aby OBJ soubory odesílány propojovací program k zajištění umístění ostatní verze datového typu.

Načítání vzájemného zablokování zámku

V aplikaci Visual C++ .NET a Visual C++ 2003 inicializace pod /clr byla náchylná k determinizaci vzájemného zablokování. Tento problém je označován jako "načítání vzájemného zablokování". Toto zablokování Visual Studio 2010 je snadněji vyhnout, je rozpoznán a hlášena běhu a není již-deterministický. Vyskytování problému uzamknutí zavaděče je stále možné, ale nyní je mnohem jednodušší, aby se zabránilo a opravilo. Viz Inicializace smíšených sestavení pro podrobné pozadí, pokyny a řešení.

Data Exports

Export dat knihovny DLL je náchylné chybám a není doporučeno. Je to protože, oddíl dat knihovny DLL není zaročen k inicializace dokud nějaká spravovaná část knihovny DLL byla provedena. Odkazuje na metadata s The #using Directive.

Typ viditelnosti

Nativní typy jsou nyní soukromé ve výchozím nastavení. Ve Visual C++ .NET 2002 a Visual C++ 2003, byly nativní typy veřejné ve výchozím nastavení. Ve výsledku to nemusí být v nativním typu viditelné mimo knihovnu DLL. Řešením této chyby přidáním public k těmto typům. Další informace naleznete v tématu Type and Member Visibility.

Plovoucí desetinná čárka a přidružené problémy.

__controlfp není podporována na modul CLR (Common Language Runtime) ( pro více informací, viz _control87, _controlfp, __control87_2). CLR také nerespektuje align (C++).

Inicializace modulu COM

Automatická inicializace modulu CLR (Common Language Runtime), když je modul inicializován (když je model COM inicializován automaticky je provedeno tak jako MTA). V důsledku toho explicitní inicializace modelu COM vytváří návratové kódy označující, že model COM je již inicializován. Pokus k explicitní inicializaci modelu COM s jedním modelem podprocesu, když CLR je již inicializován modelem COM do jiného modelu podprocesu může způsobit selhání aplikace.

Modul CLR (Common Language Runtime) spustí model COM ve výchozím, /CLRTHREADATTRIBUTE (Set CLR Thread Attribute) použijte ke změně.

Problémy s výkonem

Můžete vidět výkon poklesu, když nativní metody jazyka C++ generují k jazyku MSIL jsou volány nepřímo (virtuální funkce volájí nebo používají funkce ukazatele). Další informace naleznete v tématu Dvojitý převod adres na jinou bitovou šířku (jazyk C++).

Při přesunu z nativního do jazyka MSIL, zjistíte zvýšení velikosti Vaší pracovní sady. Důvodem je, že modul CLR (common language runtime) poskytuje mnoho funkcí, aby programy běžely správně. Pokud vaše aplikace /clr není spuštěna správně, možná budete chtít povolit C4793 (vypnutí ve výchozím nastavení), další informace,viz Compiler Warning (level 1 and 3) C4793.

Chyba programu během vypnutí

V některých případech může CLR vypnout před Vaším dokončením spuštění spravovaného kódu. Použitím std::set_terminate a to může způsobit SIGTERM. Další informace naleznete v tématu signal Constants a set_terminate (<exception>).

Použití nové funkce aplikace Visual C++

Po Vaší kompilaci aplikace, propojejí a spuštění, můžete začít používat funkce .NET v jakémkoliv kompilovaném modulu s /clr. Další informace naleznete v tématu Language Features for Targeting the CLR.

Pokud jste použili spravované rozšíření jazyka C++, můžete převést Váš kód k použití nové syntaxe. Souhrn syntaktických rozdílů naleznete v odkazu Managed Extensions for C++ Syntax Upgrade Checklist. Detaily o převodu spravovaného rotźšíření jazyka C++ naleznete v tématu Základní přesun C++/CLI.

Informace o programování v jazyce Visual C++ .NET naleznete v následujících tématech:

Viz také

Koncepty

Smíšená (nativní a spravovaná) sestavení