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

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

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

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

    Hallo,

    ich verstehe diese Fehlermeldung nicht. Ich weiß, mittlerweile, das es an der Definition bzw. das "Dimmen" liegt. Nur weiß ich nicht wie ich es "gerade" biegen kann.

    Der Code:

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.Net.Mail
    3. Class Form1
    4. Dim Versender As String = "XXX@gmail.com"
    5. Dim Adressat As String = "YYY@gmail.de"
    6. Private Sub btnEMailSenden_Click(sender As Object, e As EventArgs) Handles btnEMailSenden.Click
    7. SendMail("Die ist ein Test", "Hallo," & vbCrLf & "Schauen wir mal was hier rauskommt.", , "YYY@gmail.de")
    8. End Sub
    9. Public Sub SendMail(ByVal Betreff As String, _
    10. ByVal Bodytext As String, _
    11. Optional ByVal Anhang As String = "Datei als Anhang", _
    12. Optional ByVal Empfaenger As String = "YYY@gmail.de")
    13. Try
    14. '--- Check ob der Outlook Prozess läuft (Bei Windows 8 zwingend notwendig)
    15. If Process.GetProcessesByName("outlook").Count > 0 Then
    16. '--- Tue nichts, alles fein ---
    17. Else
    18. '--- Outlook starten ---
    19. Process.Start("outlook")
    20. Application.DoEvents()
    21. End If
    22. '--- notwendige Objekte des Outlook Objektmodels initialisieren ---
    23. Dim objOutlook As Object
    24. Dim objOutlookMsg As Object
    25. Const cMailItem = 0
    26. '--- evtl. weitere wichtige, selbsterklärende Konstanten ---
    27. 'Const cBCC = 3
    28. 'Const cImportanceHigh = 1
    29. 'Const cCC = 2
    30. Const cTo = 1
    31. '--- erstellen der notwendigen Objekte ---
    32. objOutlook = CreateObject("Outlook.Application")
    33. objOutlookMsg = objOutlook.CreateItem(cMailItem)
    34. '--- Zusammenbasteln der Mail ---
    35. With objOutlookMsg
    36. Dim objOutlookRecip As Object = .Recipients.Add(Empfaenger)
    37. objOutlookRecip.type = cTo
    38. .Subject = Betreff
    39. .Body = Bodytext
    40. If Anhang <> "Datei als Anhang" Then .Attachments.add(Anhang)
    41. '.Importance = olImportanceHigh
    42. .send() ' Display() zeigt die neue Nachricht, .Send() sendet direkt
    43. End With
    44. '--- Objekte zerstören ---
    45. objOutlookMsg = Nothing
    46. objOutlook = Nothing
    47. Catch ex As Exception
    48. '--- Fehler abfangen falls kein Outlook installiert ist ---
    49. 'MsgBox(ex.Message)
    50. '----------------------------------------------------------
    51. End Try
    52. End Sub
    53. End Class


    Vorteil dieses Code: Unabhängig von der Outlookversion. Und,jaaaa, ich habe es kopiert.

    Ab:

    Quellcode

    1. objOutlookMsg = objOutlook.CreateItem(cMailItem)


    wird es unterstrichen. Mit der o.g. Fehlermeldung.

    Unter msdn.microsoft.com/de-de/library/0tcf61s1(v=vs.120).aspx wird auch das frühe bzw. späte Binden erklärt.

    Ich muß also das Objekt per CType in das richtige Format bekommen, das der Prozess nicht nur ein Prozess, sondern direkt ein ...... ist.

    Kann einer helfen? Wie würde es richtig aussehen?

    Ich habe mittlerweile das gefunden:

    https://support.microsoft.com/de-de/kb/304661

    Erklärt das frühe und späte Binden, auch so das ich es verstehe.

    Also, bedeutet die Fehlermeldung " "Option Strict On" lässt spätes Binden nicht zu." das ich die "Option Strict" auf "Off" stellen muß um meine Kompatibilität zu Outlook zu erhalten?

    Gruß Nichtheilig

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

    Nichtheilig schrieb:

    Also, bedeutet die Fehlermeldung " "Option Strict On" lässt spätes Binden nicht zu." das ich die "Option Strict" auf "Off" stellen muß um meine Kompatibilität zu Outlook zu erhalten?
    Das wäre in dieem Fall die einfachste Möglichkeit.
    Also über dieses Modul drüber schreiben Option Strict Off - alle anderen Module Strict On lassen.

    Möglicherweise könnte man dein Modul auch Strict On umschreiben, aber das hängt von deim installierten Office ab, und es gibt glaub auch Wrapper-Bibliotheken, auch für verschiedene Versionen und pipapo - alles Sachen, die man so über Forum-Posts schlecht vermitteln kann.
    Also lasses so quick&dirty as it is, und ändere am besten nie was an diesem Code - wenn er denn funktioniert, insbesondere nichts hinzufügen.
    Achso, eins doch: Mach den TryCatch weg.
    TryCatch ist ein heißes Eisen
    Es sei denn, es ist dir egal, dass das Proggi tut als ob was gesendet worden wäre, auch wenns (aufgrund eines beliebigen Fehlers) garnet stimmt.

    Nichtheilig schrieb:

    VB.NET-Quellcode

    1. Dim objOutlook As Object
    Hier müsstest Du den vom Wrapper generierten Typ zur Deklaration verwenden und bei

    Nichtheilig schrieb:

    VB.NET-Quellcode

    1. objOutlook = CreateObject("Outlook.Application")
    den Rückgabewert zu diesem Typ casten:

    VB.NET-Quellcode

    1. Dim objOutlook As Outlook.Application
    2. ' ...
    3. objOutlook = DirectCast(CreateObject("Outlook.Application"), Outlook.Application)
    wenn Outlook.Application der korrekte Typ ist.
    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!
    Ein leider gutes Beispiel wo in VB.NET ein Sprachfeature von C# fehlt (Siehe dynamic). Du kannst in dem Fall nur mit Option Strict Off für dieses Modul arbeiten.

    Es gibt allerdings noch ein paar gute Officeversion unabhängige libs die dir den Zugriff auf Outlook ermöglichen:

    netoffice.codeplex.com/
    Das ist meine Signatur und sie wird wunderbar sein!

    ErfinderDesRades schrieb:

    Also über dieses Modul drüber schreiben Option Strict Off - alle anderen Module Strict On lassen.

    So, genau diese Lösung suche ich jetzt. Erklär mir bitte jemand, was ist ein Modul? Und der Unterschied zur Methode? Wie kann ich den Rest mit "Option Strict on" laufen lassen und nur den Codeteil für eMail-senden in "Option Strict off"?

    exc-jdbi schrieb:

    Versuch es doch mit dem, diese Variante hab ich auch schon genutzt.
    code.msdn.microsoft.com/window…TLOOK-SEND-EMAIL-4956ed06

    Genau dann verliere ich aber meine Kompatibilität zu den anderen Produkten. Dann bin ich Versionsabhängig und müßte mein Programm mit einer neuen Outlookversion anpassen. Und genau das will ich nicht.

    Nichtheilig schrieb:

    Erklär mir bitte jemand, was ist ein Modul? Und der Unterschied zur Methode?
    hmm - also damit fragst du im Grunde nach der gesamten Programmiersprache.
    Den Begriff "Modul" kannst du nicht ohne den Begriff "Klasse" verstehen, und "Methode" ist überhaupt was ganz anderes, das ist schon sehr bedenklich, dass du Modul und Methode als "gegensätzlich" vergleichst.
    "Methode" gibts auch in 2 Varianten, als Sub oder Function, und wenn du das hast, brauchst du auch noch "Property" und "Feld", und gerne auch "Event".

    Wie gesagt: Die ganze Sprache.
    Ein paar schlampige Erklärungen viel verwendeter Begriffe findest du hier: Grundlagen: Fachbegriffe

    Aber ich denke, auf Entwickler-Ressourcen und Tools, Bücher und WebCasts solltest du dir ein gutes Buch raussuchen, und systematisch Grundlagenwissen aufbauen.

    Nichtheilig schrieb:

    Wie kann ich den Rest mit "Option Strict on" laufen lassen und nur den Codeteil für eMail-senden in "Option Strict off"?

    Naja, das eMail-Modul mit Strict Off überschreiben.
    Ansonsten in den Projekteinstellungen, und in den Einstellungen von VisualStudio insgesamt Strict On voreinstellen (gilt dann für alle neuen Projekte)
    Ausführliche Anleitung und Begründung hier: Visual Studio - Empfohlene Einstellungen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    ErfinderDesRades schrieb:

    dein Modul

    Nichtheilig schrieb:

    was ist ein Modul? Und der Unterschied zur Methode?
    Der EDR hat hier das Wort Modul verwendet, meint aber den Programmteil bei Dir, nicht aber eine Datei, die im Gegensatz zu einer Klasse (dynamische Klasse - zu instanziieren) ein Modul (statische Klasse) ist.
    Eine Methode ist ein Sub oder Function einer Klasse oder eines Moduls, dass Du entsprechend des aktuellen Skops (Sichtbarkeitsbereich von Variablen, Instanzen und deren Methoden) aufrufen kannst.
    Du kannst oben in jeder *.vb-Datei Option strict On oder Option strict Off reinschreiben, das gilt dann für genau diese Datei (Du kannst auch Klassen auf mehrere Dateien verteilen, da müsstest Du das jeweils separat vorgeben). Dies überschreibt die in den Projekt-Settings getroffene Einstellung.
    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!

    Nichtheilig schrieb:

    "On"
    im Studio als Default für alle neuen Projekte:
    Extras -> Optionen -> Projekte und Projektmappen -> VB-Standard ==> On / On / Binary / On
    ----
    Für das aktuelle Projekt:
    Projektmappe -> das aktuelle Projekt -> Eigebschaften -> Kompilieren
    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!
    Ja, das habe ich alles so eingestellt. Da ich aber versuche die Kompatibilität im Bereich Office zu halte würde ich gerne öfter auf die Methode "spätes Binden" benutzen. Kann ich das mit "option Strict on" gemeinsam verwenden? Z.B. ein zweites Form, welches ich durchsichtig schalte? Dann kann ich doch ein Form "Strict off" und eines "Strict on" benutzen. Ist ein bißchen kompliziert.Gibt es andere Möglichkeiten?
    Wie gesagt: Bau dir ein Grundlagen-Wissen auf.
    Bei voreingestelltem Strict On kannst du für einzelne Dateien Off einstellen. Greife auf diese Krücke nur in Modulen zurück, nicht in Forms.

    Aber dazu musst du wissen, was ein Modul ist, im Unterschied zu einer Klasse. Und warum ein Form eine Klasse ist, eine von vielen tausenden.

    Ein zweites "strict off" - Form unsichtbar irgendwo drüber zu legen ergibt überhaupt keinen Sinn.

    Nichtheilig schrieb:

    ein zweites Form

    RodFromGermany schrieb:

    Du kannst oben in jeder *.vb-Datei Option strict On oder Option strict Off reinschreiben, das gilt dann für genau diese Datei
    War da irgend etwas unklar?
    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!