none
Frage zu _"Option Strict On" lässt spätes Binden nicht zu._ RRS feed

  • Frage

  • Hallo ich habe ein einen kleinen Servicetool an dem ich arbeite , einen Button der zu einem als Anzeige für den Status für die Windowsfirewall funtioniert zum anderen aber auch die möglichkeit bietet diese an und abzuschalten. War eigentlich ganz stolz darauf das alles fehlerfrei funktioniert, allerdings als ich "Option Strict On" getestet habe, bekomme ich zwei mal den Fehler  "Option Strict On" lässt spätes Binden nicht zu" Das Tool funktioniert zwar einwandfrei Auf Xp und Vista allerdings läst es mir keine Ruhe das "Option Strict" mir diesen Fehler bringt, denn ich wollte mir eigentlich angewöhnen sauber zu Programmieren.  Das Tool hatte ich in  ca einer halben Stunde geschrieben aber nun sitze ich schon seit unzähligen Stunden vor diesen Fehler, und weiß nicht wie ich anders lösen könnte um diesen Fehler wegzubekommen, ohne dabei neue fehler zu erzeugen. Das liegt warscheinlich auch daran das ich nicht wirklich verstehe was  mit dem späten Binden gemeint ist. ( Bin eben doch noch Anfänger dabei dachte ich es wird langsam)

    Hier mal der Code vllt könnnt ihr mir zeigen wie es richtig aussehen sollte:  die beiden Fehler habe ich mit Pfeil " < -----FEHLER " markiert
    Option Strict On
    Public Class Form1
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            
            IstFirewallAngeschaltet()
        End Sub
    #Region "Firewall"
        'Funktion Firewall an
        Public Function SetWindowsFirewallOn() As Long
            Interaction.Shell("netsh firewall set opmode enable", AppWinStyle.Hide, False, -1)
            Return 1
        End Function
        'funktion Firewall aus
        Public Function SetWindowsFirewallOut() As Long
            Interaction.Shell("netsh firewall set opmode disable", AppWinStyle.Hide, False, -1)
            Return 1
        End Function
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Try
                If (Me.Label2.Text = "Die Windowsfirewall ist ausgeschaltet") Then
                    Me.SetWindowsFirewallOn()
                    Me.Label2.Text = "Die Windowsfirewall ist eingeschaltet"
                    Me.Button1.Text = "Die Windowsfirewall ist eingeschaltet"
                    Me.Button1.BackColor = Color.LawnGreen
                Else
                    Me.SetWindowsFirewallOut()
                    Me.Label2.Text = "Die Windowsfirewall ist ausgeschaltet"
                    Me.Button1.Text = "Die Windowsfirewall ist ausgeschaltet"
                    Me.Button1.BackColor = Color.OrangeRed
                End If
            Catch
            End Try
        End Sub
        Private Function IstFirewallAngeschaltet() As Boolean
            Try
                ' Variablen deklarieren...
                Dim FirewallProgrammId As Object
                Dim ErgebnisDerAbfrage As Object
                Dim Firewallstatus As Boolean
    
    
                
                FirewallProgrammId = CreateObject("HNetCfg.FwMgr")
                ErgebnisDerAbfrage = FirewallProgrammId.LocalPolicy.CurrentProfile' < ------FEHLER
              
                If ErgebnisDerAbfrage.FirewallEnabled Then ' <---FEHLER
                    Firewallstatus = True
                    Label2.Text = " Die Windowsfirewall ist eingeschaltet"
                    Button1.Text = " Die Windowsfirewall ist eingeschaltet"
                    Button1.BackColor = Color.LawnGreen
                Else
                   
                    Firewallstatus = False
                    Label2.Text = " Die Windowsfirewall ist ausgeschaltet"
                    Button1.Text = " Die Windowsfirewall ist ausgeschaltet"
                    Button1.BackColor = Color.OrangeRed
                End If
    
            Catch
    
            End Try
    
        End Function
    #End Region
    End Class

    Gruß Ronny
    Mittwoch, 16. Dezember 2009 19:38

Antworten

  • Hallo Ronny,

    spätes Binden bedeutet, dass der Compiler während der Entwicklung nicht weiß, welche Schnittstelle verwendet werden soll, sondern dass dies erst zur Laufzeit bestimmt wird. In Deinem Beispiel, weiß der Compiler nicht, dass das Objekt "HNetCfg.FwMgr" die Eigenschaft oder Methode LocalPolicy bereitstellt. Dies würde erst zur Laufzeit festgestellt, indem vor dem Aufruf, das Objekt abgefragt wird, ob es diese Eigenschaft oder Methode kennt. Option Strict On erwartet jetzt aber, dass alle verwendeten Schnittstellen und Objekte bekannt sind, um Laufzeitfehler, die durch Verwendung der falschen Datentypen entstehen können, zu vermeiden.

    Du hast hier jetzt zwei Möglichkeiten, das Problem zu umgehen:

    1. Du lagerst die Funktionen in eine separate Codedatei aus, die späte Bindung erfordern und stellst für diese "Option Strict Off" ein.

    2. Du besorgst Dir die Schnittstellenbeschreibung (da Du mit einem COM Objekt arbeitest, eine TypeLib/DLL) für das verwendete Objekt und fügst diese als Verweis zu Deinem Projekt hinzu. Vorteil bei dieser Lösung, dass Du nicht nur Typsicherheit hast, sondern auch Hilfe durch IntelliSense bekomst, wie bei .NET Objekten auch.

    Da Du sauber programmieren möchtest, solltest Du Dir auch die Process-Klasse des .NET Framework anschauen. Hier hast Du mehr Kontrollmöglichkeiten, wenn Du externe Prozesse starten möchtest, als bei der legacy Shell Methode.
    Thorsten Dörfler
    Microsoft MVP Visual Basic
    • Als Antwort markiert Wild-Life78 Donnerstag, 17. Dezember 2009 10:52
    Mittwoch, 16. Dezember 2009 19:58
    Moderator