none
Frage zur gemischten Verwendung von x86 und AnyCPU RRS feed

  • Frage

  • Ich habe eine Frage zu einem allgemeinen, aber recht konkreten "Problem":

    Ich programmiere in der Regel Anwendungen, die per Default in der Konfiguration "AnyCPU" kompiliert werden sollen. Unter anderem werden wiederverwendbare Komponenten eingebunden, die ebenfalls auf meinem/unserem Mist gewachsen sind.

    Eine dieser Komponenten beinhaltet nun einen Aufruf einer DLL, die nur als 32-Bit-Version vorliegt, d.h. ich erstelle die Komponente ausschließlich in der Konfiguration "x86".

    Was passiert nun in einem Projekt, das diese Komponente verwendet, selbst aber mit "AnyCPU" kompiliert wird?

    a) Die resultierende EXE wird auf 64-Bit-Systemen auch im 64-Bit-Modus ausgeführt (AnyCPU halt), aber wenn die für x86 kompilierte Komponente aufgerufen oder geladen wird, wird eine Exception (FileNotFound o.ä.) ausgelöst - spätestens jedoch wenn eine der Funktionen in der 32bit-DLL aufgerufen wird.

    b) Der Compiler erkennt in den Verweisen, dass eine referenzierte Komponente nur für die Plattform "x86" vorliegt und vererbt diese Einschränkung an die kompilierte Anwendung weiter. Auch auf 64-Bit-Systemen wird die Anwendung also nur im 32-Bit-Subsystem ausgeführt.

    Was ist richtig? a oder b?

     

    Die Frage beschäftigt mich insofern, als dass ich die Situation vermeiden möchte, dass ich (oder ein Kollege) so eine 32bit-Komponente in seinen Projekten nutzt und dabei übersieht, dass sie nur für x86 "zugelassen" ist, das aber erst beim Kunden, der 64-Bit-Systeme nutzt, auffällt. In diesem Fall wäre (b) für mich angenehmer.

    Mittwoch, 18. Januar 2012 13:01

Antworten

  • Hallo Ralf,

     

    a) ist richtig  (mehr oder weniger), wenn du 32Bit DLLs hast auf die du zugreifen must, solltest du beim Compieler x86 einstellen.

     

    MFG

    Björn

    • Als Antwort markiert Ralf Brostedt Freitag, 20. Januar 2012 11:56
    Mittwoch, 18. Januar 2012 14:06
  • Antwort selbst gefunden:

    ...
    <Obsolete("Diese Klasse unterstützt nur 32 Bit. Bitte nur x86 als Projekt-Konfiguration auswählen.", True)> _
    ...
    

    Jetzt gibts statt ner Warnung direkt einen Fehler, der nicht mehr übersehen werden kann.

    • Als Antwort markiert Ralf Brostedt Freitag, 20. Januar 2012 11:56
    Freitag, 20. Januar 2012 11:55

Alle Antworten

  • Hallo Ralf,

     

    a) ist richtig  (mehr oder weniger), wenn du 32Bit DLLs hast auf die du zugreifen must, solltest du beim Compieler x86 einstellen.

     

    MFG

    Björn

    • Als Antwort markiert Ralf Brostedt Freitag, 20. Januar 2012 11:56
    Mittwoch, 18. Januar 2012 14:06
  • Vielen Dank für Antwort. Ich hab natürlich auch noch ein bisschen selbst experimentiert und das deckt sich mit meinen Ergebnissen. Ich habe - was solche Komponenten angeht - auch schon einen für mich praktikablen Weg gefunden.

    Jetzt gibt es aber einen weiteren Fall in diesem Zusammenhang, den ich gerne ebenfalls "elegant" lösen will.

    Und zwar benutze ich gerne ab und zu wiederverwendbaren Code nicht in Form einer eigenen Komponente, sondern als Quellcode-Datei (.vb, .cs), die in verschiedenen Projekten wiederverwendet wird. Wie so eine Art statisches Include sozusagen.

    Eine dieser Dateien enthält jetzt auch solche Aufrufe in externen 32bit-DLLs, die unter 64bit natürlich nicht funktionieren können. Von daher dürfen Projekte, die das nutzen möchten, sinnvollerweise nur als "x86" kompiliert werden. Damit das aber nicht übersehen wird, soll die Entwicklungsumgebung das beim Einbau einer solchen Datei direkt an exponierter Stelle einblenden. Am liebsten wäre es mir als Compilerfehler.

    Mit ein bisschen Recherche habe ich zumindest schonmal folgenden Notbehelf gefunden:

     

    #If PLATFORM <> "x86" Then
    <Obsolete("Diese Klasse unterstützt nur 32 Bit. Bitte nur x86 als Projekt-Konfiguration auswählen.")> _
    Public Class Only32BitSupported
    #Else
    Public Class Only32BitSupported
    #End If
      Inherits System.Attribute
    End Class
    
    
    <Only32BitSupported()> _
    Public NotInheritable Class Irgendwas
    
    '... ruft 32bit-DLLs auf
    
    End Class
    

     


    Dieses Konstrukt hat zur Folge, dass bei jeder Konfiguration außer "x86" zumindest eine Compiler-Warnung erscheint, die im Warntext auch gleich sagt, was Sache ist.

    Welche Möglichkeiten gibt es, statt einer automatischen Warnung direkt einen Fehler zu erhalten? Denn Warnungen kann man gerne mal ignorieren/übersehen...


    Freitag, 20. Januar 2012 11:43
  • Antwort selbst gefunden:

    ...
    <Obsolete("Diese Klasse unterstützt nur 32 Bit. Bitte nur x86 als Projekt-Konfiguration auswählen.", True)> _
    ...
    

    Jetzt gibts statt ner Warnung direkt einen Fehler, der nicht mehr übersehen werden kann.

    • Als Antwort markiert Ralf Brostedt Freitag, 20. Januar 2012 11:56
    Freitag, 20. Januar 2012 11:55