Visual Studio: Abhängig von #defines kompilieren



  • Hallo Forum,

    ich programmiere eine DLL als Erweiterung für eine Anwendung. Wenn ich meine DLL zB für die Anwendung Version 1.0 kompiliere, dann muß ich eine Funktion so aufrufen:

    int RetVal = App.MyFunc(Param);
    

    Und wenn ich für die Anwendung Version 2.0 kompiliere, dann lautet die gleiche Anweisung:

    NameSpaceX.SpecialClass RetVal = App.MyNewFunc(Param);
    

    Bei den Konfigurationen im Visual Studio habe ich jetzt V1 und V2 definiert. Ich könnte jetzt sowas machen:

    #if V1
    int RetVal = App.MyFunc(Param);
    #elif V2
    NameSpaceX.SpecialClass Retval = App.MyNewFunc(Param);
    #endif
    

    Ich müsste das jetzt hundertfach im Source einstreuen. Gibt es eine elegantere Lösung? Ich dachte jetzt an:

    #if V1
    #define _RETVAL int
    #define _FUNC MyFunc
    #elif V2
    #define _RETVAL NameSpaceX.SpecialClass
    #define _FUNC MyNewFunc
    #endif
    
    ...
    
    _RETVAL RetVal = App._FUNC(Param);
    

    Wie macht ihr das?



  • Das geht wahrscheinlich nicht. Ich habe jetzt eine Kapselfunktion geschrieben:

    public static int ExecuteFunc(MyApp, string Param) {
    #if (V1Debug || V1Release)
                int i = MyApp.MyFunc(Param);
                return i;
    #elif (V2Debug || V2Release)
                NameSpaceX.SpecialClass Retval = MyApp.MyNewFunc(Param);
                return Retval.IntRetVal;
    #else
                throw new Exception("Not implemented");
    #endif
            }
    


  • abcd schrieb:

    Das geht wahrscheinlich nicht. Ich habe jetzt eine Kapselfunktion geschrieben:

    public static int ExecuteFunc(MyApp, string Param) {
    #if (V1Debug || V1Release)
                int i = MyApp.MyFunc(Param);
                return i;
    #elif (V2Debug || V2Release)
                NameSpaceX.SpecialClass Retval = MyApp.MyNewFunc(Param);
                return Retval.IntRetVal;
    #else
                throw new Exception("Not implemented");
    #endif
            }
    

    Warum nicht

    public static int ExecuteFunc(MyApp, string Param) {
    #if (V1Debug || V1Release)
                int i = MyApp.MyFunc(Param);
                return i;
    #elif (V2Debug || V2Release)
                NameSpaceX.SpecialClass Retval = MyApp.MyNewFunc(Param);
                return Retval.IntRetVal;
    #else
                #error Not implemented
    #endif
            }
    


  • Das es diese Anweisung gibt wußte ich nicht. Dann schlägt der Fehler schon zur Compilezeit ein. Danke.



  • Gibt übrigens auch #warning, auch sehr praktisch zum Markieren von TODOs o.ä.



  • Danke für den Tip 🙂


Log in to reply