Aracılığıyla paylaş


Nasıl yapılır: tanılamak ve düzeltmek derleme uyumluluk sorunları (C++/ CLI)

Bu konu, derleme zamanında başvurulan derlemenin sürümünün çalışma zamanında başvurulan derlemenin sürümüne eşleşmediği takdirde ne olabileceğini ve bundan nasıl kaçınabileceğinizi anlatmaktadır.

Bir derleme derlendiğinde, diğer derlemelere #using sözdizimiyle başvurulabilir.Derleme sırasında, bu derlemelere derleyici tarafından erişilir.Bu derlemelerden alınan bilgiler iyileştirme kararları almak için kullanılır.

Ancak, başvurulan derleme değişti ve yeniden derlendiyse ve siz üzerindeki bağımlı olan başvuruyu yeniden derlemezseniz, derlemeler hala uyumlu olmayabilir.İlk olarak geçerli olan iyileştirme kararları yeni derleme versiyonuna ilişkin olarak doğru olmayabilir.Bu uyumsuzluklar nedeniyle çeşitli çalışma zamanı hataları oluşabilir.Bu gibi durumlara özgü bir istisna yok.Çalışma zamanı sırasında başarısızlığın bildirilme yolu soruna sebep olan kod değişikliğinin yapısına dayanır.

Ürünün yayımlanmış sürümü için tüm uygulama yeniden yapılandırıldığı sürece bu hatalar üretim kodunun son halinde bir sorun oluşturmamalıdır.Herkese açılan derlemeler, bu sorunlardan kaçınılması sağlayacak resmi bir sürüm numarası ile işaretlenmelidir.Daha fazla bilgi için bkz. Derleme sürüm oluşturma.

Uyumsuzluk hatasını tanılama ve düzeltme

  1. Çalışma zamanı istisnaları ya da başka bir derlemeye başvuran kodda oluşan öteki hatalarla karşılaştırsanız ve tanımlanmış başka bir nedeniniz yoksa, zamanı geçmiş bir derleme ile uğraşıyor olabilirsiniz.

  2. Önce, istisnayı veya diğer hata durumunu izole edin ve yeniden üretin.Eski bir istisna nedeniyle oluşan bir sorun tekrarlanabilir olmalıdır.

  3. Uygulamanızda başvurulan her bir derlemenin zaman damgasını kontrol edin.

  4. Başvurulan derlemelerin herhangi birinin zaman damgaları uygulamanızın son derlemesinden sonraysa uygulamanız güncel değildir.Bu durumda, uygulamanızı en son derleme ile yeniden derleyin ve gereken kod değişikliklerini yapın.

  5. Uygulamayı yeniden çalıştırın, sorunu yeniden oluşturan adımları gerçekleştirin ve istisnanın meydana gelmediğini doğrulayın.

Örnek

Aşağıdaki program bir yöntemin erişilebilirliğini azaltarak ve bu yönteme yeniden derleme olmadan başka bir derlemede erişmeye çalışarak gösterir.Öncelikle changeaccess.cpp öğesini derlemeyi deneyin.Bu, bahsedilen değişecek olan derlemedir.Sonra referencing.cpp öğesini derleyin.Derleme başarılı olur.Şimdi de çağrılan yöntemin erişilebilirliğini azaltın.changeaccess.cpp öğesini /DCHANGE_ACCESS işaretiyle yeniden derleyin.Bu, yöntemi özelden daha çok korunmuş kılar ve böylece yöntem kurallara uygun bir biçimde çağırılamaz.referencing.exe dosyasını yeniden derlemeden uygulamayı tekrar çalıştırın.MethodAccessException özel durumuna neden olacaktır.

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

Ayrıca bkz.

Başvuru

# kullanma yönergesi (C++)

Diğer Kaynaklar

Yönetilen türleri (C++/ CLI)