Gar keine schlechte Idee.. Danke! So werd ich das machen.
Aber ich kann mir irgendwie nicht vorstellen, dass es dafür keine Option gibt.. Falls ich noch etwas finde lasse ich es euch wissen.
Danke für eure Antworten!
Sorry für die ungenaue Erklärung. Ich weiß wohl, dass ich sie einfach löschen kann. 😉 Darum geht es nicht.
Ich will verhindern, dass ein User eine App.config hinzufügen / ändern kann, da er ja z.B. das StrongNameBypass-Feature aktivieren könnte, was aber nicht im Sinne der Anwendung ist.
Selbst wenn ich die Datei vor dem Kompilieren lösche, kann der User einfach selbst eine erstellen und zur exe legen. Die wird dann ganz normal geladen. Und das würde ich gerne irgendwie verhindern (da die Anwendung ja sowieso keine App.config benötigt).
Ich könnte mir z.B. vorstellen, dass es dafür eine Möglichkeit in der csproj-Datei geben könnte. Konnte aber leider nichts dazu finden.
Hallo,
gibt es irgend eine Möglichkeit zu verhindern, dass Konfigurationen in der App.Config (vor Allem Binding-Redirects und StrongNamesBypass) vorgenommen werden können?
Danke im Voraus!
Danke für eure Antworten (und Sorry für die späte Rückmeldung)!
Im Prinzip hat Abt recht. Eigentlich sollte das nicht meine Sorge sein. Dennoch glaube ich nicht, dass es gegen einige konventionen verstößt, ein Interface zu implementieren, dass man nicht verwenden können soll.
Das mit den Codepermissions werd ich mal unter die Lupe nehmen, danke.
Hallo Gü!
Vielen Dank für deine Antwort!
Ich kenne den Unterschied zwischen Strong Names und Authenticode.
Der Grund, warum ich dieses Problem mit Strong Names lösen wollte, ist z.B. der, dass ich hier kein Zertifikat kaufen muss und dieses Zertifikat (und alle damit ausgestellten) nicht warten (erneuern) muss.
Hilfreiche Informationen konnte ich aus dem zweiten Link leider keine filtern. Ich habe mir den Artikel auf Codeproject durchgelesen auf den verwiesen wird aber konnte das lokal nicht wirklich reproduzieren.
Zwar habe ich es geschafft den Public Key von einem authorisierten auf ein "Fake-Plugin" zu übertragen, jedoch konnte dieses dann nicht einmal geladen werden, da sich schon das .NET Framework aufregte, dass die Signatur nicht verifiziert werden konnte.
Im ersten Artikel steht ja folgendes:
The purpose of a strong name is solely to ensure that when you load an assembly by name, you are loading exactly the assembly you think you are loading.
und wenn das tatsächlich so ist, ist mein Problem damit ja gelöst. Das Programm hätte ja Zugriff auf eine Datenbank mit allen authorisierten Public Keys. Wenn der benutze Key darin nicht vorkommt, wird es nicht geladen.
Und sollte eine authorisierte Person ein "böses" Plugin schreiben, kann es dieser Persoon im Nachhinein ohne Probleme zugeordnet werden.
Also sofern diese Aussage oben stimmt und es keine funktionierende Möglichkeit gibt, einen starken Namen von einem Plugin auf das nächste zu übertragen (ohne den privaten Key zu besitzen), sehe ich da kein Problem.
Oder was überseh ich da?
MFG Yo
Hallo,
Ich arbeite im Moment an einem großen Projekt, bei dem Sicherheit eine wichtige Rolle spielt. Wir wollen autorisierten Personen die Möglichkeit geben, selbst Plugins dafür zu entwickeln.
Zur Überprüfung dieser Autorisierung haben wir an starke Namen gedacht, die von uns in Form von PFX-Dateinen an berechtigte Personen verteilt werden. Jeder Schlüssel ist dem Entwickler eindeutig zuzuordnen und jedes Plugin wird beim Laden darauf geprüft.
Die Frage ist nun wie sicher diese Strategie tatsächlich ist. Ich werde aus den Informationen, die man dazu findet, nicht wirklich schlau. Teilweise liest man, dass ein potentieller "Schädling" mit HEX-Editor einfach die Signatur auf ein selbst erstelltes Plugin übertragen kann.
Stimmt das?
Danke im Voraus!
Danke für eure Antworten!
Das hatte ich schon befürchtet. Das XmlIgnoreAttribute hilft in diesem Fall leider auch nicht weiter, da der Entwickler dann ja auch erst beim bzw. sogar erst nach dem Serialisieren merken würde, dass das nicht funktioniert. Und sonst gibt es auch nichts hilfreiches.
Insofern ist mein Workaround wohl die beste Möglichkeit, obwohl es mir nicht gefällt, ein Interface zu implementieren, das schlussendlich überhaupt nicht genutzt wird / werden kann.
Es wäre schön wenn man irgendwie abfragen könnte, wie das Objekt gerade serialisiert wird oder es überhaupt einfach ein NotXmlSerializable-Attribut geben würde. Oder noch viel besser: Wenn man IXmlSerializable implementieren müsste um ein Objekt mit der XmlSerializer serialisieren zu können.
Klar gibt es andere Möglichkeiten das Objekt zu serialisieren. So soll es ja auch sein. Nur soll / kann es nicht mit XML dargestellt werden.
Hallo!
Kennt jemand eine Möglichkeit in einer Klasse die ISerializable implementiert zu erreichen, dass eine Exception (NotSupportedException) geworfen wird, sobald das Objekt an einen XmlSerializer übergeben wird?
Dummerweise ist ein Objekt, das ISerializable implementiert (und nicht IXmlSerializable) im Grunde auch mit einem XmlSerializer serialisierbar, solange es keine öffentlichen Eigenschaften ohne Setter aufweist.
Mein anfängliches (grausames) Workaround war, zusätzlich IXmlSerializable zu implementieren und beim Aufruf von ReadXml und WriteXml eine Exception zu werfen. Das ist aber natürlich nicht im Sinne des Erfinders..
Ich muss also von vornherein klarstellen, dass dieses Objekt nicht mit dem XmlSerializer serialisierbar ist.
Gibt es da eine Möglichkeit? Ich konnte leider trotz langer Suche keine Informationen dazu finden.
Vielen Dank im Voraus!
Hallo,
Es gibt schon unzählige Threads zum Thema obfuscation, wie sinnvoll es ist und welcher wohl der beste Obfuscator ist.. Aber hier mal was anderes:
Gibt es eine Möglichkeit Programme aufzuhalten, die sich ums Gegenteil kümmern?
Ich habe vor ein Paar Tagen den Confuser kennengelernt, der an sich ein sehr guter Obfuscator zu sein scheint. Heute musste ich leider feststellen, dass es da ja z.b. NETDeob gibt, wodurch das ja alles noch weniger Sinn hat.
Mir war klar, dass obfuscation kein wirklicher Schutz ist. Aber dass 1 Klick reicht ist ja wirklich nicht mehr lustig..
Kennt jenand eine Möglichkeit so einer automatisierten Umkehrung vorzubeugen?
Das Problem ist gelöst!
Ich musste einfach mit tlbimp.exe aus der mshtml.tlb eine Interop-DLL erstellen.
Uuuh... Daran hatte ich gar nicht gedacht. 😭 Sorry.. Ich war so geblendet von der Tatsache, die ganze Zeit eine mshtml.dll zu nutzen, dass mit nicht in den Sinn gekommen ist, dass nicht jede mshtml.dll auch automatisch eine COM-DLL sein muss..
Na gut, dann eben anders.. Weiß jemand wo ich eine mshtml 9 COM-DLL finde? Ich bräuchte das IElementSelector-Interface, wie in diesem Beispiel.
Hallo!
Ich versucher gerade eine Referenz zur Version 9 von mshtml.dll hinzuzufügen, aber scheitere mit folgender Fehlermeldung:
Fehlermeldung:
A reference to mshtml.dll could not be added. Please make sure that the file is accessible and that it is valid assembly or COM component.
Ich versuche sie direkt aus System32 zu referenzieren, da die Microsoft HTML Object Library Version 4 ist..
Man findet zu diesem Thema einige Threads, jedoch leider nichts hilfreiches..
Kennt jemand die Lösung für dieses Problem?
Vielen Dank im Voraus!
? Das gibt es doch nicht.. Wieso ist mir das bis jetzt noch nie aufgefallen? Ich programmiere jetzt schon ziemlich lange mit C# aber das ist das erste mal, dass ich dieses Problem habe.
Danke für eure Antworten! Dann schäm ich mich mal schnell in Grund und Boden.
Hallo!
So etwas habe ich noch nie erlebt..
Hier ein kurzes Beispiel:
// Hier ist ein Objekt mit einer Eigenschaft 'List<int> Zahlen', die die Zahlen 1,2 und 3 beinhaltet.
Objekt1 o1 = dasObjekt;
// Diese Eigenschaft wird jetzt in die Variable 'zahlen' kopiert
List<int> zahlen = o1.Zahlen;
// Und der wird die 4 hinzugefügt
zahlen.Add(4);
Komischerweise beinhaltet o1.Zahlen aber jetzt auch auf einmal die 4. Ich kann mir das beim besten Willen nicht erklären.
Wenn ich mir vor und nach dem hinzufügen die Werte von o1.Zahlen ausgebe kann ich das genau beobachten.
Wie kann das sein? Hat jemand so etwas schon einmal erlebt?
Vielen Dank im Voraus!
Edit:
Und wenn ich o1 vorher noch in eine Variable kopiere, ändert sich beim Hinzufügen sogar die..
Danke für deine Antwort!
Wie gesagt kommt vor dem Problemformular ein anderes, ebenfalls mit TextBoxen, die aber problemlos funktionieren. Des weiteren funktioniert das gesamte Programm unter Windows und das Problem tritt nur unter OS X, also unter Mono, auf.
Ich werde es trotzdem mal auf diese Weise versuchen, sobald ich wieder zu einem Mac komme.
Hallo!
Komische Situation: Ich habe ein StartFenster, in dem man einen User-Account festlegen muss. Das funktioniert auch wunderbar. Wenn das Programm dann neu startet und man nach User und Passwort gefragt wird, ist es nicht möglich in den TextBoxen zu schreiben. UNd das obwohl von dem her nichts anders ist als beim ersten Fenster. Es wird zwar ein IBeam angezeigt wenn man mit der Mouse über die TextBox fährt, aber sie erhält keinen Focus wenn man reinklickt und man kann wie gesagt nicht in ihnen schreiben. Die Buttons darunter funktionieren aber wieder problemlos.
Kennt jemand dieses Problem und weiß wie man es löst?
Danke im Voraus!
Vielen Dank für deine Hilfe!
Das ist eigenartig.. Das mit dem Slash ist eine sehr gute Idee. Ist mir gar nicht aufgefallen..
Soweit ich weiß ist es das Snow Leopard..
Hab das Script vorher natürlich auf executable gesetzt. Weiß aber auch nicht genau ob es funktioniert hat, da weder eine Erfolgs- noch eine Fehlermeldung kommt. Aber ich denke, dass eine andere Fehlermeldung kommen würde wenn es daran liegen würde.
Werde es sobald ich zuhause bin gleich mal mit geändertem Slash versuchen.
Edit:
Hab es gerade versucht aber es hat leider nichts geändert.. Und ja, es ist Snow Leopard.
Edit2:
Bin gerade einen großen Schritt weiter gekommen. Hab in einem Post gelesen, dass sowas am Editor liegen kann. Hab daraufhin EditRocket runtergeladen und damit ist der Fehler wohl behoben. Es erscheinen zwar 2 Syntax Errors (Zeile 17 und 18), die im Endeffekt dann aber einfach übersprungen werden.
Dummerweise bekomme ich daraufhin eine TypeInitializationException, um die ich mich wohl noch kümmern muss bevor das Programm läuft. Aber daran solls nicht scheitern.
Nochmal danke für deine Hilfe!
Danke für deine Antwort!
Ich habe das Script 1:1 übernommen und nur die Strings verändert, die verändert werden mussten (Programmname, Mono-Version).
Am Anfang wurden einige Syntax Errors ausgegeben (Syntax Error near...), die weg waren als ich alle Kommentare und überflüssigen Leerzeichen entfernt habe. Aber am Schluss kam dann eben die besagte Meldung. Den genauen Text weiß ich nicht mehr und kann es im Moment leider auch nicht noch einmal ausführen. Jedenfalls war es irgendwas mit "unexpected end of file".
Der Fehler tritt scheinbar sehr häufig auf, und heißt angeblich im Endeffekt nur, dass irgendwo im Script ein Fehler ist. Kann sogar ganz am Anfang sein.
Ich habe das Script mehrmals neu aus dem Post kopiert, aber immer mit dem gleichen Ergebnis. Also kann ich ausschließen, dass ich versehentlich irgendwas geändert habe was ich nicht andern sollte..
Edit:
Wenn ich das Script so ausführe
#!/bin/sh
#get the bundle's MacOS directory full path
DIR=$(cd "$(dirname "$0")"; pwd)
#change these values to match your app
EXE_PATH="$DIR\npsvosx.exe"
PROCESS_NAME=npsvosx
APPNAME="NPSV"
#set up environment
MONO_FRAMEWORK_PATH=/Library/Frameworks/Mono.framework/Versions/Current
export DYLD_FALLBACK_LIBRARY_PATH="$DIR:$MONO_FRAMEWORK_PATH/lib:/lib:/usr/lib"
export PATH="$MONO_FRAMEWORK_PATH/bin:$PATH"
#mono version check
REQUIRED_MAJOR=2
REQUIRED_MINOR=8
VERSION_TITLE="Cannot launch $APPNAME"
VERSION_MSG="$APPNAME requires the Mono Framework version $REQUIRED_MAJOR.$REQUIRED_MINOR or later."
DOWNLOAD_URL="http://www.go-mono.com/mono-downloads/download.html"
MONO_VERSION="$(mono --version | grep 'Mono JIT compiler version ' | cut -f5 -d\ )"
MONO_VERSION_MAJOR="$(echo $MONO_VERSION | cut -f1 -d.)"
MONO_VERSION_MINOR="$(echo $MONO_VERSION | cut -f2 -d.)"
if [ -z "$MONO_VERSION" ] \
|| [ $MONO_VERSION_MAJOR -lt $REQUIRED_MAJOR ] \
|| [ $MONO_VERSION_MAJOR -eq $REQUIRED_MAJOR -a $MONO_VERSION_MINOR -lt $REQUIRED_MINOR ]
then
osascript \
-e "set question to display dialog \"$VERSION_MSG\" with title \"$VERSION_TITLE\" buttons {\"Cancel\", \"Download...\"} default button 2" \
-e "if button returned of question is equal to \"Download...\" then open location \"$DOWNLOAD_URL\""
echo "$VERSION_TITLE"
echo "$VERSION_MSG"
exit 1
fi
#get an exec command that will work on the current OS version
OSX_VERSION=$(uname -r | cut -f1 -d.)
if [ $OSX_VERSION -lt 9 ]; then # If OSX version is 10.4
MONO_EXEC="exec mono"
else
MONO_EXEC="exec -a \"$PROCESS_NAME\" mono"
fi
#create log file directory if it doesn't exist
LOG_FILE="$HOME/Library/Logs/$APPNAME/$APPNAME.log"
mkdir -p "`dirname \"$LOG_FILE\"`"
#run app using mono
$MONO_EXEC $MONO_OPTIONS "$EXE_PATH" $* 2>&1 1> "$LOG_FILE"
also an sich exakt wie es im Post steht, kommt bei mir die Meldung "bad interpreter: No such file or directory".
Soweit ich weiß ist das eben wegen den überflüssigen Leerzeichen.
Sobald ich die entfernt habe und der Fehler verschwindet, kommt die Meldung syntax error: unexpected end of file".
Das Script sieht dann so aus:
#!/bin/sh
DIR=$(cd "$(dirname "$0")"; pwd)
EXE_PATH="$DIR\npsvosx.exe"
PROCESS_NAME=npsvosx
APPNAME="NPSV"
MONO_FRAMEWORK_PATH=/Library/Frameworks/Mono.framework/Versions/Current
export DYLD_FALLBACK_LIBRARY_PATH="$DIR:$MONO_FRAMEWORK_PATH/lib:/lib:/usr/lib"
export PATH="$MONO_FRAMEWORK_PATH/bin:$PATH"
REQUIRED_MAJOR=2
REQUIRED_MINOR=8
VERSION_TITLE="Cannot launch $APPNAME"
VERSION_MSG="$APPNAME requires the Mono Framework version $REQUIRED_MAJOR.$REQUIRED_MINOR or later."
DOWNLOAD_URL="http://www.go-mono.com/mono-downloads/download.html"
MONO_VERSION="$(mono --version | grep 'Mono JIT compiler version ' | cut -f5 -d\ )"
MONO_VERSION_MAJOR="$(echo $MONO_VERSION | cut -f1 -d.)"
MONO_VERSION_MINOR="$(echo $MONO_VERSION | cut -f2 -d.)"
if [ -z "$MONO_VERSION" ] \ || [ $MONO_VERSION_MAJOR -lt $REQUIRED_MAJOR ] \ || [ $MONO_VERSION_MAJOR -eq $REQUIRED_MAJOR -a $MONO_VERSION_MINOR -lt $REQUIRED_MINOR ]
then
osascript \
-e "set question to display dialog \"$VERSION_MSG\" with title \"$VERSION_TITLE\" buttons {\"Cancel\", \"Download...\"} default button 2" \
-e "if button returned of question is equal to \"Download...\" then open location \"$DOWNLOAD_URL\""
echo "$VERSION_TITLE"
echo "$VERSION_MSG"
exit 1
fi
#get an exec command that will work on the current OS version
OSX_VERSION=$(uname -r | cut -f1 -d.)
if [ $OSX_VERSION -lt 9 ]; then # If OSX version is 10.4
MONO_EXEC="exec mono"
else
MONO_EXEC="exec -a \"$PROCESS_NAME\" mono"
fi
#create log file directory if it doesn't exist
LOG_FILE="$HOME/Library/Logs/$APPNAME/$APPNAME.log"
mkdir -p "`dirname \"$LOG_FILE\"`"
#run app using mono
$MONO_EXEC $MONO_OPTIONS "$EXE_PATH" $* 2>&1 1> "$LOG_FILE"
Hallo!
Seit einiger Zeit versuche ich eine .Net-Anwendung auf OS X per Doppelklick zum Laufen zu bringen, aber scheitere im Wesentlichen am App-Bundle.
In Creating a Mac App Bundle for a GTK# Application wird an sich ganz gut beschrieben wie man das macht, nur funktioniert das ShellScript bei mir nicht. Zuerst werden einige Fehler angezeigt, die auf überflüssige Leerzeichen zurückzuführen sind, aber wenn ich die alle behebe kommt eine Fehlermeldung die mir sagt, dass das Script an einem unerwartetem Punkt vorbei ist.
Ich kenne mich leider über haupt nicht mit ShellScripts aus, also gestaltet sich das debuggen sehr schwierig.
Komisch ist auch, dass sich auf der Seite viele Leute dafür bedanken, aber niemand erwähnt, dass es nicht funktioniert..
Ich hoffe jemand kann mir da helfen.
Vielen Dank im Voraus!
Das sind alles sehr interessante Ansätze, vielen Dank!
Mit so viel Input werde ich sicher eine gute Lösung finden. Im Moment ist aber ein anderes Projekt dazwischen gekommen, also kann ich mich im Moment leider nicht ganz diesem Problem widmen.
Hallo!
Im Prinzip gefällt mir Codefort sehr gut. Ich habe wirklich viele gratis Obfuscator ausprobiert (alle die ich finden konnte, und ich habe lange gesucht), und Codefort war eindeutig der beste von allen.
Vielen Dank für deine Antwort!
Dass es dadurch schneller wird kann ich mir kaum vorstellen. Außerdem wird das Unterfangen bzw. zumindest die Entschlüsselung dadurch um einiges komplizierter und es entstehen, glaube ich zumindest, zumindest bei meinem Verfahren noch ein paar weitere Nachteile. Aber das werde ich alles demnächst sehen. Eine andere Möglichkeit habe ich sowieso nicht.
Vielen Dank für eure Antworten!
Das dürfte eine solide Grundlage für die Lösung des Problems sein. Sobald ich Zeit habe werde ich mir das alles mal genau anschauen und durch den Kopf gehen lassen.
@chilic:
Es geht hierbei um einen Verschlüsselungs-Algorithmus der String- und Dateiverschlüsselung unterstützt, aber das spielt eigentlich keine Rolle. Das gleiche Problem tritt bei jedem Algorithmus bzw. Programm auf, das unbeschränkte Dateigrößen unterstützen soll (jedes Programm, das mit Dateien arbeitet, sei es jetzt WinZip, Word oder einfach nur das Standard-Notepad).
Vielen Dank für eure Antworten!
Vor Allem deine, realgun, hat mich ein Stück weitergebracht.
Aber schlussendlich werde ich nach jetzigem Wissensstand wohl nicht drum herum kommen, die Informationen Stück für Stück zu verarbeiten, wenn es für die zu verarbeitenden Dateien keine Größenbegrenzung geben soll..
Sehe ich das richtig?
Es wäre super wenn es es noch einen anderen Weg geben würde, da der Algorithmus schon jetzt recht lange für seine Arbeit braucht, und so noch um einiges länger brauchen wird. Aber vermutlich ist das wohl die einzige Möglichkeit.
Hallo!
Zu diesem Thema konnte ich leider nicht viel und überhaupt nichts hilfreiches finden..
Wie verhindert man eine OutOfMemoryException? Klar, einfach nicht so viel Speicher verbrauchen...
Nehmen wir an es wird eine Datei gelesen, und der Inhalt bearbeitet. Ab einer gewissen Größe bekomme ich diese Exception, aber wüsste nicht was ich anders machen soll. Schließlich brauche ich die Datei im Arbeitsspeicher um mit ihr arbeiten zu können. Sie Stück für Stück zu bearbeiten wäre sehr umständlich und funktioniert in manchen Fällen sowieso nicht.
Kann mir da jemand weiterhelfen?
Danke im Voraus!
Vielen Dank für eure Antworten!
Das Problem ist gelöst und lag doch ganz wo anders als vermutet..
Mein Programm sucht beim ersten Start automatisch nach signtool und makecert. Bei der Überprüfung dieser Dateien habe ich eine Versionsprüfung vergessen, somit wurden die Versionen für Win8 (automatisch die neuesten) geladen (ich hab Gott sei Dank Win7).
Bei meiner Fehlersuche ist mir das nicht aufgefallen weil ich für den externen Test die ausgegebenen Parameter an den Pfad des Win7-Signtools gehängt habe..
Danke für deine Antwort!
Das mit dem Arbeitsverzeichnis werd ich mal versuchen, aber ich glaub nicht dass es daran liegt, da sowieso der komplette Pfad vom Signtool übergeben wird.
Hallo!
Ich bin gerade dabei eine grafische Oberfläche fürs Signtool zu entwickeln, aber stehe vor einem rätselhaften Problem:
Wenn ich das Signtool in einem neuen Prozess starte und meine Argumente übergebe, bekomme ich die Meldung > Fehlermeldung:
SignTool Error: No certificates were found that met all the given criteria
Was äußerst eigenartig ist, da ich erstens im Schritt davon noch sicherstelle, dass das angegebene Zertifikat existiert. Ich habe mir auch schon den verwendeten Command ausgeben lassen und den dann manuell im CMD eingegeben. Da trat dieses Problem nicht auf.
Diesen Tatsachen zufolge kann es höchstens noch sein, dass bei der Übergabe der Argumente an den Prozess irgendwas falsch läuft. Die Frage ist nur was.
Hat jemand eine Idee was da passieren könnte?
Hier ist der anscheinend betroffene Code:
ProcessStartInfo pi = new ProcessStartInfo
{
CreateNoWindow = true,
FileName = Core.Settings.Signtool.FilePath,
Arguments = a == Action.Sign ? data.GetSignCommand(f.FullPath) : data.GetVerifyCommand(f.FullPath),
RedirectStandardOutput = true,
RedirectStandardError = true,
UseShellExecute = false,
WindowStyle = ProcessWindowStyle.Hidden
};
using (Process p = new Process {EnableRaisingEvents = true, StartInfo = pi})
{
p.OutputDataReceived += p_OutputDataReceived;
p.ErrorDataReceived += p_ErrorDataReceived;
p.Start();
p.BeginOutputReadLine();
p.BeginErrorReadLine();
p.WaitForExit();
p.Close();
}
Wie gesagt: An GetSignCommand kann es mit Sicherheit nicht liegen..
Danke im Voraus!
OK, dann hab ich mich wohl falsch ausgedrückt.. Ich bin in dem Fall von öffentlichen statischen Methoden ausgegangen. Sonst halt Konstruktoren und öffentliche statische Properties.
Hab das Problem jetzt übrigens eh auf diese Weise gelöst.
Das Projekt wird um eine statische Klasse mit den Methoden erweitert und an oben genannte Stellen kommt ein Verweis auf die Signup-Methode (in der zuerst überprüft wird ob die Methode schon registriert wurde).
Scheinbar ist das wohl der einzige Weg.
Ganz verstehe ich nicht was du mir damit sagen willst.. Mir ist schon klar, dass ich mich nur einmal fürs Event anmelden muss, falls du das meinst.
Danke für eure Antworten!
@Abt: Im Moment kann ich dir den Grund dafür leider nicht sagen, aber ich erinnere mich, dass ein paar Argumente dagegen sprechen.
Bis zu dem Punkt, an dem ich eben nicht weiter weiß, weiß ich natürlich was ich mache.
@KingMike: Klare Themaverfehlung. Danke trotzdem.
@Ayke: Aber die Frage ist ja, wo ich meine Methode dann fürs AssemblyResolve-Event anmelden soll, da es ja keinen normalen Einstiegspunkt gibt.
Ich könnte mir höchstens vorstellen, das in jeder Methode zu machen. Das würde jedoch neue Probleme aufwerfen und ich weiß auch nicht ob es so überhaupt funktionieren würde.. Jedenfalls müsste es, sollte es überhaupt irgendwie funktionieren, das auf eine weniger umständliche (bzw. schönere) Weise tun.
Danke für eure Antworten und Sorry wegen der ungenauen Erklärung.
Mein Programm soll alle Abhängigkeiten (fürs Erste mal alle Bibliotheken, außer den Framework-Libs) in das Projekt einbetten und dann kompilieren.
Bei einer WPF- oder WinForms-Anwendung z.B. löse ich das Problem, indem ich dem betroffenen Projekt zuerst die Abhängigkeiten als eingebettete Resourcen hinzufüge und dem Einstiegspunkt bzw. den Einstiegspunkten ein paar Zeilen Code hinzufüge die dann im AssemblyResolve-Event die Bibliotheken automatisch aus den Resourcen laden anstatt vom referenzierten Ort.
Meine Frage ist jetzt, ob das bei DLLs auch irgendwie möglich ist (obwohl sie keinen Einstiegspunkt haben an dem man seine Methode für das AssemblyResolve-Event anmelden könnte.
Hallo!
Ich bin gerade dabei einen Dependency Embedder zu schreiben und scheitere im Wesentlichen an DLL-Projekten. Mit WPF funktioniert es schon mal wunderbar (über das AssemblyResolve-Event), in WinForms scheint das schon nicht mehr zu funktionieren, aber vor Allem bei Libraries weiß ich beim besten Willen nicht wie das funktionieren soll, da es ja keinen Einstiegspunkt gibt..
Zu diesem Thema findet man auch keine brauchbaren Informationen, wahrscheinlich weil es nicht funktioniert.
Wollte einfach einmal wissen was ihr davon haltet.
Danke im Voraus!
Das Problem ist gelöst!
Man muss zusätzlich "Use 'var' keyword when initializer explicitly declares type" deaktivieren.
Hallo!
Also ohne mir das jetzt mal genauer angeschaut zu haben kann ich nur sagen, dass das auf jeden Fall mit WatiN möglich ist. Wie genau man WatiN mitteilt, dass es den vorhandenen Browser verwenden soll weiß ich gerade nicht mehr, aber ich habe es selbst schon einmal gemacht.
Ich bin mir aber sicher, dass sich dieses Problem auch irgendwie ohne externe Technologien wie WatiN lösen lässt.
Hallo!
Kann mir jemand sagen wie ich oben genannte Warnung deaktivieren kann?
Ich habe bereits "Use 'var' keyword when possible" deaktiviert, das erzielte jedoch nicht ganz den gewünschten Erfolg. Zwar kommt die Warnung jetzt nicht mehr bei Datentypen wie string oder int (also bei allen structs) aber nach wie vor bei allen anderen Typen.
Danke im Voraus!
Vielen vielen Dank! Genau das habe ich gesucht.
Edit:
Bei genauerer Betrachtung fällt mir auf, dass das zwar schon mal ein guter Ansatz ist aber leider nicht die Lösung. Tatsächlich sind die ProjectTypeGuids nämlich komischerweise nur in Projektdateien vom Typ WPF vorhanden (Und in der Solution-Datei ist immer nur die Windows (C#) GUID, was aber sowieso schlecht wäre, da ich den Typ am Projekt erkennen sollte).
Und EnvDTE ist mir ein Rätsel, aber ich vermute, dass es leider nicht bei externen Projekten funktioniert.
Edit2:
Ok, ich hab das Problem jetzt einfach vorerst mittels ProjectTypeGuids, OutputType, Subtype, Namespaces, Dateiendungen und Regex gelöst. Ich denke so müsste es funktionieren.
Hallo!
Ich bin gerade dabei einen Dependency-Embedder zu entwickeln und habe es bis jetzt noch nicht geschafft, den Projekttyp und die Startmethode (sofern ausführbar) im XML zu finden. Ich suche nach einem zuverlässigen Weg das herauszufinden.
Hat da vielleicht jemand einen Tipp für mich?
Vielen Dank im Voraus!
Hallo!
Ich bin gerade dabei Tests von WatiN nach Selenium zu übersetzen und habe ein kleines Problem bei der AttachTo<T> Methode..
Gibt es in Selenium eine "Übersetzung" dafür?
Wenn ich das richtig verstanden habe führt diese Methode die darauf folgenden Befehle in einem vorhandenen Browserfenster aus? Ich habe das kurz versucht aber es hat irgendwie nicht funktioniert, darum habe ich gewisse Zweifel an meiner Interpretation. Und die Dokumentation ist ja leider generell nicht sonderlich hilfreich..
Kann mir da jemand helfen?
Vielen Dank im Voraus!
Edit:
Mittlerweile weiß ich, dass es dabei wohl nur um vom WebDriver gestartete Fenster geht, was das ganze etwas nachvollziehbarer macht.
Somit ist es schon mal naheliegend, dass dies via SwitchTo() realisierbar ist.
Jedoch führt mich das schon zum nächsten Problem: Es geht darum das Fenster via URL ausfindig zu machen (in WatiN funktioniert das auf diese Weise).
Hat jemand eine Idee wie man das irgendwie lösen könnte?
Hallo!
Das ist eine Frage die mich schon länger beschäftigt.. Wo speichert man eigentlich ordnungsgemäß Passwörter und Benutzerdaten von Anwendungen, so dass sie für den User bzw mögliche Angreifer nicht so leicht zugänglich sind? Es ist klar, dass man solche Datem verschlüsselt, aber wohin dann damit?
Bis jetzt habe ich solche Daten meißtens entweder im Windows- oder im AppData-Ordner gespeichert, aber das ist wohl beides nicht unbedingt zweckgemäß.. Ich dachte auch schon an die Registry, aber glaube auch irgendwie nicht, dass das der normale Weg ist.
Eigenartig ist, dass man zu diesem Thema nirgends Informationen findet..
Danke im Voraus!
Danke für deine Antwort!
Richtig geraten. Auf dem Punkt war ich auch schon. Bin dann aber am setzen der Rechte gescheitert (da das Programm die Rechte dazu natürlich erst recht nicht hat). Und es muss ja wohl eine bessere Lösung geben, als das Programm nur für Administratoren brauchbar zu machen..
Klar ist es eine Exception. Die gibt aber leider nicht viel mehr her..
Das ist sie:> Fehlermeldung:
System.Data.OleDb.OleDbException (0x80004005): Löschen aus angegebenen Tabellen nicht möglich.
bei System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr)
bei System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult)
bei System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult)
bei System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult)
bei System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
bei System.Data.OleDb.OleDbCommand.ExecuteNonQuery()
bei TestGame1.NewHighScoreControl.btnOK_Click(Object sender, RoutedEventArgs e)
Edit:
Ich hab mich dazu entschlossen das Problem einfach zu umgehen indem ich die DB in den AppData-Ordner installiere. Jetzt funktioniert es.
Hallo!
Nachdem ich mein gestriges Problem dann doch recht schnell bewältigt habe sitze ich heute schon seit Stunden vor dem nächsten:
Solange ich das Programm im Visual Studio ausführe funktioniert alles wunderbar. Sobald ich es dann eigenständig aufrufe bekomme ich beim Löschen von Daten aus der Datenbank die im Titel genannte Fehlermeldung.
Lesen funktioniert, löschen und schreiben nicht.
Ich konnte leider nicht allzu viel zu diesem Problem im Internet finden, und was ich gefunden habe hat nichts geändert.
Kennt jemand dieses Problem und weiß wie man es lösen kann?
Danke im Voraus!
Das Problem hat sich erledigt.
Eigenartigerweise funktioniert es nicht wenn das Passwort länger als 14 Zeichen ist.. Darauf muss man erst einmal kommen..
Hallo!
Nachdem ich ein Passwort für meine Access-DB erstellt habe bekomme ich auf einmal beim Aufruf der DataAdapter.Fill-Methode folgenden Fehler:> Fehlermeldung:
Fehler bei einem aus mehreren Schritten bestehenden OLE DB Vorgang
Davor hat noch alles wunderbar funktioniert. Woran kann das liegen?
Hier ist mein ConnectionString:
"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + dbpath + ";Jet OLEDB:Database Password=" + pwDB + ";";
Und hier der betroffene Code:
using (con = new OleDbConnection(Settings.cs))
{
cmd = "SELECT * FROM Scores ORDER BY Score DESC, ID ASC";
da = new OleDbDataAdapter(cmd, con);
dt = new DataTable();
da.Fill(dt);
}
Danke im Voraus!
Edit:
Bei genauerer Betrachtung habe ich bemerkt, dass die Eigenschft ServerVersion eine InvalidOperationException mit der Message "Ungültige Operation. Die Verbindung ist geschlossen." verursacht.
Die Frage ist nur warum? Vorher hat es ja auch funktioniert und am Passwort liegt es ja wohl nicht.
Zur Sicherheit hab ich das Passwort noch einmal entfernt und siehe da, es funktioniert wieder.
AM COnnectionString kann es wohl auch nicht liegen, da die Exception dann schon beim DataAdapter auftreten würde. Ich weiß echt nicht weiter..
Danke für deine Antwort!
Stimmt, daran hatte ich nicht gedacht..Muss ich mal testen.
Danke für deine Antwort!
Daran habe ich natürlich als erstes gedacht, nur funktioniert das leider nicht, da ich das Design mit XAML machen muss. Und leider wird in diesem Fall automatisch von UserControl geerbt, auch wenn ich es manuell entferne.
Mittlerweile habe ich mich aber auch schon damit abgefunden.
Hallo!
Ich weiß, dass das gegen verschiedene Gebote des objektorientierten Designs verstößt, jedoch muss es in desem Fall einfach sein.
Ich muss alle geerbten Eigenschaften (und gegebenenfalls sogar Methoden) deaktivieren. Einfach nicht von UserControl erben geht nicht, da ich auf diese Weise keinen XAML-Code verwenden könnte, was aber aus Performancegründen sein muss.
Ich habe es schon mit den Standard-Lösungsvorschlägen versucht, hat aber leider nicht funktioniert. Egal was ich mache, die Eigenschaften werden nach wie vor erkannt und können verwendet werden.
Kennt jemand einen guten Weg das zu verhindern?
Vielen Dank im Voraus!
Stimmt natürlich.. 😉
Hallo!
Ich bin gerade dabei mich mit den bis jetzt sehr unsympathischen Dependency Properties zu beschäftigen und scheitere daran dass die oben genannten Methoden nicht gefunden werden. Ich finde auch keinerlei Informationen zu diesem Problem.
Das ist mein TestCode:
public bool TestProp
{
get { return (bool)GetValue(TestPropProperty); }
set { SetValue(TestPropProperty, value); }
}
public static readonly DependencyProperty TestPropProperty =
DependencyProperty.Register("TestProp", typeof(bool), typeof(TestKlasse), new UIPropertyMetadata(0));
Intellisense meint
Der Name "GetValue" ist im aktuellen Kontext nicht vorhanden
Der Name "SetValue" ist im aktuellen Kontext nicht vorhanden
Weiß jemand woran das liegt?
Danke im Voraus!
Edit:
Und in dem Moment in dem ich auf "Beitrag speichern" klicke fällt mir das Problem auf... Es wäre natürlich nicht schlecht wenn die Klasse von DependencyObject erbt...
Ich glaube nicht, dass in einem Java-Forum mehr Leute wissen wie sich etwas in C# verhält.. Die arbeiten damit in Java und haben somit diese Probleme nicht.
Edit:
Ich bin einen kleinen Schritt weiter.
Anstatt der selbst-konvertierten DLL verwende ich jetzt die NHtmlUnit-Bibliotheken und statt des HtmlUnitDrivers den WebClient. Dies wirft zwar wieder neue Probleme auf, aber ich bin gerade dabei mit ihnen fertig zu werden. Sobald ich es geschafft habe poste ich hier die Lösung.
Sollte trotzdem jemand Hinweise zum HtmlUnitDriver haben bitte immer her damit.
LÖSUNG:
Nachdem ich bei diesem Lösungsansatz gleichzeitig mit jedem kleinen Schritt vorwärts 5 große zurück gemacht habe, habe ich mich entschlossen das Problem einfach mit WatiN zu lösen. Diesbezüglich werden da viel mehr Möglichkeiten geboten (auch wenn es anderweitig einige Nachteile gibt).