Wie überprüfe ich die Ziel-CPU?

  • VB.NET

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von exc-jdbi.

    Wie überprüfe ich die Ziel-CPU?

    Ich möchte einen bestimmten Code nur kompilieren wenn die passende Ziel-CPU eingestellt ist ("AnyCPU", "x86" oder "x64"), gibt es dafür einen vordefinierten Makro?

    VB.NET-Quellcode

    1. #Const architecture = "x64"
    2. #If architecture = "x86" Then
    3. System.Console.WriteLine("32-Bit Code")
    4. #Else
    5. System.Console.WriteLine("64-Bit Code")
    6. #End If

    (Eine manuelle Lösung)
    "Denken ist die schwerste Arbeit, die es gibt. Das ist wahrscheinlich auch der Grund, warum sich so wenig Leute damit beschäftigen." - Henry Ford

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Vultrax“ ()

    @Bluespide & @Cheffboss - Danke erstmal Für Eure Antworten!

    Wie ich die Architektur meiner Anwendung während der Laufzeit feststellen kann weiß ich bereits. Der Code soll nicht kompiliert werden wenn sich die Ziel-CPU geändert hat (hab's ungünstig beschrieben).
    "Denken ist die schwerste Arbeit, die es gibt. Das ist wahrscheinlich auch der Grund, warum sich so wenig Leute damit beschäftigen." - Henry Ford
    Wie soll ein Programm bevor es startet prüfen ob das System auf dem es installiert wurde ein X-bit System ist ohne zu starten?
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    @mrMo

    Es geht um die Architektur von meinem Programm, nicht um die vom Betriebssystem.
    In meinem Programm gibt es Funktionen die nur mit 64-Bit (Ziel-CPU: "x64") lauffähig sind und nicht mit 32-Bit (Ziel-CPU: "AnyCPU" oder "x86")
    Wenn ich also die Ziel-CPU z.B. auf "x86" (32-Bit) ändere, soll der von mir festgelegte 64-Bit Code nicht mehr kompiliert werden (wie in meinem Beispiel, allerdings muss ich die #const selbst ändern, was aber automatisch passieren soll).
    "Denken ist die schwerste Arbeit, die es gibt. Das ist wahrscheinlich auch der Grund, warum sich so wenig Leute damit beschäftigen." - Henry Ford

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Vultrax“ ()

    Schau mal bei stackoverflow vorbei: Bedingte Konstantendefinition in der Projektdatei und weiter geht's.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    @Vultrax Leg Dir in Deinem Projekt ausschließlich die Konfigurationen für x64 an, lösch AnyCPU und x86 und feddich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    @VaporiZed
    Damit habe ich mir wohl gerade meine Projektdatei zerschossen. Wenn ich es in die Projektdatei kopiere, dann kann sie nicht mehr richtig geladen werden.
    [stackoverflow.com/a/28183543]

    @RodFromGermany
    Was meinst Du damit? Den 32-Bit Code benötige ich aber auch, da z.B. das Auflisten der Prozess-Module (von einem 32-Bit Prozess) nicht mit einem 64-Bit Prozess möglich ist, weswegen ich dann auch meine eigene Architektur umstellen muss. Das Betriebssystem ist im Moment nicht wichtig, die Kompatibilität von meinem Programm möchte ich aber dennoch beibehalten.
    "Denken ist die schwerste Arbeit, die es gibt. Das ist wahrscheinlich auch der Grund, warum sich so wenig Leute damit beschäftigen." - Henry Ford

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Vultrax“ ()

    Vultrax schrieb:

    Den 32-Bit Code benötige ich aber auch
    Schreib eine vollständige und belastbare Aufgabenstellung / Problembeschreibung!
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    Ich möchte einfach nur mit #if-Abfragen meinen Code automatisch auf die eingestellte Ziel-CPU (Architektur) umstellen, also den nicht verfügbaren Code deaktivieren oder anpassen. Wie man mit #if-Abfragen umgeht ist mir klar und das ist auch nicht das Problem, es geht mir um eine automatische Lösung für "#Const architecture", weil ich es im Moment jedes Mal manuell ändern muss.

    VB.NET-Quellcode

    1. #Const architecture = "x64"
    2. #If architecture = "x86" Then
    3. System.Console.WriteLine("32-Bit Code")
    4. #Else
    5. System.Console.WriteLine("64-Bit Code")
    6. #End If

    @petaod
    Danke dir, funktioniert bei mir aber leider nicht. Ich mach's vielleicht falsch. Kannst du mir überprüfen, ob's bei dir geht? :)
    [stackoverflow.com/a/1313450]
    "Denken ist die schwerste Arbeit, die es gibt. Das ist wahrscheinlich auch der Grund, warum sich so wenig Leute damit beschäftigen." - Henry Ford
    Mit dem in der vbproj klappt's bei mir, Quelle: MSDN:

    XML-Quellcode

    1. <Choose>
    2. <When Condition=" '$(PlatformTarget)' == 'x86' ">
    3. <PropertyGroup>
    4. <DefineConstants>X86</DefineConstants>
    5. </PropertyGroup>
    6. </When>
    7. <When Condition=" '$(PlatformTarget)' == 'x64' ">
    8. <PropertyGroup>
    9. <DefineConstants>X64</DefineConstants>
    10. </PropertyGroup>
    11. </When>
    12. </Choose>

    Bilder
    • ConditionalCompiling.png

      5,58 kB, 422×215, 19 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    @Vultrax Dann musst Du Dein Projekt für x86 und x64 separat compilieren und einen Compilerschalter für 32- und für 64-Bit machen und diesen abfragen.


    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. #If CPU = "win32" Then
    4. MessageBox.Show("32 Bit")
    5. #ElseIf CPU = "win64" Then
    6. MessageBox.Show("64 Bit")
    7. #End If
    8. End Sub
    9. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    @Bluespide @VaporiZed und @RodFromGermany
    Es funktioniert merkwürdigerweise immer noch nicht. Der Fehler liegt vielleicht beim IDE (Visual Studio 2019)?
    Könnt ihr mir ein Beispiel-Projekt hochladen? Ich möchte mir das gerne mal anschauen.
    "Denken ist die schwerste Arbeit, die es gibt. Das ist wahrscheinlich auch der Grund, warum sich so wenig Leute damit beschäftigen." - Henry Ford
    Einfach in den Projekteigenschaften bei Kompilieren zwischen x86 und x64 wechseln und speichern, dann ändert sich die Codeabzweigung in der Form1.VB.
    Dateien
    • WindowsApp2.zip

      (12,11 kB, 2 mal heruntergeladen, zuletzt: )
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Nicht bei mir.
    "Plattform" selber kann ich nicht einstellen. Und die Änderungen bei Ziel-CPU führen zu keinen Codeänderungen.
    Bilder
    • ConditionalCompilingFails.png

      10,62 kB, 329×316, 9 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.