Postupy: Přenesení na /clr:pure

Toto téma popisuje problémy, které mohou nastat při přenášení do čistého jazyka MSIL pomocí /clr:pure (viz /clr (Common Language Runtime Compilation) pro další informace). Toto téma předpokládá, že přenášený kód aktuálně vyhovuje podmínkám smíšeného sestavení pomocí volby /clr, protože cesta přenosu z nespravovaného kódu do čistého jazyka MSIL není přímá. Pro nespravovaný kód si prohlédněte Postupy: Přenos na /clr před pokusem o přenesení do čistého jazyka MSIL.

Základní změny

Čistý jazyk MSIL je tvořen instrukcemi MSIL, takže kód, který obsahuje funkce, které nelze vyjádřit v jazyku MSIL zabrání kompilaci. To zahrnuje funkce, které jsou definovány pro používání jiné konvence volání než __clrcall. (Funkce bez __clrcall mohou být vyvolány v komponentě čistého jazyka MSIL, ale nejsou definovány.)

Pro zajištění žádných chyb za běhu byste měli povolit upozornění C4412. Povolte C4412 přidáním #pragma warning (default : 4412) do každého souboru určeného ke kompilaci, který kompilujete s /clr:pure a který předává typy jazyka C++ do a z IJW (/clr) nebo nativní kód. Další informace naleznete v tématu Compiler Warning (level 2) C4412.

Architektonické otázky

Některá omezení čistých sestavení jazyka MSIL, uvedená v Čistý a ověřitelný kód, mají velký vliv na návrh aplikace a strategii přenesení. Zejména narozdíl od smíšených sestavení neumožňují sestavení v čistém jazyku MSIL plnou kompatibilitu s nespravovanými moduly.

Čistá sestavení jazyka MSIL mohou volat nespravované funkce, ale nemohou být volána nespravovanými funkcemi. Výsledkem je, že čistý jazyk MSIL je lepším kandidátem pro klientský kód, který používá nespravované funkce, než kód serveru, který je používán nespravovanými funkcemi. Má-li být využívána funkcionalita sestavení v čistém jazyku MSIL nespravovanými funkcemi, smíšené sestavení musí být použito jako vrstva rozhraní.

Aplikace používající ATL nebo MFC nejsou vhodnými kandidáty na přenesení do čistého jazyka MSIL, protože tyto knihovny nejsou v tomto vydání podporovány. Podobně Windows SDK obsahuje soubory hlaviček, které se nezkompilují pod /clr:pure.

Zatímco sestavení MSIL mohou volat nespravované funkce, tato schopnost je omezena na jednoduché funkce stylu C. Použití složitějšího nespravovaného rozhraní API vyžaduje vystavení nespravované funkcionality ve formě rozhraní modelu COM nebo smíšeného sestavení, které může pracovat jako rozhraní mezi čistým jazykem MSIL a nespravovanými součástmi. Použití vrstvy smíšeného sestavení je jediný způsob použití nespravovaných funkcí, které přebírají funkce zpětného volání, například čisté sestavení není schopno poskytnout nativní volatelnou funkci pro použití jako zpětné volání.

Domény aplikace a konvence volání

Přestože je možné použití nespravované funkcionality pro sestavení čistého jazyka MSIL, funkce a statická data jsou zpracována odlišným způsobem. V čistých sestaveních jsou funkce implementovány s konvencí volání __clrcall a statická data jsou uložena pro aplikační doménu. Tím se liší od výchozího nastavení pro nespravovaná a smíšená sestavení, která používají konvenci volání __cdecl pro funkce a ukládají statická data na základě procesů.

V rámci kontextu čistého jazyka MSIL (a ověřitelného kódu zkompilovaného s /clr:safe) jsou tyto výchozí hodnoty transparentní, jelikož __clrcall je výchozí konvencí volání CLR a aplikační domény jsou nativním rozsahem pro statické a globální data v aplikacích .NET. Při propojování s nespravovanými nebo smíšenými komponentami však může rozdílné zacházení s funkcemi a globálními daty způsobit problémy.

Například pokud komponenta čistého jazyka MSIL volá funkce v nespravované knihovně DLL, soubor hlavičky pro knihovnu DLL bude použit ke kompilaci čistého sestavení. Nebude-li však konvence volání pro každou funkci v hlavičce výslovně uvedena, budou všechny pokládány za __clrcall. To později způsobí selhání modulu runtime, jelikož jsou často tyto funkce implementovány s konvencí __cdecl. Funkce v nespravovaném souboru hlavičky mohou být explicitně označeny jako __cdecl nebo musí být celý zdrojový kód knihovny DLL překompilován pod /clr:pure.

Podobně u ukazatelů funkcí je předpokládáno, že ukazují na funkce __clrcall pod kompilací /clr:pure. Tyto musí být také explicitně uvedeny se správnými konvencemi volání.

Další informace naleznete v tématu Domény aplikace a Visual C++.

Omezení propojení

Propojovač Visual C++ nebude pokoušet propojení smíšené a čistého souborů OBJ úložiště oboru a volací konvence jsou různé.

Viz také

Odkaz

Čistý a ověřitelný kód