Postupy: Diagnostikování a odstranění potíží s kompatibilitou sestavení (C++/CLI)
Toto téma vysvětluje, co může nastat v případě, že verze odkazovaného sestavení v době kompilace neodpovídá verzi sestavení, odkazovaného za běhu, a jak se tomuto problému vyhnout.
Při kompilování sestavení mohou být odkazována jiná sestavení pomocí syntaxe #using.Během kompilace je k těmto sestavením přistupováno kompilátorem.Informace z těchto sestavení se používají k optimalizačním rozhodnutím.
Avšak pokud je odkazované sestavení změněno a rekompilováno, a nerekompilujete sestavení, které jej odkazuje a na které je na něm závislé, nemusí být sestavení nadále kompatibilní.Optimalizační rozhodnutí, která byla nejprve platná, nemusí být správná s ohledem na novou verzi sestavení.Může docházet k různým chybám za běhu z důvodu této nekompatibility.Není k dispozici žádná specifická výjimka, která bude v takových případech produkována.Způsob, jakým bude selhání za běhu hlášeno, závisí na povaze změny kódu, která problém způsobila.
Tyto chyby by neměly být problém ve vašem konečném produkčním kódu tak dlouho, dokud je celá aplikace sestavována pro vydanou verzi vašeho produktu.Sestavení, která jsou vydávána pro veřejnost, by měla být označena oficiálním číslem verze, které zajistí, že bude těmto problémům zabráněno.Další informace naleznete v tématu Správa verzí sestavení.
Diagnostikování a oprava chyby nekompatibility
Pokud zaznamenáte výjimky za běhu nebo jiné chybové podmínky, ke kterým dochází v kódu, který odkazuje na jiné sestavení, a nemají žádné jiné identifikované příčiny, můžete mít problém se zastaralým sestavením.
Nejprve izolujte a reprodukujte výjimku nebo jiný chybový stav.Problém, ke kterému dochází kvůli zastaralé výjimce, by měl být reprodukovatelný.
Zkontrolujte časové razítko všech sestavení, odkazovaných ve vaší aplikaci.
Pokud časová razítka jakýchkoli odkazovaných sestavení jsou pozdější než časové razítko poslední kompilace vaší aplikace, pak je vaše aplikace zastaralá.V takovém případě znovu zkompilujte aplikaci s nejnovějším sestavením a proveďte všechny požadované změny kódu.
Spusťte znovu aplikaci, proveďte kroky reprodukující problém a ověřte, že k výjimce nedojde.
Příklad
Následující program ilustruje daný problém snížením přístupnosti metody a pokusem o přístup k dané metodě v jiném sestavení bez rekompilace.Zkuste nejprve zkompilovat changeaccess.cpp.Toto je odkazované sestavení, které se změní.Potom zkompilujte referencing.cpp.Kompilace uspěje.Nyní snižte přístupnost volané metody.Překompilujte changeaccess.cpp s příznakem /DCHANGE_ACCESS.To udělá metodu protected, nikoli private, proto může být dále legálně volána.Bez rekompilace referencing.exe znovu spusťte aplikaci.Výsledkem bude výjimka MethodAccessException.
// changeaccess.cpp
// compile with: /clr:safe /LD
// After the initial compilation, add /DCHANGE_ACCESS and rerun
// referencing.exe to introduce an error at runtime. To correct
// the problem, recompile referencing.exe
public ref class Test {
#if defined(CHANGE_ACCESS)
protected:
#else
public:
#endif
int access_me() {
return 0;
}
};
// referencing.cpp
// compile with: /clr:safe
#using <changeaccess.dll>
// Force the function to be inline, to override the compiler's own
// algorithm.
__forceinline
int CallMethod(Test^ t) {
// The call is allowed only if access_me is declared public
return t->access_me();
}
int main() {
Test^ t = gcnew Test();
try
{
CallMethod(t);
System::Console::WriteLine("No exception.");
}
catch (System::Exception ^ e)
{
System::Console::WriteLine("Exception!");
}
return 0;
}