Hmm, was denn erklären?
Eine Herleitung kannst Du ergoogeln. Falls die Notation unklar ist, so sieht das in Code aus:
float Area(List<PointF> p)
{
float area = 0;
int N = p.Count;
for (int i = 0; i < N; ++i)
area += (p[i].Y + p[(i + 1) % N].Y) * (p[i].X - p[(i + 1) % N].X);
return 0.5f * Math.Abs(area);
}
(ungetestet)
loks schrieb:
1. Du prüfst im Ctor nicht ob das File existiert bzw. zugegriffen werden kann. -> Möglicher Laufzeitfehler
Das tue ich bereits bei der Erzeugung der Liste in der Hauptklasse und muss ich dort auch tun, weil wenn das Verzeichnis dort nicht existiert würde ich einen Fehler bekommen, wenn ich in die Subverzeichnisse davon gehe. Oder sollte man das zweimal machen (beziehungsweise Zugriff erneut testen, da der Zeitpunkt leicht abweicht von der ersten Prüfung)?
loks schrieb:
6. Du erzeugst unnötig mehrfache Instanzen von MD5 (Md5.Create())
OK, ich erzeuge nun eine Instanz und verwende diese:
MD5 md5 = new MD5CryptoServiceProvider();
byte[] md5Hash = md5.ComputeHash(FileCheck);
loks schrieb:
7. Deine Operatoren prüfen ebenfalls nicht auf null -> möglicher Laufzeitfehler
Was soll ich in dem Fall machen, falls ein Wert null ist?
Ich kann ja keinen boolean zurückgeben. Also was würde man von einem Programm erwarten? Eine Exception?
loks schrieb:
Zusätzliche Minuspunkte für schlechte Naming Convention:
Unterstrich ist entfernt im Klassennamen. Das mit dem Unterstrich vor der Variable hat mir ein Ausbilder gezeigt und habe ich schon zigtausendmal im Netz gesehen. Aber ich werde es mir merken.
Dann liegt jetzt das Problem nur noch in der Verwendung des HashSets stimmts?
HashSet<ImageFile> hashset = new HashSet<ImageFile>();
foreach (ImageFile imgfile in imgfiles)
{
if (...)
lbDuplikate.Items.Add(imgfile.ToString());
Application.DoEvents();
}
Ich weiß nun nicht, wie ich hier den Operator == einsetzen soll ohne die Hashset ebenfalls nochmal zu druchlaufen, was ich ja nicht mehr tun sollte/muss.
@oh-ihr-götter
Dem wiederspreche ich hiermit strikt. Der Setter ist quasi eine Methode, die aufgerufen wird um einen Wert zu setzen. Für spezielle Behandlung, zum Beispiel die Prüfung ob die Datei existiert deren Pfad übergeben wurde, kann der Setter sehr wohl verwendet werden.
Das Anlegen des Files allerdings hätte ich in eine eigene Methode ausgelagert.
hustbaer schrieb:
EDIT:
Nö, ich bin doof
Ich ziehe meine Bedenken zurück.
Das Programm das "elevated" läuft läuft ja trotzdem in der selben Session ( GetCurrentProcessId -> ProcessIdToSessionId ) - vermute/behaupte ich mal. Wenn man sich genau diese Session dann aus der Liste die man über LsaEnumerateLogonSessions/LsaGetLogonSessionData bekommen hat raussucht, dann sollte das OK sein.
So siehts aus
Läuft alles wunderbar.
hustbaer schrieb:
Man bekommt dann zwar nicht den Account mit dem das Programm gestartet wurde, aber zumindest den mit dem sich derjenige der das Programm gestartet hat ursprünglich eingeloggt hat. Was vermutlich gut genug ist.
Genau das wollte ich ja.
fragr schrieb:
Damit kann ich eine JS-Funktion aufrufen, ja.
Aber wie kann ich das auf einer bestimmten Website machen?
Dort, im Beispiel, wurde das Script als string hinterlegt.
Was aber, wenn diese auf einer Website vorliegt?
Dann bist du angeschissen. Weil JavScript Code der auf Webseiten steht erwartet dass die Webseite als DOM vorliegt.
D.h. du bräuchtest als erstes mal ne komplette HTML DOM implementierung, und müsstest diese für JavScript zugänglich machen.
=> vergiss es
Vielen Dank. Tatsächlich war im Pathseperator ein Wert eingetragen, der zu dem Fehler führte. Der Fehler lag nur vielmehr daran, dass ich nicht wusste, dass dieser eine Auswirkung hatte.
Nein. Auch mit der Konsole bekomme ich im Visual Studio keine verbindung hin.
Aber ich habe eine andere Lösung gefunden. nuget package mit externem Tool herunterladen. Im Visual Studio einen weiteren Pfad hizufügen der aber nicht auf nuget.org verweist sondern auf die lokale Platte. Dann hier das gewünschte Paket auswählen und installieren.
Ich hab jetzt nochmal was anderes rausgefunden:
Ich habe den Webservice mal auf basicHttpBinding umgestellt. Und jetzt sehe ich konkret, wo es eigentlich hackt: Wenn ich folgendes deklariere:
<security mode="Message">
<message clientCredentialType="Certificate"/>
</security>
dann haben wir dasselbe Problem: Lokal geht alles, aber auf dem Server kommt ein Timeout. Wenn ich jedoch <security mode="None"> schreibe, dann läuft auch auf dem Server alles korrekt durch.
Weiß einer, was da zu tun ist? Warum hat er Probleme, wenn die Security eingeschaltet ist?
Hallo loks.
Richtig. Ich habe meinen Fehler gefunden.
Das war das was ich bisher gemacht habe.
var persons = _dbContext.Persons;
persons.Add(new Person("Peter"));
var x = persons.FirstOrDefault(); // hier erhalte ich nun den Peter zurück.
Dann hatte ich umgestellt. Und nicht mehr getestet.
Vielen Dank.
Erstmal den String nach den "Markern" durchsuchen, und ne Liste der Marker basteln.
Dann den 1. "Code" inkrementieren. Wenn's nen Overflow gibt den nächsten Code inkrementieren. Wenns da wieder nen Overflow gibt wieder den nächsten Code usw. Und wenns keinen nächsten Code mehr gibt ist man fertig.
Eigentlich recht einfach. Und das ohne dass man die Anzahl der Marker irgendwie festlegen müsste.
Die Softwareersteller sind einfach nur böse, wenn sie ihre Programme auch verkaufen wollen und für unlizensierte
Testanwender sich etwas einfallen lassen.
Zum Thema: Es geht - wie mehrfach geschildert - auch für .NET mit ausreichendem Schutz gegen unerwünschte Manipulation.
Die Wartbarkeit des Programmes muss darunter nicht leiden. Die Prüfung eines Lizenzschlüssels ist einfach zu handhaben und sollte
mit einem Disassembler nicht sofort erkennbar sein. Alle Lösungswege dafür machen jedoch etwas zusätzliche Mühe.
Achso. Und natürlich an alle dies interessiert noch einmal die vollständige Methode (bzw. Klasse) zum Auslesen:
// Verweis zu System.Core.dll
using System.Linq;
public static class Resources
{
public static byte[] GetResource(string tag)
{
System.Resources.ResourceReader rr = new System.Resources.ResourceReader(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames()[0]));
string str;
byte[] file;
rr.GetResourceData(tag, out str, out file);
System.Collections.Generic.List<byte> fileList = file.ToList<byte>();
fileList.RemoveRange(0, 4);
file = fileList.ToArray();
return file;
}
}
Tag ist dabei der Name der Resource. Wenn man die Datei also mit
ResourceWriter rw = new ResourceWriter("files.resources");
rw.AddResource("yodo", File.ReadAllBytes("file-in.txt"));
hinzufügt muss man bei tag "yodo" angeben.
Hinweis: Das ganze ist lediglich für die Nutzung mit einer Resources-Datei ausgelegt, aber einfach für mehrere Dateien erweiterbar.