Mit OS-abhängigen Code arbeiten



  • Hoi,
    wie verpackt man in C# OS-abhängigen Code?
    Ich versuche hier ein Tool für Linux (Mono) und Windows (.NET) laufbar zu bekommen.
    In C++ würde man hier mit dem Preprozessor ansetzen. Wie macht man es unter C#?

    Danke & Grüße,
    Ethon



  • Kannst doch auch machen.



  • Ethon schrieb:

    wie verpackt man in C# OS-abhängigen Code?

    Ich würde das einfach abstrahieren, so dass man eine Funktion/Klasse hat die man plattformunabhängig aufruft.
    Dann am Anfang des Programms das OS abfragen, und in der Klasse/Funktion zur Laufzeit eine Unterscheidung machen und entsprechend den OS-abhängigen Code aufrufen.



  • @Ethon
    Was willst du denn erreichen?
    In C# kannst du genau so über den PP arbeiten - gibt ja #if .

    Wenn du aber erreichen willst dass es nur eine .exe gibt die auf allen OSen läuft, dann geht das natürlich nicht mit #if (geht in C++ ja auch nicht mit #ifdef ).
    In dem Fall könntest du den ganzen OS-abhängigen Code in je eine Assembly pro OS packen.
    Um dann OS-abhängige Klassen zu erzeugen fallen mir drei Möglichkeiten ein:

    1. Die Assembly dynamisch laden und dann über Reflection die Klassen instanzieren. Das geht, ist aber nicht gerade elegant.

    2. Du klickst in der IDE des OS unter dem du entwickelst eine Referenz auf die Implementierung für dieses OS ein, und verwendest die DLL dann einfach. Damit je nach OS die richtigen Assembly geladen wird hängst du dich in den AppDomain.AssemblyResolve Event rein, und lädst dort dann die passende Assembly mit Assembly.LoadFile.

    3. Wie 2, nur dass irgendwie anders dafür sorgst dass die passende Assembly gefunden wird.
      3.1) Du kopierst die passende Assembly aus einem Unterverzeichnis in dein Progammverzeichnis bevor sie benötigt wird (=bevor die erste Klasse aus der Assembly verwendet wird).
      3.2) Du kopierst die passende Assembly mit nem Installer ins Programmverzeichnis.
      3.3) Du installierst die passende Assembly mit nem Installer in den GAC.

    Die beste von diesen Möglichkeit ist mMn. (3) -- welche der drei Subvarianten hängt dann davon ab ob dein Programm "portable" sein soll oder nicht, und falls nicht, ob du in den GAC installierst oder einfach nur Files kopierst.

    Ich wäre aber nicht überrascht wenn es noch besser ginge.



  • Danke für die Antworten!
    War mir garnicht bewusst das es in C# eine Preprozessor gibt, hab mit der Sprache nicht so viel am Hut gehabt - wobei sie mir super gefällt. 😉

    Ich habe hier einen Code der für Windows geschrieben ist - er macht einen DllImport auf Funktionen aus der Kernel32.dll . Ich möchte den Code unter Linux & Mono laufbar machen, dh. ich möchte den Windows Code bei Linux als Target durch äquivalenten Code ersetzen der aus der libc.so importiert.

    Also scheint das mit dem Preprozessor der richtige Weg zu sein.


Anmelden zum Antworten