none
visual studio 2015 CA1060 CA2101 CA1401 RRS feed

  • Frage

  • Hallo und guten Morgen,

    als Beispiel diese Fehlermeldungen....

    Schweregrad Code Beschreibung Projekt Datei Zeile Unterdrückungszustand
    Warnung CA1060 Als P/Invoke-Methode muss 'Form1.UnmanagedApi.FindWindowEx(IntPtr, IntPtr, string, string)' in einer Klasse mit dem Namen NativeMethods, SafeNativeMethods oder UnsafeNativeMethods definiert werden. WindowsFormsApplication15 C:\Users\uwe\documents\visual studio 2015\Projects\WindowsFormsApplication15\WindowsFormsApplication15\Form1.cs 35 Aktiv

    Schweregrad Code Beschreibung Projekt Datei Zeile Unterdrückungszustand
    Warnung CA2101 Um Sicherheitsrisiken zu verringern, marshallen Sie den 'lpszClass'-Parameter als Unicode, indem Sie DllImport.CharSet auf CharSet.Unicode festlegen oder den Parameter explizit als UnmanagedType.LPWStr marshallen. Wenn Sie diese Zeichenfolge als ANSI oder systemabhängig marshallen müssen, geben Sie MarshalAs explizit an, und legen Sie "BestFitMapping=false" fest. Legen Sie zur Erhöhung der Sicherheit auch "ThrowOnUnmappableChar=true" fest. WindowsFormsApplication15 C:\Users\uwe\documents\visual studio 2015\Projects\WindowsFormsApplication15\WindowsFormsApplication15\Form1.cs 35 Aktiv

    Leider weiß ich nichts damit anzufangen. Bei dem CA2101 meckert er bei folgenden Code.

                public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);

    Kann mir bitte jemand helfen ? Mein PRG funktioniert auf meinem 1.PC da, so denke ich die Ausnahmen unterdrückt werden. Jedoch auf dem 2. PC wird ein Fehler erzeugt. Auf Beiden ist W10, nur auf dem 1. VS2015.

    Danke und schönes WE, Uwe.

    Sonntag, 5. März 2017 08:57

Antworten

Alle Antworten

  • Hallo Uwe,

    zu CA1060
    Diese Meldung ist eher obligatorisch zu betrachten, da sie anderen Entwicklern nur auf den ersten Blick zeigt dass die Methode eine nativ aus der WinAPI ist. Um die Warnung los zu werden musst du die Methode in eine Klasse verschieben die den Namen NativeMethods, SafeNativeMethods oder UnsafeNativeMethods heißen.

    zu CA2101
    Hier musst du die CharSet-Eigenschaft des DllImport-Attribut setzen:

    [DllImport("myDll.dll", CharSet = CharSet.Unicode)]
    public static extern ...
    Oder aber du hälst dich an die genannten Alternative. Was besser ist hängt von der importierten Methode ab. Einfach so abtun solltest du das hier aber nicht, da es wichtig ist, dass die Signaturen perfekt zusammen passen. Sonst kommt es zu Laufzeitproblemen.

    Viele Grüße, Tom Lambert - MVP, MCC und MSP
    Wozu Antworten markieren und Posts bewerten? Klicke hier
    Nützliche Links: .NET Quellcode | C#/VB.NET Konverter | GitHub Forum Samples | Account bestätigen (Verify Your Account)
    Ich: Webseite | Facebook | Twitter | Code Snippets | GitHub

    Sonntag, 5. März 2017 13:05
    Moderator
  • Hallo Tom,

    danke für Deine Antwort. Für den Fall 1060 habe ich folgendes gemacht...

            internal class UnmanagedApi
            {
                [DllImport("user32.dll", EntryPoint = "FindWindowEx")]
                public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
            }

    Werde aber immer noch angeschimpft ?!

    Wenn Du eine Lösung hast, wäre ich Dir sehr dankbar.

    Gruß Uwe.

    Sonntag, 5. März 2017 16:13
  • Entschuldige wenn ich nerve,

    Hier alle die angemeckert werden...

           internal class UnmanagedApi
            {
                [DllImport("user32.dll", EntryPoint = "FindWindowEx")]
                public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
            }
                [DllImport("User32.dll")]
                public static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, string lParam);
                // Get a handle to an application window.
                [DllImport("USER32.DLL", CharSet = CharSet.Unicode)]
                public static extern IntPtr FindWindow(string lpClassName,string lpWindowName);
                // Activate an application window.
                [DllImport("USER32.DLL")]
                public static extern bool SetForegroundWindow(IntPtr hWnd);

    In diesem Punkt bin ich ein echter Anfänger, ich muss diese APP nur auf anderen Rechnern zum laufen bringen.

    Danke das Du (Ihr) Euch Zeit nehmt mir zu helfen.

    Grüße Uwe.

    Sonntag, 5. März 2017 16:24
  • Hallo Uwe,

    deine Klasse heißt nun UnmanagedApi, was ja aber nicht NativeMethods, SafeNativeMethods oder UnsafeNativeMethods ist. Ist also klar, dass die Warnung noch immer kommt.

    Was CA2101 betrifft, so würde ich vermuten, dass die Funktionen alle Unicode unterstützen. Aber eine Garantie ist das nicht.


    Viele Grüße, Tom Lambert - MVP, MCC und MSP
    Wozu Antworten markieren und Posts bewerten? Klicke hier
    Nützliche Links: .NET Quellcode | C#/VB.NET Konverter | GitHub Forum Samples | Account bestätigen (Verify Your Account)
    Ich: Webseite | Facebook | Twitter | Code Snippets | GitHub

    Sonntag, 5. März 2017 17:59
    Moderator