Unterschiedlicher Code für .NET Framework 4.5 und .NET Standard

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von mbfan.

    Unterschiedlicher Code für .NET Framework 4.5 und .NET Standard

    Hallo,
    ich bin aktuell dabei, eine Library von einer reinem .NET Framework 4.5 auf .NET Standard umzustellen, da ich sie gleichfalls in einem Framework-Projekt wie in einem Core-Projekt benötige. Dafür habe ich eine .NET Standard-Library erstellt, die als TargetFrameworks netstandard2.0 und net45 benutzt.
    Nun habe ich jedoch eine Klasse, die System.Management benötigt, jedoch auch nur im Framework-Projekt laufen muss. Um nicht nur wegen dieser einen Klasse zwei Projekte anzulegen, habe ich, wie hier beschrieben, #IF-Statements benutzt:

    VB.NET-Quellcode

    1. ​#If net45 Then
    2. Imports System.Management
    3. #End If
    4. Imports System.Net.NetworkInformation
    5. Imports System.Security.Cryptography
    6. Imports System.Text
    7. Namespace Helpers
    8. Public Class ComputerInfo
    9. #If net45 Then
    10. Public Shared Function Get_HWID() As String
    11. Dim txt As String = ""
    12. Dim hw As New ComputerInfo
    13. If Type.GetType("Mono.Runtime") Is Nothing Then
    14. Dim hdd, cpu, mb As String
    15. cpu = hw.GetProcessorId()
    16. hdd = hw.GetVolumeSerial("C")
    17. mb = hw.GetMotherBoardID()
    18. txt = cpu & hdd & mb
    19. Else
    20. txt = "MonoRuntime" & hw.GetMACAddress()
    21. End If
    22. Dim hwid As String = GenerateSHA512String(txt)
    23. Return hwid
    24. End Function
    25. #End If
    26. #If netstandard2 Then
    27. Public Shared Function Get_HWID() As String
    28. Throw New NotImplementedException("This Function is only Implemented for .NET Framework 4.5")
    29. End Function
    30. #End If
    31. [...]
    32. End Class
    33. End Namespace

    Alles schön und gut - nur dass es die Methode nun überhaupt nicht mehr erkannt wird.
    Hat da jemand eine andere Idee?
    Nico
    You should live for that what you belive. - Drag-Drop Beschreibung

    mbfan schrieb:

    nur dass es die Methode nun überhaupt nicht mehr erkannt wird.
    Da musst Du im Projekt den betreffenden Compilerschalter bereitstellen:
    Projekt => Kompilieren => Erweiterte Kompilierungsoptionen ...

    dann wird er Dir auch angeboten:

    Und in Benutzung sieht das so aus:
    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).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo,
    wenn ich das richtig verstehe muss ich das dann also jedes mal ändern, wenn ich auf eine andere Plattform wechsele?
    Nico
    You should live for that what you belive. - Drag-Drop Beschreibung
    @mbfan Nein.
    Du kannst neue Konfigurationen Deines Projekts erstellen und in denen dann die Compilerschalter definieren.
    Studio -> Erstellen -> Konfigurationsmanager ...
    Konfiguration der aktuellen Projektmappe -> Neu ==> Hinzufügen { neuer Name, kopieren von von Release | Debug }

    Die erscheinen dann in der Auswahl:

    Projekt -> Eigenschaften -> Kompilieren ==> Benutzerdefinierte Konstanten:
    netstandard2="netstandard2" für DebugStandard und ReleaseStandard eintragen
    und losproggen:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. #If netstandard2 = "netstandard2" Then
    4. Me.Text = "netstandard2"
    5. #Else
    6. Me.Text = "netstandard1"
    7. #End If
    8. End Sub
    9. End Class
    Nun musst Du nur die zu erstellende Konfiguration auswählen, erstellen 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).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo,
    ich habe das Problem jetzt anders gelöst.
    In der .vbproj-XML habe ich die folgenden Zeilen hinzugefügt:

    XML-Quellcode

    1. <Project Sdk="Microsoft.NET.Sdk">
    2. <PropertyGroup>
    3. <TargetFrameworks>netstandard2.0;net45</TargetFrameworks>
    4. [...]
    5. </PropertyGroup>
    6. [...]
    7. <PropertyGroup Condition="'$(TargetFramework)' == 'net45'">
    8. <DefineConstants>Target="net45"</DefineConstants>
    9. </PropertyGroup>
    10. <PropertyGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
    11. <DefineConstants>Target="netstandard2"</DefineConstants>
    12. </PropertyGroup>
    13. </Project>


    Somit konnte ich denn in der Codedatei die folgende Variante benutzten:

    VB.NET-Quellcode

    1. ​#If Target = "net45" Then
    2. Imports System.Management
    3. #End If
    4. Imports System.Net.NetworkInformation
    5. Imports System.Security.Cryptography
    6. Imports System.Text
    7. Namespace Helpers
    8. Public Class ComputerInfo
    9. #If TARGET = "net45" Then
    10. Public Shared Function Get_HWID() As String
    11. Dim txt As String = ""
    12. Dim hw As New ComputerInfo
    13. If Type.GetType("Mono.Runtime") Is Nothing Then
    14. Dim hdd, cpu, mb As String
    15. cpu = hw.GetProcessorId()
    16. hdd = hw.GetVolumeSerial("C")
    17. mb = hw.GetMotherBoardID()
    18. txt = cpu & hdd & mb
    19. Else
    20. txt = "MonoRuntime" & hw.GetMACAddress()
    21. End If
    22. Dim hwid As String = GenerateSHA512String(txt)
    23. Return hwid
    24. End Function
    25. #Else
    26. Public Shared Function Get_HWID() As String
    27. Throw New NotImplementedException("This Function is only Implemented for .NET Framework 4.5")
    28. End Function
    29. #End If
    30. [...]
    31. End Class
    32. End Namespace
    You should live for that what you belive. - Drag-Drop Beschreibung