Ich hatte das gleiche Gefühl als ich auf Windows7 RC2 umgestiegen bin. Kann das aber nicht mehr wirklich nachvollziehen geschweige denn vergleichen.
Wenn ich allerdings mit meinem zweiten Rechner vergleiche, kann ich keine Unterschiede in der Oberflächen-Performance feststellen. Filesystem-Zugriffe und Datenbank-Zugriffe sind aber um ein vielfaches schneller, was meines Erachtens aber vorallem am Speicher und den Festplatten liegt.
Vergleichssysteme:
AMD 4200+ OC 2600MHz
4GB RAM
NVidia 7600, 128MB
Windows XP SP3 32Bit
AMD 6400+ OC 3300 MHz
8GB RAM
NVidia 9800, 512MB
Windows 7 Ultimate 64Bit
Unter Windows7 ist die Oberflächen-Performance aber um einiges besser, wenn ich Aero deaktiviere. Vielleicht kann man damit ein bisschen rumtesten. Aero verlangt doch einiges von der Grafikkarte.
hört sich für mich so an, als ob Vista zu einem früheren Wiederherstellungspunkt gesprungen ist und dabei auch noch die entsprechenden Daten gelöscht hat.
Das bei den Wiederherstellungspunkten Daten gelöscht werden, kenn ich eigentlich nur, wenn die Daten in einem der Systemverzeichnisse liegen. Meines Wissens gehört dazu aber sogar der Systemorder 'MyDocuments' also die eigenen Dateien.
Das ist jetzt allerdings nur eine Vermutung. Aber vielleicht ist das ein Ansatzpunkt, wobei ich aber nicht weiß, ob man Vista dazu zwingen kann wieder zu einem späteren Wiederherstellungspunkt zu springen. ich denke eher nicht, aber vielleicht gibt es da was.
So. Ich kam gerade dazu, das ganze noch einmal anzusehen und bin dabei sogar ein bisschen weiter gekommen.
Mein Code sieht jetzt folgendermaßen aus:
<StackPanel Orientation="Horizontal">
<TextBox Text="blu" />
<avalon:MaskedTextBox Mask="90:00" Width="50" Text="{Binding TimeStartString}" Style="{StaticResource ValidatingMaskedTextBox}" />
<avalon:MaskedTextBox Mask="90:00" Width="50" Text="{Binding TimeStartString}" Style="{StaticResource ValidatingMaskedTextBox}" />
<TextBox Width="250" Style="{StaticResource ValidatingTextBox}" Text="{Binding TimeStartString}" />
</StackPanel>
Wichtig dabei ist, dass vor den Masked Textboxen eine weitere normale Textbox stehen muss. Ansonsten funktioniert das Binding nicht und es werden keine Daten in den MaskedTextBoxen angezeigt.
Ich bin jetzt auch mal mit dem Debugger drüber gegangen und hab dabei festgestellt, dass da anscheinend die falschen Daten übermittelt werden.
Beim Aufruf mit der vorangestellten Textbox wird an die Methode ForceText als Value der Wert meines bindings übergeben. Wenn davor keine TextBox steht, wird stattdessen der String ":" übergeben. Also die leere Maske sozusagen.
Zudem kommt noch dazu, dass einmal die Maske gefüllt ist und einmal nicht.
Die Methode sieht folgendermaßen aus:
private static object ForceText(DependencyObject sender, object value)
{
MaskedTextBox textBox = (MaskedTextBox) sender;
if (textBox.Mask != null)
{
MaskedTextProvider provider = new MaskedTextProvider(textBox.Mask);
provider.Set((string) value);
return provider.ToDisplayString();
}
else
{
return value;
}
}
Ich denke, dass es irgendwie mit dem Static zusammenhängt, aber so ganz klar ist mir das ehrlich gesagt auch nicht. Vielleicht hat jemand schon einmal damit rumgespielt und weiß, woran das problem hängt.
Ich werd auf jeden Fall jetzt mal versuchsweise eine solche Textbox nachbauen und schau, dass ich das so irgendwie hinbekomm.
Ich würd die Inserts auch nicht in den Threads machen lassen. Von meiner denkweise her, würde ich zwar auch mit Threads arbeiten, aber die Threads würden lediglich ihre Aufgabe erledigen (Pingen oder was auch immer) und die erarbeiteten Daten an den Threadholder zurückgeben. Nur der Threadholder schreibt dann die gesammelten Daten in die Datenbank. Das kann dann auch wieder in einem eigenen Thread passieren, damit die Anwendung nicht blockiert wird, aber das muss man abwägen, ob es notwendig ist (wann werden die Daten im, hauptprogramm wieder benötigt, wie lange dauert das schreiben der gesammelten Daten wirklich usw)
Nichts destotrotz wird dennoch Compact SQL schneller sein als Access. Nach meinen Erfahrungen kann man evtl mit Firebird noch ein bisschen mehr rausholen, aber in meinen bisherigen Anwendungen haben sich SQL Compact, Firebird und SQLite gegenseitig nicht viel genommen. SQL Compact hat allerdings in meinen Augen den Vorteil, dass man sehr leicht auf einen SQL Server switchen kann, sollte das mal notwendig werden.
Im Endeffekt musst da ein kleines Framework schreiben um das abzubilden (was ohnehin auch ohne EF gemacht werden sollte)
Als kleinen Denkanstoß hab ich einen kleinen Auszug angehängt, wie man vielleicht die Tabellenstruktur für dieses Framework aufsetzen könnte. Das ganze ist jetzt nicht 100% durchdacht, sondern nur schnell hingemalt, aber ich denke, man erkennt daraus, worauf es hinausgeht.
Dann würde ich die Sequenz eben auch nur beim Speichern in der Datenbank ersetzen. Alles andere sollte mit \r\n (bzw Environment.NewLine) arbeiten.
Hmmm... "mi" stammt glaub ich von Oracle. Das könnte natürlich der Fehler sein. Muss ich später nochmal ausprobieren.
Nochmal wegen deinem Picker: Genau der Tab ist für mich ehrlich gesagt das Problem. ich will meine Eingaben idealerweise nur am Zahlenblock vornehmen. also wie im obigen Beispiel eben 1230 statt 12<Tab>30.
Ist zwar an sich kein Muss (wobei ich diverse Kunden kenne, die genau auf solche Kleinigkeiten wert legen), aber das darf ja eigentlich kein Problem darstellen.
Danke für den Vorschlag. Ich hab's mir jetzt zwar ehrlich gesagt nicht angesehen, aber ich denke nicht, dass es das es, was ich suche. Andere Controls, die auf dem gleichen Prinzip aufbauen mit mehreren Textboxen hab ich ja bereits getestet. Was mich daran aber stört ist, dass das zusammengehörende Element der Zeit auseinandergerissen wird und man auch bei der Eingabe eben in das nächste Feld springen muss. Daher bin ich auf die Idee mit dem MaskedEdit gekommen.
Aber auf jeden Fall danke für den Tip. Vielleicht kann mir aber dennoch noch jemand sagen, was ich bei meinem Binding hier falsch mache.
Ich bin gerade ein bisschen am Verzweifeln.
ich suche eine Masked Textbox für WPF, die mit DataBinding umgehen kann. Im moment probier ich mit der MaskedTextbox vom AvalonControlToolkit rum, aber irgendwie schaff ich das nicht, dass das Binding funktioniert. oder ich hab da einen ganz rudimentären Fehler (erste Gehversuche mit WPF und MVVM)
Derzeit sieht mein XAML folgendermaßen aus:
<avalon:MaskedTextBox Mask="90:00" Width="50" Text="{Binding TimeStartString}" FontFamily="Courier New" HorizontalAlignment="Center" />
<avalon:MaskedTextBox Mask="90:00" Width="50" Text="{Binding Path=TimeEnd, StringFormat=hh:mi}" FontFamily="Courier New" HorizontalAlignment="Center" />
<TextBox Width="250" Text="{Binding TimeStartString}" />
Die erste MaskedTextbox sollte aus dem gebunden Objekt einen zu einem String konvertierten DateTime holen. Der String sieht zum Beispiel so aus: 1230 (für 12 Uhr 30)
An die zweite MaskedTextbox hab ich einfach direkt einen DateTime gehängt, was ja logischerweise gar nicht funktionieren kann, aber ich wollt's einfach ausprobieren.
In der Textbox wird der konvertierte DateTime noch einmal ausgeben und hier funktioniert es auch. Von daher gehe ich davon aus, dass die Datenbindung grundsätzlich funktioniert. Vermutlich muss ich lediglich das Format richtig anpassen. Aber wie mach ich das.
Aber nichts desto trotz interessiert mich auch, ob es vielleicht noch andere Controls für diesen Zweck gibt. Eigentlich würd ich ja einen TimePicker suchen, aber der einzige, der mir wirklich gefallen würde, ist der vom Silverlight Toolkit und der nutzt mir nicht bei WPF. Alternativen sind gerne willkommen.
Vielleicht kann mir jemand helfen.
Prinzipiell stimme ich dir damit schon zu. Aber warum machen sich dann so viele Software-Hersteller die Mühe ein geeignetes Aktivierungsverfahren bzw Lizenzierungsalgorhythmen zu entwicklen um ihre Software zu schützen? Das reine Software-Patent würde doch da schon ausreichen. Oder warum überhaupt ein Patent anmelden, wenn eine einzelne Zeile in der Lizenz schon dafür ausreicht?
Rechtlich ist es klar, dass es ausreicht. Aber leider werden Lizenzen nur in den wenigsten Fällen eingehalten geschweige denn überhaupt gelesen.
Dieses Handy hättest du aber in der entsprechenden Produktion nicht dabei, da jegliche Aufnahme-Medien verboten sind. Man durfte da nicht einmal eine Armbanduhr mit reinnehmen.
Sicherheit ist immer relativ. Meiner Meinung nach bedeutet Sicherheit nicht, dass etwas wirklich sicher ist, sondern dass es ein mögliches Sicherheitsvergehen weitesgehend unterbunden wird bzw. durch zur Verfügung stehende Mittel so schwer wie möglich gemacht wird.
Das gleiche gilt ja auch bei den ganzen Lizenzierungsgeschichten. Windows7 kann man ja auch jetzt schon wieder cracken, dennoch zählt es als sicher, da es doch schon ein ziemlicher Aufwand mittlerweile ist.
Nur mal so eine Idee am Rande:
Das Ganze setzt natürlich voraus, dass in dieser zu sichernden Ansicht keine Tastatureingaben notwendig sind. Ansonsten ist das mit dem Abfangen von KeyPress ein bisschen doof (Achja... wenn dann müsste man KeyDown verwenden denke ich)
Ist jetzt nur so eine fadenscheinige Idee, aber vielleicht könnte man darauf aufbauen.
Im übrigen hab ich eine Sicherung vor Screenshots schon einmal gesehen. Ich weiß allerdings nicht, wie das realisiert wurde. Die Standard-Windows-Kombination ist ja noch einfach, aber wir haben mit IrfanView, Paintshop, Snagit und Printkey auch keinen Erfolg gehabt. Es wurde dann lediglich ein schwarzes Bild abfotografiert (Wir mussten das unbedingt ausprobieren, weil es in der Feature-List des Updates extra groß erwähnt wurde 😃 ).
Bei dem Programm handelte es sich um Analyse-Daten von Produktionsabweichungen im Toleranz-Bereich. Nur bestimmte Anwender hatten dabei das Recht, diese Daten zu verarbeiten, drucken etc. Der allgemeine Anwender an der Maschine konnte die Daten lediglich einsehen um seine Maschine gegebenfalls nachzustellen, wenn sich ein Trend in den Abweichungen bemerkbar machte, durfte aber nichts weiter damit machen, weil sie ja innerhalb der Toleranz liegen und von daher allgemein ignoriert werden können, aber dennoch nicht an die Kunden gelangen durften.
Eine nette Spielerei, aber letztendlich wurde dann ohnehin dem Maschinenführer das Recht auf diese Ansicht komplett genommen, denn was will er denn damit. Um so weniger Sachen auf dem Bildschirm zu sehen sind um so einfacher gestaltet sich die Schulung des jeweiligen Benutzers.
Ich glaube, die Entscheidung ob C++ oder C# kann euch niemand abnehmen. Meiner Meinung nach geben sich die beiden Sprachen nicht viel im Bezug auf modern oder nicht modern. Die Frage ist eher das Einsatzgebiet.
Ich persönlich bevorzuge zur Anwendungsentwicklung mit moderner GUI auf jeden Fall C#, ganz einfach deswegen, weil ich mich damit auskenn. Mit C++ kann man aber das gleiche machen, wenn man weiß wie.
So wie ich das sehe, habr ihr bei euch bereit KnowHow für C++. Wie sieht es mit dem KnowHow für C# aus? Die Einarbeitszeit ist ein nicht zu vernachlässigender Kostenfaktor. Wiederverwendbarkeit von bestehenden Komponenten hast du ja bereits genannt, wobei man auch mit ein paar Tricks unmanaged Controls in .NET verwenden kann. Aber das ist auch wieder mit Aufwand verbunden.
Zu allererst müsste man analysieren, warum das Dos-Programm umgestellt werden soll. Liegt es an neuen Anforderungen? Soll es einfach eine modernere Oberfläche bekommen? Läuft es auf modernen Betriebssystemen nicht mehr? Und so weiter. Wenn nur die Oberfläche modernisiert werden soll, kann man sich auch überlegen, ob man als Kern das alte Programm beibehält und nur eine neue Oberfläche andockt. Es ist zwar immer recht schön, wenn eine Software komplett neu gestrickt wird um bessere Programmier-Standards verwenden zu können, aber Geld verdienen kann man damit in meinen Augen nicht wirklich.
Ich persönlich halte nicht viel von irgendwelchen Sprachumstellungen nur weil jemand sagt, dass die neue Sprache mehr Zukunft hat. Bei Cobol wurde schon lange gesagt, dass es keine Zukunft mehr hat, aber ich hab am Wochenende erst erfahren, dass eine mir bekannte Firma vier Programmierer einstellen würde. Gehaltsnennwert 80k auf Verhandlungsbasis. Gewünscht sind auch Kenntnisse über den .NET-Adapter für Cobol. Also so tot hört sich das nicht an und wird auch immer noch eingesetzt. Es wird lediglich von Programmieren boykottiert, da sich diese Sprache niemand mehr antun will.
Es gibt doch sicherlich eine Möglichkeit, wie man in einem msbuild Script das OutputDirectory festlegt. Standardmäßig wird der Output ja nach {ProjectDir}\bin\debug (bzw release) kopiert. Aus der Doku werd ich dazu irgendwie nicht schlau
Mein derzeitiger Versuch sieht folgendermaßen aus:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<ProjectToBuild Include="Framework/Module01/Project01.csproj"/>
<ProjectToBuild Include="Framework/Module02/Project02.csproj" />
<ProjectToBuild Include="Framework/Module03/Project03.csproj" />
</ItemGroup>
<PropertyGroup>
<OutputPath>./binaries</OutputPath>
</PropertyGroup>
<Target Name="Build">
<MSBuild Projects="@(ProjectToBuild)"
Properties="Configuration=Debug"/>
</Target>
</Project>
So läuft der Prozess wenigstens durch, aber der OutputPath interessiert ihn gar nicht. An welcher Stelle müsste ich die Property einfügen, damit sie sich auf jedes Item auswirkt?
Oder muss ich das ganze ganz anders angehen?
Interessantes Thema. Mich würde dabei aber ehrlich gesagt auch interessieren, wie man ein solches Unterfangen angeht.
Kann man irgendwie auf die MFT zugreifen? Bzw, kann man irgendwie gezielt auf bestimmte Sektoren zugreifen?
Der einfachste und womöglich beste Schutzt ist die Urheberrechtsinfo und die Lizenzinfo (zB Name des Kunden) an prominenter Stelle im Programm anzuzeigen (oder zB auf generierten Berichten zu drucken).
mfG Gü
Stimmt, das ist auch noch drin 😃
Man muss auch noch den Aspekt der Performance beachten. Eine zu heftige Verschlüsselung frisst wieder Performance. Der ideale Mittelweg ist entscheidend, was auch wieder auf den Einsatz der Software ankommt.
Ich habe kürzlich ebenfalls eine Lizenzierung eingebaut. Urspünglich hatte ich auch die Idee mit dem StrongName, aber das kam mir alles zu wacklig vor. Ausserdem muss man dann wieder alle Assemblies signieren, was zu viel Aufwand gewesen wäre und von der Performance nicht mehr tragbar gewesen wäre.
Ich habe letztendlich eine einfache asynchrone Verschlüsselung verwendet. Im XML-File stehen in Plaintext die Lizenzdaten (Lizenznehmer, Email, lizenzierte Module usw) und zusätzlich auch noch eine Signatur, die aus den Lizenzdaten erstellt wird.
In der Anwendung hängt der public key bidirektional verschlüsselt als Resource drin und wird nur herangezogen, um die Signatur des Lizenzfiles auf Gültigkeit zu prüfen.
Nachwievor gibt es aber auch hier das Problem, dass man ohne Probleme die Lizenzierung aushebeln kann, in dem man mit einem Resource-Hacker den PublicKey ändert oder sogar mit Reflection die gesamte Assembly nachbaut. Bei .NET ist das leider relativ leicht möglich.
Generell war mein Gedankengang dann, dass man einfach das nachvollziehen der Lizenzierung möglichst kompliziert gestalten muss, um einfach den Aufwand des Hackens zu erhöhen. Eine absolute Sicherheit kann man eigentlich gar nicht gewährleisten.
Wir sind am Überlegen, ob es einen Sinn macht unsere Software kurz vor der Auslieferung noch zu signieren. Da die Zeit knapp ist, sind wir uns nicht sicher, ob wir den Aufwand noch auf uns nehmen sollen.
Daher suche ich Argumente für und gegen eine Assembly-Signierung. Und vorallem auch, wie man das am besten umsetzt. Jede Assembly mit einem eigenen Key-File oder alle Assemblies mit einem Keyfile signieren?
Am besten auch ein paar Infos über allgemeine Erfahrungen damit.
Ich danke schon mal.
Hmm... dann muss ich das nochmal mit den Breakpoints ausprobieren. Bisher hat das noch nicht geklappt, wobei es leicht sein kann, dass ich bisher nie den Cursor im rechten Teil des Ausdrucks stehen hatte.
LinqPad ist zwar eine feine Sache, aber so wie ich das gelesen habe, kann man damit nicht zur Laufzeit debuggen. In meinem Fall handelt es sich wirklich um reines LinqToObject also ohne Datenbank oder anderen Datenprovidern.
Ich werd's einfach nochmal ausprobieren.
Hallo,
ich verwende an vielen Stellen Linq2Object mit der verkürzten Lamda-Schreibweise und hab mittlerweile doch des öfteren ein Problem beim debuggen.
Gibt es irgendein Addin für VS2008 mit dem man die Lamda-Ausdrücke debuggen kann? Weil so Fehler wie "Sequence contains no elemens" ist manchmal recht schwierig zu analysieren, wenn man eine komplexeren Lamda-Ausdruck mit Where, Select und Count zusammen verwendet.
Wär schön, wenn da jemand ein brauchbares Tool kennt.
abstract class Hauptobjekt()
{
List<Eigenschaftsklasse<TYPE>> ListOfProps {get;set;}
TYP??? GetValue(string name)
{
// würde funktionieren, aber Wert kann von 3 verschiedenen Typen sein
// wie alse Rückgabewert der Funktion festlegen?
ListOfProps.Find(p=>p.Name==name).Wert;
}
...
}
abstract class Eigenschaftsklasse<T>)
{
string Name {get;set;}
T Wert {get;set;}
...
}
class TextEigenschaft: Eigenschaftsklasse
{
new string Wert {get; set;}
}
class ZahlEigenschaft: Eigenschaftsklasse
{
new double Wert {get; set;}
}
class DatumEigenschaft: Eigenschaftsklasse
{
new DateTime Wert {get; set;}
}
Das ist jetzt ungetestet, aber so in der Art solltest du eigentlich zu einer Lösung kommen. Also einfach die abstrakte Klasse noch generisch machen.
Also so wie du es bei double machst, scheint es dir ja zu gefallen. Bei int ist es genau das gleiche.
Double = System.Double
int = System.Int32
Das heißt, du musst equivalent zum Double-Fall eben bei int nicht "int" verwenden, sondern System.Int32.
Das Problem ist, dass "int" bzw "double" keine echten Typen sind, sondern nur Aliase auf Typen. Die einfachste Möglichkeit um das abzufangen ist wohl eine Tabelle mit den Aliasen zu hinterlegen und auf diese Tabelle zu parsen.
Hallo,
ich greife aus einer WindowsForms-Anwendung auf einen WebService zu. Zunächst hab ich das unter Windows7 mit einer lokalen IIS-Installation entwickelt und getestet. Hat auch alles ganz gut funktioniert. Zur Authentifizierung innerhalb des webservice verwende ich die WindowsCredentials, die ich im Windows-Forms-Client initialisiere
_service = new DataAccess.DataService();
_service.Credentials = CredentialCache.DefaultCredentials;
_service.CookieContainer = _cookieContainer;
Wie gesagt: Unter Windows7 mit einer lokalen Installation hat das problemlos funktioniert.
Jetzt wollte ich das ganze aber unter Windows XP innerhalb einer Domain verwenden, wobei der IIS als eigenständiger Server im Netzwerk läuft und es geht gar nix mehr. Im Debugmodus hab ich festgestellt, dass die DefaultCredentials leer sind.
Muss ich da irgendwas anderes beachten, wenn ich innerhalb einer Domain arbeite? Oder gibt es eine ganz andere Lösung, dass ich die Credentials des Webservice mit entsprechenden Daten fülle und die Windows-Authetifizierung des Webservers nutzen kann?
Zusätzliche Information:
Die Authentifizierungs-Überprüfung, die ich im Webservice verwende, läuft ausserdem auch auf einer Webseite, die ebenfalls mit Windows-Authentifizierung arbeitet. Da gibt es keine Probleme damit. Ich möchte nach Möglichkeit nichts an der Authentifizierungs-Methode ändern, da diese zu einem größeren Produkt gehört. Stattdessen sollte ich nur meinen Client anpassen, so dass der den Service entsprechend nutzen kann.
weiter gäbe es die Möglichkeit im Consolen-Programm am Ende mit einem Console.ReadKey(); einen Tastendruck abzuwarten bevor sich das Programm beendet.
ok. Hab die Lösung für's erste einmal selber gefunden.
zum signieren
// KeyFile einlesen
FileStream keyfile = new FileStream("keyfile.snk", FileMode.Open, FileAccess.Read);
BinaryReader reader = new BinaryReader(keyfile);
byte[] keyFileContent = reader.ReadBytes((int)keyfile.Length);
// CryptoServiceProvider erstellen und aus keyfile initialisieren
RSACryptoServiceProvider signer = new RSACryptoServiceProvider();
signer.ImportCspBlob(keyFileContent);
// Daten signieren (ReadData() liefert byte[] zurück
byte[] signature = signer.SignData(ReadData(), new SHA1CryptoServiceProvider());
dann noch der verify in der signierten DLL
RSACryptoServiceProvider verifier = GetPublicKeyFromAssembly(asm);
bool valid = verifier.VerifyData(ReadData(), new SHA1CryptoServiceProvider(), signature);
private static RSACryptoServiceProvider GetPublicKeyFromAssembly(Assembly assembly)
{
if (assembly == null)
throw new ArgumentNullException("assembly", "Assembly may not be null");
byte[] pubkey = assembly.GetName().GetPublicKey();
if (pubkey.Length == 0)
throw new ArgumentException("No public key in assembly.");
RSAParameters rsaParams = EncryptionUtils.GetRSAParameters(pubkey);
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.ImportParameters(rsaParams);
return rsa;
}
Die Class EncryptionUtils hab ich im Netz gefunden: http://www.chaosink.co.uk/files/code/encryptionutils.zip
So. Ich bin mir jetzt nicht sicher, ob meine Grundlagen überhaupt gut genug sind oder ob ich ohnehin absolut auf dem Holzweg bin.
Ich habe folgendes vor:
Ich hab eine signierte Assembly, die signierte Dateien einliest.
Eine andere Anwendung erstellt diese Dateien und signiert sie mit dem PublicKey, der in der signierten Assembly gespeichert ist.
Es soll in der Assembly dabei sichergestellt werden, dass es sich um gültige Dateien handelt. Um nicht ein unnötiges zusätzliches Sicherheitsrisiko zu erstellen, möchte ich nach Möglichkeit direkt den Key verwenden, der zur Signierung der Assembly verwendet wurde.
So. Nun zu den Fragen:*Was steht eigentlich im StrongNameKeyFile und kann man das irgendwie auslesen und verarbeiten? *Ist es möglich, den entsprechenden PublicKey aus dem StrongNameKeyFile zu beziehen, mit dem die Assembly signiert ist? Wenn ja, wie macht man das? *Kann man unter Umständen auch den PrivateKey aus dem File beziehen um zum Beispiel eine komplette Verschlüsselung über den PrivateKey abzubilden?
Für solche undefinierten Sachen verwende ich ganz gerne Hashtable. Allerdings versuche ich das nach Möglichkeit auch immer zu vermeiden, da es eben nicht typsicher ist.
Wenn man die Struktur ein bisschen überdenkt, findet man auch meist eine brauchbare Lösung, mit der man Dictionary verwenden kann. Zum Beispiel kann ich mir kaum vorstellen, dass die gespeicherten Objekte wirklich gar nichts miteinander zu tun haben. In der Regel handelt es sich um abgeleitete Objekt. Dann kann man immer noch eine Liste über das Basis-Objekt machen. Der Key muss eigentlich eh immer eindeutig sein, damit man einen sinnvollen Zugriff auf die Liste hat. Abfragen mit Contains sollte man möglichst einfach halten, da ich die erfahrung gemacht habe, dass man da gerne sehr viel an Performance verliert.
Hallo,
wir haben eine Software, bei der wir über NHibernate auf die Datenbank zugreifen. Bisher haben wir immer MSSql verwendet und wollen jetzt gerade Tests machen, ob das Ganze auch auf Oracle einsetzbar ist.
Natürlich ist das nicht der Fall (wie es immer ist, wenn die Zeit eng ist).
Das Problem ist, dass Oracle den DataType Guid nicht kennt.
System.ArgumentException: Dialect does not support DbType.Guid
Jetzt hab ich verschiedene Lösungen gesehen, dass man einen UserType statt Guid verwendet kann. Das ganze wird dann mehr oder weniger als RAW implementiert und man könnte so das Ganze umgehen. Allerdings heißt das für uns, dass wir sämtliche MappingFiles umschreiben müssten, was doch ein enormer Aufwand wäre.
Eine alternative Lösung wäre scheinbar, den OracleDialect neu zu implementieren. Allerdings hab ich nirgendwo eine detailierte Beschreibung dazu gefunden. Kennt diese Lösung vielleicht jemand und weiß vielleicht auch noch einen Artikel dazu?
Oder kennt jemand noch eine andere Lösung, wie man dieses Problem umgehen könnte?
Edit: Das Problem hat sich erledigt. Mit NHibernate 2.1.0 wurde das Problem gelöst. Jetzt gibt es nur noch ein paar andere kleine Probleme, die ich aber erst noch genauer ergründen muss. So Datenbank-Unabhägig ist das Ganze eben doch nicht grml
Also meine Vermutung ist, dass die Assembly irgendwelche Referencen verwendet, die der ladenden Assembly nicht vorhanden sind.
Ich hab jetzt so etwas schon lange nicht mehr gemacht, aber wenn ich mich richtig erinnere, kann man irgendwie auch noch die Referenced Assemblies auslesen und entsprechend laden.
Versuch mal rein interessehalber, dass du das "OnResize" entfernst. Mal schauen, ob es daran liegt. Soviel ich weiß springt das Event auch im Designer an und setzt dann deine entsprechenden Größen nach irgendwelchen Initialwerten.
ich bin mir da jetzt aber nicht ganz sicher.
Also ich würd das ja so machen, dass ich die dynamischen Inhalte in UserControls auslagere und diese beim Anzeigen auf ein Panel lege. Beim ButtonClick dann die ControlCollection des Panels clearen (hübsches denglisch 😃 ) und dann das neue Control in das Panel setzen.
Panel pan = new Panel();
pan.Controls.Clear();
pan.Controls.Add(usrCtrl);
Falls man den State des alten Controls evtl noch braucht, kann man diesen auch vorm Clear noch wegsichern und falls es nochmal eingehängt werden soll, den State eben auch wieder lesen.
Vorteil daran ist meines Erachtens vorallem, dass man dann die einzelnen ContentControls einfach besser designen und bearbeiten kann. Zudem sicherlich auch nicht schlecht, wenn man die Logiken der einzelnen Views ein bisschen trennt zwecks Übersichtlichkeit.
Eine andere Möglichkeit wäre, dass man ein Post-Build-Ereignis anlegt, das die entsprechenden Dateien kopiert. Beim Publishen muss man diese allerdings dann auch noch manuell ins Installer-Project hinzufügen.
Also ich weiß nicht, was heute anders ist, aber aus irgendeinem Grund funktioniert es heute nachdem ich die Klasse komplett neu geschrieben habe. Ein Dateivergleich mit der gestrigen Version liefert mir auch keine Hinweise, was ich heute anders gemacht habe.
Also sehe ich das mal als erledigt an
Wo finde ich denn bei VS-Express die angesprochene Eingabeaufforderung ?
Mit Eingabeaufforderung ist in dem Artikel wirklich die ganze normale Eingabeaufforderung gemeint. Also Kommandozeile, Commandbox, Eingabeaufforderung oder wie man sie auch nennen mag. (Ausführen cmd.exe)
Das Programm xsd.exe selbst sollte entweder beim .NET SDK oder beim Visual Studio SDK dabei sein. Bin mir da jetzt nicht ganz sicher.
Danke. Gerade hab ich die Sache mit dem gierigen Verhalten auch gefunden.
Falls es noch jemand braucht, hier noch eine verkürzte Form:
(<UITF_([A-Z]*)\b[^>]*>)(.*?)(<\/UITF_\2\>)
Es ist ein Ausschnitt aus einer HTML-Seite gegeben, die neben normalen HTML-Tags auch noch eigene Tags für benutzerspezifische Controls enthält. Ich bräuchte jetzt den gesamten Text, der innerhalb dieser Controls im Markup steht für weitere Bearbeitungen.
Grundlegend funktioniert das schon. Allerdings hab ich ein kleines Problem dabei, wenn ein Control mehrmals im Markup verwendet wird.
Derzeit verwende ich folgenden Regex:
(\<UITF_([A-Z][^\s]*)[^\>]*\>)(.*)(\<\/UITF_\2\>)
Optionen: RegexOptions.Multiline | RegexOptions.IgnoreCase
Die Controls beginnen immer mit UITF. Also zum Beispiel <UITF_LABEL id=001>text</UITF_LABEL>
Es wird also ein passender Start-Tag gesucht, in Group 2 wird die genaue Bezeichnung abgelegt (zum Beispiel LABEL) und der Endtag wird dann mit Backreference wieder zusammengebaut.
In Group 3 befindet sich der Inhalt zwischen Start-Tag und End-Tag.
Das funktioniert, wenn sich der Inhalt auf eine Zeile beschränkt. Wenn allerdings der Inhalt zwischen Start-Tag und End-Tag mehrere Zeilen beinhaltet, wird er nicht mehr gefunden.
Ich hab es schon mit der Option RegexOptions.SingleLine funktioniert und dann sieht es auf den ersten Blick ganz gut aus. Allerdings werden dann alle Zeichen zwischen dem Start-Tag und dem letzten vorkommenden End-Tag gefunden. Der erste End-Tag, der sich wirklich auf den Start-Tag beziehen würde, wird also ignoriert.
Ich probier da jetzt schon eine ganze Weile rum, aber irgendwie hab ich bei diesem Thema eine kleine Denk-Blokade und komm einfach nicht auf die richtige Lösung.
Meine Idee war, dass ich statt (.) ein Expression brauche, dass den Inhalte des Start-Tags ausklammert. In etwa ([^<UITF_\2]]. Damit wird dann aber gar nichts mehr gefunden.
ich bin sicher, dass es eigentlich ganz einfach ist, aber... naja. Vielleicht kann mir jemand dabei helfen.
Danke
Edit: hier noch ein genaueres Beispiel:
<TD><UITF_LABEL id="001"><SPAN>Inhalte mit einer Zeile</SPAN></UITF_LABEL></TD>
<TD><UITF_LABEL id="001"><SPAN>Inhalte mit
zwei Zeilen</SPAN></UITF_LABEL></TD>
<TD><UITF_LABEL id="001"><SPAN>Inhalt mit einer Zeile</SPAN></UITF_LABEL></TD>
Ohne Option RegexOptions.SingleLine wird die erste und die dritte Zeile gefunden.
Mit Option SingleLine wird alles zwischen den ersten <UITF_LABEL und letztem </UITF_LABEL> gefunden.
Ich bräuchte aber auch die zweite Zeile, die einen Zeilenumbruch beinhaltet
Hab ich auch schon ausprobiert. Hat aber auch nichts gebracht.
ich hab mittlerweile auch schon ein anderes Beispielprogramm ausprobiert (http://code.msdn.microsoft.com/TaskDialogforWinForm) mit dem es einwandfrei funktioniert. Dieser Dialog verwendet zwar TaskDialogIndirect aus der ComCtl32.Dll, aber auch diese Funktion wird in meinem Beispiel-programm nicht gefunden.
Ich hab die ComCtl32 auch mal mit DllExport analysiert und auch da werden mir die entsprechenden Einsprungpunkte nicht angzeigt.
Irgendwie steh ich da gerade ziemlich auf dem Schlauch. Zum einen weiß ich, dass es funktionieren muss und zum anderen klappt es im eigenen Code ganz und gar nicht.
Im Allgemeinen benutz ich schon WPF aber nicht in diesem Fall. Das Beispielprogramm basiert auf einfachem Windows.Forms.
Ich versuche gerade für Vista die systemeigene Messagebox einzusetzen. es gibt zwar einige Wrapper, die das ganz gut machen, aber ich wollte einen solchen Wrapper zu Übungszwecken selber zusammenbauen. Aus irgendeinem Grund klappt das aber nicht.
[DllImport("comctl32.dll")]
static extern int TaskDialog(
[In] IntPtr hWndParent,
[In] IntPtr hInstance,
[In] String pszWindowTitle,
[In] String pszMainInstruction,
[In] String pszContent,
[In] int dwCommonButtons,
[In] IntPtr pszIcon,
[Out] out int pnButton);
So sollte der Import ja eigentlich aussehen. Allerdings bekomme ich dann zur Laufzeit eine EntryPointNotFoundException.
Hab ich da irgendwas falsch verstanden?
Im großen und Ganzen hab ich mich an diese Anleitung angelehnt: http://bartdesmet.net/blogs/bart/archive/2006/09/26/4470.aspx
Also system verwende ich
Hat jemand so etwas bereits ausprobiert?
Ich werde jetzt dann noch ein kleines Test-Projekt extrahieren, damit ich die problematik besser darstellen kann.
Aber ich denke nicht, dass es mit dem ClientBin zusammenhängt, weil eine einfach HTML-Seite die mit dem Object-Tag das Xab einbindet ohne Probleme funktioniert.
Beim Einbinden in die ascx-Seite mit dem Object-Tag wird übrigens ein Platzhalter für das Silverlight-Objekt reserviert. Aber nichts darin angezeigt. Meine Vermutung läuft also immer eher in die Richtung, dass die Xab nicht gefunden wird.
Hallo,
ich möchte bei einem dynamisch geladenen WebUserForm ein Silverlight-Plugin verwenden. Prinzipiell scheint das auch zu funktionieren. Aber das Silverlight-Objekt wird dann nicht angezeigt (keine erkennbare Fehlermeldung)
Funktionieren soll das ganze so:
Auf einer aspx-Seite werden je nach Konfiguration verschiedene ascx-Controls zur Anzeige geladen. Das geschieht mit LoadControl().
Auf der neuen ascx-seite wird dann ein das Silverlight-Modul eingebunden. In meinem Beispiel verwende ich nur ein kleines Deepzoom-Beispiel.
<asp:Panel ID="panel" runat="server" BorderColor="LightGray" BorderStyle="Solid" BorderWidth="1px"
Style="margin-top: 5px; margin-bottom: 5px; padding:5px; max-height:250px; overflow:auto; ">
<asp:Silverlight ID="Xaml1" runat="server" Source="~/CustomControls/DeepzoomDemo/DeepZoomProject.xap"
Width="100%" Height="100%"
MinimumVersion="2.0.31005.0"
AutoUpgrade="true"
OnPluginError="OnPluginErrorHandler" />
</asp:Panel>
Die Datei DeepZoomProject.xap liegt im gleichen Verzeichnis wie die ascx Seite. Sie aufrufende aspx-Seite allerdings liegt in einem anderen Folder.
Wie bereits erwähnt wird kein Fehler ausgegeben. Von daher denke ich mir, dass vielleicht noch irgendwas angestoßen werden muss, damit die Xap-Datei geladen/ausgeführt wird.
Oder wird die Xap vielleicht gar nicht auf diesem weg gefunden?
Hat jemand schon einmal etwas in der Art gemacht und kann mir ein paar Tips geben, wie ich rausfinde, was letztendlich schief läuft?
Danke schon mal
Ich hab's befürchtet. Na dann muss wohl doch wieder das gute alte ADO dafür herhalten.
Danke für die Info
Ich find im moment irgendwie keine Informationen, ob es möglich ist oder nicht.
Es geht darum, dass ich einen DB-Zugriff auf eine Oracle-Datenbank mit Linq realisieren möchte. Als Einschränkung gibt es allerdings eben auch noch VS2005 und .NET 2.0 SP1.
Kann man mit dieser Konstellation die vollen Features von Linq2Sql benutzen? Und wenn ja, wie kann ich sie nutzen?
Ich hab zwar gesehen, dass es den Namespace System.Linq gibt, aber wenn ich einen Inline-Code schreib, sieht es irgendwie schlecht aus. Oder hab ich einfach was vergessen?
(Noch schöner wäre das Entity Framework, aber da werd ich wohl erst recht keine Chance haben)
Unter regedit.exe konnte ich keinen Eintrag mit DefaultIcon finden.
Mit C# hat es allerdings auch nicht geklappt. Mein Code mit Fehlermeldung:RegistryKey rk = Registry.ClassesRoot.CreateSubKey(".xyz"); // funktioniert einwandfrei rk = rk.CreateSubKey("DefaultIcon"); // löst UnauthorizedAccessException aus
Der Zugriff auf den Registrierungsschlüssel "HKEY_CLASSES_ROOT.xyz\DefaultIcon" wurde verweigert.
Was ich da etwas falsch gemacht?
- Normaler User haben keine SchreibtRechte auf die Registry. Daher muss eh ein Adminuser her, der ja auch die Anwendung installiert.
Und damit ist das Problem eigentlich auch schon erklärt. .NET arbeitet in der Regel mit eingeschränkten Rechten, so weit ich informiert bin. Dadurch ist es nicht so ohne weiteres möglich auf die Registry schreibend zuzugreifen. Ich würde aber auf jeden Fall auch den Weg über den Installer empfehlen. Der Vorteil daran ist, dass die Schlüssel dann auch beim Deinstallieren wieder entfernt werden können.
Ich weiß jetzt nur den Weg über InnoSetup. Hier ist es kein Problem ein paar Registry-Schlüssel anlegen zu lassen. Ich vermisse diese Funktion allerdings beim Visual-Studio Setup-Projekt. Oder ich hab sie einfach noch nicht gesehen.
In den Projektoptionen gibt's unter BUILD eine Checkbox, die man anhacken muss. Ich weiß jetzt gerade die genaue Bezeichnung nicht, aber das findet man schon.
Irgendwas mach ich dann da aber falsch. Mein Code in C# sieht so aus:
static void Main(string[] args)
{
Wrapper.NvAPI_Status status;
Wrapper.NetNvDisplayHandle display = new NetNvDisplayHandle();
uint thisEnum = 0;
status = NvAPINet.NvAPINet_Initialize();
status = NvAPINet.NvAPINet_EnumNvidiaDisplayHandle(thisEnum, ref display);
}
Die Fehlermeldungen lauten:
Error 1 The best overloaded method match for 'Wrapper.NvAPINet.NvAPINet_EnumNvidiaDisplayHandle(uint, Wrapper.NetNvDisplayHandle*)' has some invalid arguments
Error 2 Argument '2': cannot convert from 'ref Wrapper.NetNvDisplayHandle' to 'Wrapper.NetNvDisplayHandle*'
Wenn ich dagegen das 'ref' weglasse, lautet die zweite Fehlermeldung so:
Error 2 Argument '2': cannot convert from 'Wrapper.NetNvDisplayHandle' to 'Wrapper.NetNvDisplayHandle*'
Und es ist ja nicht so, dass ich nicht weiter probiere. Daher hab ich einfach mal '*display' übergeben. Ich kenn das zwar in C# nicht, aber wer weiß. Das Ergebnis ist eine Fehlermeldung:
Error 1 The * or -> operator must be applied to a pointer
IntelliSense zeigt mir als Aufruf
NvAPINet_Status NvAPINet.NvAPINet_EnumNvidiaDisplayHandle(uint thisEnum, NetNvDisplayHandle* pNvDisplayHandle)
So. ich hab jetzt auch mal begonnen, dass ich mit C++/CLI eine Wrapper-Klasse dafür schreibe. Der erste Kontakt mit Managed C++.
Meine Funktionalität hab ich auch schon so weit hinbekommen und kann damit jetzt in Ruhe weiter machen. Allerdings gefällt mir die Idee, mit einer richtigen Wrapper-Klasse und möchte diese auch umsetzen. Allerdings fehlt mir da einiges an Grundwissen. Vielleicht kann mir jemand an Hand eines Beispiels helfen. Auch wenn das wohl eher in ein C++ Forum gehören würde, wie ich denke.
Also ich hab folgende Methode aus der API:
NVAPI_INTERFACE NvAPI_EnumNvidiaDisplayHandle ( NvU32 thisEnum,
NvDisplayHandle * pNvDispHandle
)
Die einzelnen Bestandteile, die ich benötige sind also*NVAPI_INTERFACE
#define NVAPI_INTERFACE extern NvAPI_Status __cdecl
...
typedef enum
{
NVAPI_OK = 0, // Success
NVAPI_ERROR = -1, // Generic error
...
} NvAPI_Status;
Das hab ich umgesetzt in ein public enum struct
public enum struct NvAPI_Status...
Der Teil funktioniert auch und kann so bereits aus C# raus verwenden
*NvU32
stellt kein Problem dar, da es sich dabei einfach nur um einen uint handelt
*NvDisplayHandle
Das ist ein seltsames Konstrukt, das ich schon ewig nimmer gesehen hab. Hab aber auch schon lange nimmer tiefer in C++ gearbeitet.
#define NV_DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name
...
NV_DECLARE_HANDLE(NvDisplayHandle);
Nach Auflösen des Makros sollte also so etwas dabei rauskommen:
struct NvDisplayHandle__ { int unused; };
typedef struct NvDisplayHandle__ *NvDisplayHandle;
Da bin ich jetzt mit der Umsetzung schon ein bisschen unsicher.
public struct NetNvDisplayHandle { int unused; };
Doch wie setze ich den Zeiger um? Oder brauch ich den gar nicht?
*Die Funktion selbst
Die sieht jetzt letztendlich so aus:
static NvAPI_Status NvAPINet_EnumNvidiaDisplayHandle( NvU32 thisEnum, NetNvDisplayHandle *pNvDispHandle );
Der Quellcode dazu:
NvAPI_Status NvAPINet::NvAPINet_EnumNvidiaDisplayHandle( NvU32 thisEnum, NetNvDisplayHandle *pNvDispHandle)
{
return (NvAPI_Status) NvAPI_EnumNvidiaDisplayHandle(thisEnum, (NvDisplayHandle*)pNvDispHandle);
}
Hier bin ich mir nicht sicher, ob die Umwandlung mit dem Zeiger überhaupt so stimmt. Auf jeden Fall lässt sich die Datei so kompilieren.
In C# wenn ich das einbinde hab ich aber jetzt keine Ahnung, wie ich den Zeiger NetNvDisplayHandle übergeben muss?
Im Anhang hab ich auch noch das C++ Projekt. ich würde mich echt freuen, wenn sich das jemand anschauen könnte und mir ein paar Tips geben könnte, wie man so etwas macht. Dann würde ich endlich auch meine SoundBridgeAPI sinnvoll umschreiben 🙂
So. NVidia hat's endlich geschafft eine API zur Verfügung zu stellen, so dass auch Normalsterbliche jetzt auf die Treiberfunktionalitäten zugreifen können. Die Sache hat nur einen Haken. es handelt sich natürlich um eine Header-Datei und eine dazugehörige Lib.
Irgendie kann man sich da doch sicherlich einen Wrapper basteln, so dass man die Lib aus C# heraus verwendet, oder?
Ich hab jetzt allerdings keine Doku gefunden, wie man bei so etwas vorgeht. Kennt da jemand eine gute Anleitung oder kann mir da ein sinnvolles Vorgehen vielleicht erklären?
Falls es noch jemanden interessiert, hier noch der Link zur API:
http://developer.nvidia.com/object/nvapi.html
Und gleich noch eine Frage dazu. Eigentlich interessieren mich nur ein paar einzelne Funktionen aus dieser Api. Wie zum Beispiel NvAPI_GPU_GetThermalSettings. Das heißt doch, dass man auch gar nicht alles in den Wrapper reinschieben muss, oder? Ansonsten könnte das nämlich unter Umständen ein bisschen viel Arbeit werden befürchte ich.
Dank schon mal. Und ich geh jetzt endlich ins Bett.
Ich war anfangs auch nicht begeistert von Vista. Auch jetztmuss ich ehrlich gesagt noch sagen, dass es sich nicht lohnt eine Vista-Version zu kaufen, wenn man sie nicht wegen irgendwas dringend braucht. Ich hatte das Glück, dass ich Vista Business bei einer Verlosung gewonnen habe.
Letztendlich hab ich es aber dennoch geschafft, dass ich mich daran gewöhne. Was ich bei mir jetzt allerdings interessant finde ist die Art der Bedienung, wenn es um administrative Tätigkeiten geht. Während ich bei XP ziemlich genau wusste, in welchem Menü was zu finden ist, finde ich diverse Sachen bei Vista jetzt immer noch nicht. Aber statt dass ich mich in die verschiedenen Menüs einarbeite, ist mir aufgefallen, dass ich viel mehr auf der Kommandozeile mache. Auch Programme starten läuft bei mir mittlerweile meistens über das Ausführen-Fenster, weil das schneller geht als wenn ich in diesem Vista-Ordner-Menü was suchen muss. Irgendwie erinnert mich meine derzeitige Bedienung von Vista ein bisschen an Linux. Denn auch da arbeite ich fast ausschließlich über die Console.
Was die 7er Version mit sich bringt, wird sich letztendlich zeigen. ich denke ehrlich gesagt schon, dass MS irgendwie noch versuchen wird, die Bedürfnisse der großen Firmen auszuloten. Das letzte Wort über die Featurelist von Windows 7 ist noch lange nicht gesprochen und es handelt sich bei den oben genannten Screenshots ohnehin nicht um eine offizielle Ankündigung. Von daher würde ich auf jeden Fall noch ein bisschen warten bis es handfeste Details gibt.
echte globale Variablen gibt es nicht (und finde ich auch nicht sonderlich schön)
Man kann allerdings das ganze ein wenig umgehen, indem man einen public static class anlegt und in dieser dann public variablen deklariert. Diese können dann überall, wo dieser Klasse bekannt ist (namespace) verwendet werden.