İngilizce dilinde oku

Aracılığıyla paylaş


BadImageFormatException Sınıf

Tanım

Dinamik bağlantı kitaplığının (DLL) veya yürütülebilir bir programın dosya görüntüsü geçersiz olduğunda oluşan özel durum.

C#
public class BadImageFormatException : Exception
C#
public class BadImageFormatException : SystemException
C#
[System.Serializable]
public class BadImageFormatException : SystemException
C#
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public class BadImageFormatException : SystemException
Devralma
BadImageFormatException
Devralma
BadImageFormatException
Öznitelikler

Açıklamalar

Dinamik bağlantı kitaplığının (.dll dosyası) veya yürütülebilir dosyanın (.exe dosyası) dosya biçimi ortak dil çalışma zamanının beklediği biçime uymadığında bu özel durum oluşur. Özellikle, özel durum aşağıdaki koşullar altında oluşturulur:

  • .NET yardımcı programının ILDasm.exe veya installutil.exe gibi önceki bir sürümü, .NET'in sonraki bir sürümüyle geliştirilmiş bir derlemeyle kullanılır.

    Bu özel durumu gidermek için, aracın derlemeyi geliştirmek için kullanılan .NET sürümüne karşılık gelen sürümünü kullanın. Bu, ortam değişkeninin Path değiştirilmesini veya doğru yürütülebilir dosyanın tam yolunun sağlanmasını gerektirebilir.

  • Yönetilmeyen bir dinamik bağlantı kitaplığını veya yürütülebilir dosyayı (windows sistem DLL'si gibi) bir .NET derlemesiymiş gibi yüklemeye çalışıyorsunuz. Aşağıdaki örnek, Kernel32.dll yüklemek için yöntemini kullanarak Assembly.LoadFile bunu gösterir.

    C#
    // Windows DLL (non-.NET assembly)
    string filePath = Environment.ExpandEnvironmentVariables("%windir%");
    if (! filePath.Trim().EndsWith(@"\"))
       filePath += @"\";
    filePath += @"System32\Kernel32.dll";
    
    try {
       Assembly assem = Assembly.LoadFile(filePath);
    }
    catch (BadImageFormatException e) {
       Console.WriteLine("Unable to load {0}.", filePath);
       Console.WriteLine(e.Message.Substring(0,
                         e.Message.IndexOf(".") + 1));
    }
    // The example displays an error message like the following:
    //       Unable to load C:\WINDOWS\System32\Kernel32.dll.
    //       The module was expected to contain an assembly manifest.
    

    Bu özel durumu gidermek için, geliştirme diliniz tarafından sağlanan visual basic deyimi veya DllImportAttribute C# ve F# anahtar sözcüğüyle özniteliği gibi Declare özellikleri kullanarak DLL'de tanımlanan yöntemlere extern erişin.

  • Başvuru derlemesini yalnızca yansıma bağlamı dışında bir bağlamda yüklemeye çalışıyorsunuz. Bu sorunu iki yoldan biriyle çözebilirsiniz:

    • Başvuru derlemesi yerine uygulama derlemesini yükleyebilirsiniz.
    • yöntemini çağırarak Assembly.ReflectionOnlyLoad başvuru derlemesini yalnızca yansıma bağlamında yükleyebilirsiniz.
  • DLL veya yürütülebilir dosya 64 bit derleme olarak yüklenir, ancak 32 bit özellikler veya kaynaklar içerir. Örneğin, COM birlikte çalışma kullanır veya 32 bit dinamik bağlantı kitaplığında yöntemleri çağırır.

    Bu özel durumu gidermek için projenin Platform hedef özelliğini x86 (x64 veya AnyCPU yerine) olarak ayarlayın ve yeniden derleyin.

  • Uygulamanızın bileşenleri farklı .NET sürümleri kullanılarak oluşturuldu. Bu özel durum genellikle, .NET Framework 1.0 veya .NET Framework 1.1 kullanılarak geliştirilen bir uygulama veya bileşen .NET Framework 2.0 SP1 veya üzeri kullanılarak geliştirilmiş bir derlemeyi yüklemeye çalıştığında veya .NET Framework 2.0 SP1 kullanılarak geliştirilen bir uygulama veya .NET Framework 3.5, .NET Framework 4 veya üzeri kullanılarak geliştirilmiş bir derlemeyi yüklemeye çalışır. BadImageFormatException derleme zamanı hatası olarak bildirilebilir veya çalışma zamanında özel durum oluşturulabilir. Aşağıdaki örnek, ToProperCasetek bir üyesi olan ve StringLib.dll adlı bir derlemede bulunan bir sınıfı tanımlarStringLib.

    C#
    using System;
    
    public class StringLib
    {
       private string[] exceptionList = { "a", "an", "the", "in", "on", "of" };
       private char[] separators = { ' ' };
    
       public string ToProperCase(string title)
       {
          bool isException = false;	
    
          string[] words = title.Split( separators, StringSplitOptions.RemoveEmptyEntries);
          string[] newWords = new string[words.Length];
            
          for (int ctr = 0; ctr <= words.Length - 1; ctr++)
          {
             isException = false;
    
             foreach (string exception in exceptionList)
             {
                if (words[ctr].Equals(exception) && ctr > 0)
                {
                   isException = true;
                   break;
                }
             }
    
             if (! isException)
                newWords[ctr] = words[ctr].Substring(0, 1).ToUpper() + words[ctr].Substring(1);
             else
                newWords[ctr] = words[ctr];	
          }	
          return string.Join(" ", newWords); 			
       }
    }
    // Attempting to load the StringLib.dll assembly produces the following output:
    //    Unhandled Exception: System.BadImageFormatException:
    //                         The format of the file 'StringLib.dll' is invalid.
    

    Aşağıdaki örnek, StringLib.dll adlı bir derlemeyi yüklemek için yansımayı kullanır. Kaynak kodu bir .NET Framework 1.1 derleyicisi ile derlenmişse, yöntemi tarafından Assembly.LoadFrom bir BadImageFormatException oluşturulur.

    C#
    using System;
    using System.Reflection;
    
    public class Example
    {
       public static void Main()
       {
          string title = "a tale of two cities";
    //      object[] args = { title}
          // Load assembly containing StateInfo type.
          Assembly assem = Assembly.LoadFrom(@".\StringLib.dll");
          // Get type representing StateInfo class.
          Type stateInfoType = assem.GetType("StringLib");
          // Get Display method.
          MethodInfo mi = stateInfoType.GetMethod("ToProperCase");
          // Call the Display method.
          string properTitle = (string) mi.Invoke(null, new object[] { title } );
          Console.WriteLine(properTitle);
       }
    }
    

    Bu özel durumu gidermek için, kodu yürütülen ve özel durum oluşturan derlemenin ve yüklenecek derlemenin her iki uyumlu .NET sürümünü de hedeflediğinden emin olun.

  • Uygulamanızın bileşenleri farklı platformları hedefler. Örneğin, bir x86 uygulamasında ARM derlemelerini yüklemeye çalışıyorsunuz. Tek tek .NET derlemelerinin hedef platformlarını belirlemek için aşağıdaki komut satırı yardımcı programını kullanabilirsiniz. Dosya listesi, komut satırında boşlukla ayrılmış bir liste olarak sağlanmalıdır.

    C#
    using System;
    using System.IO;
    using System.Reflection;
    
    public class Example
    {
       public static void Main()
       {
          String[] args = Environment.GetCommandLineArgs();
          if (args.Length == 1) {
             Console.WriteLine("\nSyntax:   PlatformInfo <filename>\n");
             return;
          }
          Console.WriteLine();
    
          // Loop through files and display information about their platform.
          for (int ctr = 1; ctr < args.Length; ctr++) {
             string fn = args[ctr];
             if (! File.Exists(fn)) {
                Console.WriteLine("File: {0}", fn);
                Console.WriteLine("The file does not exist.\n");
             }
             else {
                try {
                   AssemblyName an = AssemblyName.GetAssemblyName(fn);
                   Console.WriteLine("Assembly: {0}", an.Name);
                   if (an.ProcessorArchitecture == ProcessorArchitecture.MSIL)
                      Console.WriteLine("Architecture: AnyCPU");
                   else
                      Console.WriteLine("Architecture: {0}", an.ProcessorArchitecture);
    
                   Console.WriteLine();
                }
                catch (BadImageFormatException) {
                   Console.WriteLine("File: {0}", fn);
                   Console.WriteLine("Not a valid assembly.\n");
                }
             }
          }
       }
    }
    
  • C++ yürütülebilir dosyalarına yansıtılması bu özel durumu oluşturabilir. Bunun nedeni büyük olasılıkla C++ derleyicisinin yeniden konumlandırma adreslerinin veya öğesinin çıkarılmasıdır. Bölümü yürütülebilir dosyadan yeniden konumlandırın. C++ yürütülebilir dosyasında .relocation adresini korumak için bağlantı oluştururken /fixed:no belirtin.

BadImageFormatException , 0x8007000B değerine sahip HRESULT COR_E_BADIMAGEFORMATkullanır.

örneğinin ilk özellik değerlerinin BadImageFormatExceptionlistesi için oluşturuculara BadImageFormatException bakın.

Oluşturucular

BadImageFormatException()

BadImageFormatException sınıfının yeni bir örneğini başlatır.

BadImageFormatException(SerializationInfo, StreamingContext)

BadImageFormatException sınıfının yeni bir örneğini serileştirilmiş verilerle başlatır.

BadImageFormatException(String)

Belirtilen hata iletisiyle sınıfının yeni bir örneğini BadImageFormatException başlatır.

BadImageFormatException(String, Exception)

Sınıfın BadImageFormatException yeni bir örneğini belirtilen bir hata iletisiyle ve bu özel durumun nedeni olan iç özel duruma başvuruyla başlatır.

BadImageFormatException(String, String)

Belirtilen hata iletisi ve dosya adıyla sınıfının yeni bir örneğini BadImageFormatException başlatır.

BadImageFormatException(String, String, Exception)

Sınıfın BadImageFormatException yeni bir örneğini belirtilen bir hata iletisiyle ve bu özel durumun nedeni olan iç özel duruma başvuruyla başlatır.

Özellikler

Data

Özel durum hakkında kullanıcı tanımlı ek bilgiler sağlayan bir anahtar/değer çifti koleksiyonu alır.

(Devralındığı yer: Exception)
FileName

Bu özel duruma neden olan dosyanın adını alır.

FusionLog

Derleme yükünün neden başarısız olduğunu açıklayan günlük dosyasını alır.

HelpLink

Bu özel durumla ilişkili yardım dosyasının bağlantısını alır veya ayarlar.

(Devralındığı yer: Exception)
HResult

Belirli bir özel duruma atanan kodlanmış sayısal bir değer olan HRESULT'u alır veya ayarlar.

(Devralındığı yer: Exception)
InnerException

Exception Geçerli özel duruma neden olan örneği alır.

(Devralındığı yer: Exception)
Message

Hata iletisini ve bu özel duruma neden olan dosyanın adını alır.

Source

Hataya neden olan uygulamanın veya nesnenin adını alır veya ayarlar.

(Devralındığı yer: Exception)
StackTrace

Çağrı yığınındaki anlık çerçevelerin dize gösterimini alır.

(Devralındığı yer: Exception)
TargetSite

Geçerli özel durumu oluşturan yöntemini alır.

(Devralındığı yer: Exception)

Yöntemler

Equals(Object)

Belirtilen nesnenin geçerli nesneye eşit olup olmadığını belirler.

(Devralındığı yer: Object)
GetBaseException()

Türetilmiş bir sınıfta geçersiz kılındığında, sonraki bir veya daha fazla özel durumun kök nedeni olan değerini döndürür Exception .

(Devralındığı yer: Exception)
GetHashCode()

Varsayılan karma işlevi işlevi görür.

(Devralındığı yer: Object)
GetObjectData(SerializationInfo, StreamingContext)

SerializationInfo Nesneyi dosya adı, derleme önbellek günlüğü ve ek özel durum bilgileriyle ayarlar.

GetObjectData(SerializationInfo, StreamingContext)

Türetilmiş bir sınıfta geçersiz kılındığında, özel durumla ilgili bilgilerle öğesini SerializationInfo ayarlar.

(Devralındığı yer: Exception)
GetType()

Geçerli örneğin çalışma zamanı türünü alır.

(Devralındığı yer: Exception)
MemberwiseClone()

Geçerli Objectöğesinin sığ bir kopyasını oluşturur.

(Devralındığı yer: Object)
ToString()

Bu özel durumun tam adını ve büyük olasılıkla hata iletisini, iç özel durumun adını ve yığın izlemesini döndürür.

Ekinlikler

SerializeObjectState
Geçersiz.

Bir özel durum, özel durum hakkında serileştirilmiş veriler içeren bir özel durum nesnesi oluşturmak üzere seri hale getirildiğinde gerçekleşir.

(Devralındığı yer: Exception)

Şunlara uygulanır

Ürün Sürümler
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Ayrıca bkz.