Udostępnij za pośrednictwem


Jak: zdiagnozować i naprawić problemy ze zgodnością zestawu (C + +/ CLI)

W tym temacie wyjaśniono, co może się zdarzyć, gdy wersja zestawu odwołania w czasie kompilacji nie pasuje do wersji zestawu, do którego odwołuje się w czasie wykonywania i jak uniknąć tego problemu.

Gromadzone Zgromadzenie inne zespoły mogą odwoływać się z #using składni.Podczas kompilacji zespoły te są dostępne przez kompilator.Informacje z tych zestawów są używane do podejmowania decyzji optymalizacji.

Jednakże, jeśli odnośny zestaw zmieniony i ponownie skompilowana, a nie zostanie ponownie skompilowana odwołującego się zestawu, który jest zależny od jej zgromadzeń może nie być zgodne.Optymalizacja decyzje, które były ważne w najpierw może nie być prawidłowe w odniesieniu do nowych wersji zestawu.Różne błędy wykonania mogą wystąpić do z powodu tych niezgodności.Nie istnieje żadne szczególne wyjątek, który będzie produkowane w takich przypadkach.Sposób awarii jest raportowany w czasie wykonywania zależy od charakteru zmiany kodu, który spowodował problem.

Błędy te nie powinno problem w kodzie produkcji końcowej, tak długo, jak długo całej aplikacji jest odbudowywany dla pełnej wersji produktu.Zespoły, które są dopuszczone do publicznego powinny oznaczony z numerem wersji oficjalnej, który zapewni, aby uniknąć tych problemów.Aby uzyskać więcej informacji, zobacz Przechowywanie wersji zestawu.

Diagnozowania i rozwi¹zywania błąd niezgodności

  1. Jeśli występują wyjątki w czasie wykonywania lub innych warunków błędów, które występują w kodzie, który odwołuje się do innego zestawu i mieć żadnej innej przyczyny zidentyfikowanych może dotyczących nieaktualne zestawu.

  2. Po pierwsze wyizolować i odtworzyć wyjątek lub inny warunek błędu.Problem występujący, ze względu na wyjątek przestarzałe powinny być odtwarzalne.

  3. Sprawdzanie sygnatury czasowej, wszelkich zespołów w aplikacji.

  4. Jeśli sygnatury czasowe, wszelkie odwołania zestawów są późniejsze niż sygnatura czasowa ostatniej kompilacji aplikacji, aplikacja jest nieaktualny.W takim przypadku ponownie skompilować aplikację z najnowszych Zgromadzenia i wprowadź wymagane zmiany kodu.

  5. Uruchom ponownie aplikację, należy wykonać czynności, które odtworzenia problemu i zweryfikować, że wyjątek nie występuje.

Przykład

Poniższy program ilustruje problem poprzez zmniejszanie ułatwień dostępu, metody i próby uzyskania dostępu do tej metody w innym zestawie bez ponownej kompilacji.Spróbuj kompilowania changeaccess.cpp pierwszego.Jest to odnośny zestaw, co spowoduje zmianę.Następnie kompilacja referencing.cpp.Zestawienie powiedzie się.Teraz zmniejszyć dostępność nazywane metody.Ponowna kompilacja changeaccess.cpp z flagą /DCHANGE_ACCESS.Dzięki temu metoda chronione, a nie prywatnego, więc może być wywoływana prawnie.Bez konieczności ponownego kompilowania referencing.exe, uruchom ponownie aplikację.Wyjątek MethodAccessException spowoduje.

// 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;
}

Zobacz też

Informacje

# za pomocą dyrektywy (C++)

Inne zasoby

Typy zarządzane (C + +/ CLI)