Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
'function': işlev imzası 'type' türünü içeriyor; C++ nesneleri saf kod ile karışık veya yerel arasında geçiş yapmak için güvenli değildir.
Açıklamalar
/clr:pure Visual Studio 2015'te derleyici seçeneği kullanım dışıdır ve Visual Studio 2017'den itibaren desteklenmez. CLR saf olması gereken kodunuz varsa, bunu C# olarak taşımanızı öneririz.
Derleyici, çalışma zamanı hatasına yol açabilecek potansiyel olarak güvensiz bir durum algıladı: /clr:pure ile derlenmiş koddan dllimport aracılığıyla içe aktarılan bir işleve çağrı yapılıyor ve işlev imzası güvensiz bir tür içeriyor. Bir üye işlevi içeriyorsa veya güvenli olmayan bir tür veya güvenli olmayan bir türe dolaylı bir veri üyesine sahipse tür güvenli değildir.
Bu düzen, saf ve yerel kod (veya karışık yerel ve yönetilen) arasındaki varsayılan çağrı kurallarındaki fark nedeniyle güvenli değildir.
dllimport ile derlenen koda bir işlevi /clr:pure içeri aktarırken, işlev imzasındaki her türün bildirimlerinin, işlevi compiland tarafından dışarı aktarılan imzayla aynı olduğundan emin olun (özellikle örtük çağrı kurallarındaki farklılıklara dikkat edin).
Sanal üye işlevi özellikle beklenmeyen sonuçlar vermeye açıktır. Ancak, doğru sonuçları aldığınızdan emin olmak için sanal olmayan bir işlev bile test edilmelidir. Sonucun doğru olduğundan emin olduktan sonra bu uyarı yoksayılabilir.
C4412 varsayılan olarak kapalıdır. Daha fazla bilgi için bkz. Varsayılan Olarak Kapalı Olan Derleyici Uyarıları ve dllexport. dllimport
Bu uyarıyı çözmek için türündeki tüm işlevleri kaldırın.
Örnekler
Aşağıdaki örnek C4412 oluşturur:
// compile with: /c /W2 /clr:pure
#pragma warning (default : 4412)
struct Unsafe {
virtual void __cdecl Test();
};
struct Safe {
int i;
};
__declspec(dllimport) Unsafe * __cdecl func();
__declspec(dllimport) Safe * __cdecl func2();
int main() {
Unsafe *pUnsafe = func(); // C4412
// pUnsafe->Test();
Safe *pSafe = func2(); // OK
}
Aşağıdaki örnek, iki tür bildiren bir üst bilgi dosyasıdır. Tür Unsafe çünkü üye işlevine sahip olduğundan güvensizdir.
// C4412.h
struct Unsafe {
// will be __clrcall if #included in pure compilation
// defaults to __cdecl in native or mixed mode compilation
virtual void Test(int * pi);
// try the following line instead
// virtual void __cdecl Test(int * pi);
};
struct Safe {
int i;
};
Bu örnek, üst bilgi dosyasında tanımlanan türlerle işlevleri dışarı aktarır:
// C4412_2.cpp
// compile with: /LD
#include "C4412.h"
void Unsafe::Test(int * pi) {
*pi++;
}
__declspec(dllexport) Unsafe * __cdecl func() { return new Unsafe; }
__declspec(dllexport) Safe * __cdecl func2() { return new Safe; }
Derlemedeki /clr:pure varsayılan çağırma kuralı, yerel derlemeden farklıdır. Eklendiğinde C4412.h, Test varsayılan olarak __clrcall ayarlanır.
Aşağıdaki örnek C4412 oluşturur ve çalışma zamanında bir özel durum fırlatır.
// C4412_3.cpp
// compile with: /W2 /clr:pure /c /link C4412_2.lib
#pragma warning (default : 4412)
#include "C4412.h"
__declspec(dllimport) Unsafe * __cdecl func();
__declspec(dllimport) Safe * __cdecl func2();
int main() {
int n = 7;
Unsafe *pUnsafe = func(); // C4412
pUnsafe->Test(&n);
Safe *pSafe = func2(); // OK
}