Sdílet prostřednictvím


Jak: Přenést do /clr

Toto téma popisuje problémy, které vznikají při kompilaci nativního kódu s /clr (další informace, viz /CLR (kompilace společné Language Runtime). /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ů.

ms173265.collapse_all(cs-cz,VS.110).gifVerze předcházející Visual C++ 2003

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

ms173265.collapse_all(cs-cz,VS.110).gifInovace z aplikace Visual C++ 2003

Předchozí projekty vytvořené pomocí Visual C++ 2003 také nejprve třeba sestavit 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 Funkce zabezpečení v 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é Rozšířené zabezpečení verze funkce CRT 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.

ms173265.collapse_all(cs-cz,VS.110).gifUpgradová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. Jako náhradu použijte /clr:oldSyntax.

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

Přestože Visual Studio bude kompilace c soubory, je nutné je převést na C++ pro /clr kompilace.Skutečný název souboru nemusí být změněna; you can use /Tp (see / Tc /TP /Tp /TC, (určete typ zdrojového souboru).) Všimněte si, že ačkoli 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ž úpravou 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é).

ms173265.collapse_all(cs-cz,VS.110).gifVytvořit nové konfigurace projektu

Můžete použít volbu Kopírovat nastavení z v Dialogové okno Konfigurace nového projektu 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.

ms173265.collapse_all(cs-cz,VS.110).gifZměna nastavení projektu

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

[!POZNÁMKA]

Při inovaci od Visual C++ spravované knihovny nebo projekt webové služby /Zl kompilátor možnost bude přidána do příkazového řádku stránky 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 (vynechat výchozí název knihovny) a Jak: otevření stránky vlastností 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 omezení informace o možnostech kompilátoru, které nejsou kompatibilní s /clr.

ms173265.collapse_all(cs-cz,VS.110).gifPř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.

ms173265.collapse_all(cs-cz,VS.110).gifSlouč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.

ms173265.collapse_all(cs-cz,VS.110).gifNačí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í".V roce 2010 Visual Studio, je snazší se vyhnout tomuto zablokování, je rozpoznán a ohlásil za běhu a není již není 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í.

ms173265.collapse_all(cs-cz,VS.110).gifData 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 # použití směrnice (C++).

ms173265.collapse_all(cs-cz,VS.110).gifTyp 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 Viditelnost typů a členů.

ms173265.collapse_all(cs-cz,VS.110).gifPlovoucí 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 zarovnání (C++).

ms173265.collapse_all(cs-cz,VS.110).gifInicializace 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 o explicitní inicializaci modelu COM pro určitý model vláken, když modul CLR již inicializoval model COM pro jiný model vláken, může způsobit selhání aplikace.

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

ms173265.collapse_all(cs-cz,VS.110).gifProblé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 C4793 (úroveň 1 a 3) upozornění kompilátoru.

ms173265.collapse_all(cs-cz,VS.110).gifChyba 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 signál konstanty 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 Součást rozšíření pro Runtime platformy.

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í