"Option Strict On" lässt spätes Binden nicht zu

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

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von knuepel.

    "Option Strict On" lässt spätes Binden nicht zu

    Guten Tag :)

    ich benötige eure Hilfe, ich finde den Fehler nicht bzw. ich kann diesen mir nicht erklären.

    ich habe folgenden Code mit der Fehlermeldung "Fehler 1 "Option Strict On" lässt spätes Binden nicht zu und Fehler 2 "Option Strict On" lässt spätes Binden nicht zu. Fehler 1 ist in Zeile 22 : objShell.CreateShortCut
    Fehler 2 in Zeile 45: foundFiles.Item(lbResults.SelectedIndex).Item

    VB.NET-Quellcode

    1. Imports System.IO
    2. Public Class AuswahlMA
    3. Const BASEFOLDER = "D:\Basis"
    4. Dim objShell As Object = CreateObject("Wscript.Shell")
    5. Dim foundFiles As Hashtable
    6. Private Sub btnSearch_Click(sender As Object, e As EventArgs) Handles btnSearch.Click
    7. foundFiles = New Hashtable
    8. lbResults.Items.Clear()
    9. btnSearch.Enabled = False
    10. SearchFiles(txtSearch.Text, BASEFOLDER, foundFiles)
    11. btnSearch.Enabled = True
    12. End Sub
    13. Sub SearchFiles(strText As String, strPath As String, ByRef col As Hashtable)
    14. Try
    15. If Directory.Exists(strPath) Then
    16. Dim files As String() = IO.Directory.GetFiles("D:\Basis", String.Format("{0}{1}{0}", "*", txtSearch.Text), IO.SearchOption.AllDirectories)
    17. If files.Count > 0 Then
    18. For i = 0 To files.Count - 1
    19. Dim ht As New Hashtable
    20. ht.Add("Name", Path.GetFileNameWithoutExtension(files(i)))
    21. ht.Add("Target", objShell.CreateShortCut(files(i)).TargetPath)
    22. col.Add(i, ht)
    23. lbResults.Items.Add(ht("Name"))
    24. Next
    25. Else
    26. MsgBox("Es wurden keine Verknüpfung mit diesem Namen gefunden!", vbExclamation)
    27. End If
    28. End If
    29. Catch ex As Exception
    30. End Try
    31. End Sub
    32. Private Sub zurück_Click(sender As Object, e As EventArgs) Handles zurück.Click
    33. Me.Close()
    34. End Sub
    35. Private Sub Beenden_Click(sender As Object, e As EventArgs) Handles Beenden.Click
    36. If MsgBox("möchten Sie die Anwendung komplett verlassen?", MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then
    37. Application.Exit()
    38. Else
    39. End If
    40. End Sub
    41. End Class
    ich bin ein Anfänger, bitte habt Verständnis für meine Unwissenheit und eventuelle schlecht gestellte Fragen ?(

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „knuepel“ ()

    Noch eine Info:
    wenn ich die Form aus der eigentlichen Projektmappe entnehme und in einer neuen, ohne den andren Formen laufen lasse, läuft die Form ohne Fehler. Es scheint mit einer andren Form einen Konflikt zu geben.

    hier der andere Code der anderen Form

    gelöscht, war nicht relevant für den Fehler.
    ich bin ein Anfänger, bitte habt Verständnis für meine Unwissenheit und eventuelle schlecht gestellte Fragen ?(

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „knuepel“ ()

    VB.NET-Quellcode

    1. Dim objShell As Object = CreateObject("Wscript.Shell")

    Sorgt meines wissens bei Strict On für einen Fehler. Da dem Object zur Lauzeit der Typ verändert wird.
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    @knuepel Das ist eine der gaaaaanz wenigen Stellen, wo man darüber nachdenken muss, Strict Off zu programmieren.
    Tue dies:
    Zerleg Deine Klasse in einen Teil, der mit Strict On geht und den Rest.
    Füge dem Projekt eine leere Hülse unter dem Namen AuswahlMA.Off.vb hinzu, das sieht dann so aus:

    VB.NET-Quellcode

    1. Option Strict Off
    2. Partial Class AuswahlMA
    3. End Class

    Da packst Du alles rein, was unter Off laufen muss.
    Nun hast Du aber im Projekt diese Datei neben der Form liegen:

    Um das zu ändern, musst Du die VBPROJ-Datei editieren:

    XML-Quellcode

    1. <Compile Include="AuswahlMA.Off.vb">
    2. <SubType>Form</SubType>
    3. </Compile>
    änderst Du in

    XML-Quellcode

    1. <Compile Include="AuswahlMA.Off.vb">
    2. <DependentUpon>AuswahlMA.vb</DependentUpon>
    3. <SubType>Form</SubType>
    4. </Compile>
    und alles ist fein:

    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!

    RodFromGermany schrieb:

    Das ist eine der gaaaaanz wenigen Stellen, wo man darüber nachdenken muss, Strict Off zu programmieren.


    Danke RodFromGermany, es klappt. Nun noch zum Verständnis eine Frage, hätte ich auch es mit der Umstellung der Standardeinstellung und anschließenden schreiben der Form in einer neuen Projektmappe lösen können?
    ich bin ein Anfänger, bitte habt Verständnis für meine Unwissenheit und eventuelle schlecht gestellte Fragen ?(
    @knuepel Klar hättest Du.
    Aber so wird Strict Off auf nur ein Minimum an Code losgelassen.
    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 @knuepel

    Füge unter Referencen
    COM >> Windows Script Host Object
    Dann hast du die Interop.IWshRuntimeLibrary drin

    Und so kannst man dann auch die richtige Instanz machen mit

    Hier ein Beispiel (Link erwähnt)

    VB.NET-Quellcode

    1. Option Strict On
    2. Option Explicit On
    3. Imports System.IO
    4. Imports IWshRuntimeLibrary
    5. Imports System.Windows.Forms
    6. 'http://stackoverflow.com/questions/4897655/create-shortcut-on-desktop-c-sharp
    7. Module Module1
    8. Sub Main()
    9. Dim link As String = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) & Path.DirectorySeparatorChar & Application.ProductName & ".lnk"
    10. Dim shell = New WshShell()
    11. If shell IsNot Nothing Then
    12. Dim shortcut = TryCast(shell.CreateShortcut(link), IWshShortcut)
    13. shortcut.TargetPath = Application.ExecutablePath
    14. shortcut.WorkingDirectory = Application.StartupPath
    15. 'shortcut...
    16. shortcut.Save()
    17. End If
    18. End Sub
    19. End Module


    Freundliche Grüsse

    exc-jdbi
    Nicht ganz OffTopic, da ein Problem bei einer angegebenen Lösung auftaucht.
    @RodFromGermany: Bezüglich Deiner VBPROJ-Änderung: Man erreicht damit, dass die mit Partial versehene Datei quasi zur Erstdatei dazugehört und nicht mehr so aussieht, als wär sie selbständig und gleichwertig neben der Erstdatei. Geht die Abhängigkeit noch darüber hinaus?
    Wenn man jetzt im Projektmappen-Explorer einen Doppelklick auf die mit Partial versehene Datei macht, erzeugt es bei mir ne Pseudoform, die mit der Hauptform aus der Erstdatei quasi konkurriert. Gibt es einen Weg, diese Form richtig zu umgehen, um quasi per Doppelklick auf die Datei sofort zum Code zu kommen? Ich mach es zwar so, dass ich in der Erstdatei die per Horcrux Partial aufgeteilte Klasse mit <DesignerCategory("")> versehe und so den Designer-Part zeitweise deaktiviere, aber das geht doch bestimmt auch in Schön, oder?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    Geht die Abhängigkeit noch darüber hinaus?
    Ja.
    Das mit der Pseudo-Form ist leider so, da kann man nix machen, nur aufpassen und F7 drücken.
    Das mit der Designer-Kategorie greift für die gesamte Klasse, also bekommst Du den Designer nicht auf.

    XML-Quellcode

    1. <Compile Include="AuswahlMA.Off.vb">
    2. <DependentUpon>AuswahlMA.vb</DependentUpon>
    3. <SubType>Code</SubType>
    4. </Compile>
    5. <Compile Include="AuswahlMA.vb">
    6. <SubType>Form</SubType>
    7. </Compile>
    8. <Compile Include="AuswahlMA.Designer.vb">
    9. <DependentUpon>AuswahlMA.vb</DependentUpon>
    10. <SubType>Form</SubType>
    11. </Compile>
    Besser ist es, da aufzupassen.
    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!
    Ich deaktiviere mit dem Attribut den kompletten Klassendesigner, da ich zu 95% der Zeit eh nur am Code arbeite. Sollte ich den Designer mal wieder brauchen, kommentiere ich das Attribut aus, nehm meine Änderungen am FormDesign vor und aktivier danach das Attribut wieder.
    OK, alles geklärt.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    RodFromGermany schrieb:

    Aber so wird Strict Off auf nur ein Minimum an Code losgelassen

    Das macht in meinen Fall Sinn, Danke noch mal.

    exc-jdbi schrieb:

    Füge unter Referencen
    COM >> Windows Script Host Object
    Dann hast du die Interop.IWshRuntimeLibrary drin
    Und so kannst man dann auch die richtige Instanz machen mit

    Danke dafür.
    ich bin ein Anfänger, bitte habt Verständnis für meine Unwissenheit und eventuelle schlecht gestellte Fragen ?(