Laden...
D
dein.Tod myCSharp.de - Member
Fachinformatiker Anwendungsentwicklung Azubi Dabei seit 06.09.2008 69 Beiträge
Benutzerbeschreibung
Coffee-Compiler

Forenbeiträge von dein.Tod Ingesamt 69 Beiträge

19.04.2012 - 11:09 Uhr

Also ich verwende jetzt WinDbg mit der sos.dll dort gibt es den befehl ~* e !clrstack mit dem man sich alle stack traces aller threads anschauen kann.

17.04.2012 - 15:40 Uhr

Hallo Community,

ich habe derzeit ein problem mit der Windows Workflow Foundation das ich bei Last im service aufruf einen Timeout bekomme, dieses verhalten kann ich auch reporduzieren allerdings finde ich nicht heraus wodurch dieser timeout verursacht wird.

Jetzt würde ich gerne sobalt der prozess anfängt zu hängen alle stack traces aller .NET Threads meiner applikation auslesen damit ich sehe in welcher methode meine applikation hängt.

Die Windows Workflow Foundation zu debuggen ist aufgrund ihrer größe eher schlecht da es dort schwieriger ist den fehler einzugrenzen.

Ich habe gehört das WinDebug das angeblich könnte ist das auch mit visual studio oder einem anderen tool möglich?

01.08.2010 - 10:42 Uhr

Natürlich ist abstraktion wichtig - das problem bei abstraction ist nur das es länger dauert ein programm zu schreiben dass in mehrere Layer aufgeteilt ist, und man sollte immer abwägen inwieweit man hier abstrahieren sollten. Ich glaube nämlich die wenigsten hier werden bei jedem kleinen Consolen Tool mit einem eigenen Presentation Layer ausstatten.

Und sollte man wirklich jede kleine Applikation in

Data Access Layer (ADO.NET, Entitiy Framwork)
Network Layer (WCF, TcpIp etc.)
Business Layer (Eine Client bzw Server API die Data Access und Network Layer unter sich vereint)
Presentation Layer (WPF, Silverlight, WinForms, ASP.NET, Console)
und diesen wieder per MVVM, MVC und anderen patterns aufsplitten?

aufteilen? Meist wird das ja nur in den großen Kern Komponenten getan, bei den kleineren Tools ist das ja meist alles vermischt.

19.06.2010 - 15:49 Uhr

Hallo - ich hab vor kurzer zeit auch einen designer bauen dürfen, vieleicht kann ich dir ja weiterhelfen.

Falls du dich ein bisschen mit WPF auskennst könntest du dir mal dass hier anschauen:
http://www.codeproject.com/KB/WPF/WPFDiagramDesigner_Part2.aspx

Der Typ hat nen Diagram Designer gemacht - mit DragDrop Resizing elemente verschieben usw. Das ganze is ne Artikel Serie, ich hab dir jetzt nur part 2 der artikelserie verlinkt damit du dir anhand des sampels mal anschaun kannst ob dass das ist was du brauchst.

01.06.2010 - 22:40 Uhr

Ich muss leider eingestehen das ich es nicht schaffe den crypto stream zu verwenden - ich habe jetzt mehrere stunden herumprobiert, habe es aber trotzdem nicht geschafft ^^ Auch nicht mit den Sampels aus Google/MSDN etc.

Mein vorläufiges ziel war es einen memory stream zu verschlüsseln und andschließen wieder zu entschlüsseln, muss noch nichtmal gebuffered sein.

Hätte jemand vieleicht die güte einen von selbstzweifeln geplagten programmierer zu helfen?
(Wundert euch nciht über die komischen codekonstrukte ich habe schon viel versucht)

Immoment crashed er bei der deserialisierung.



using System;
using System.Collections.Generic;
using System.Text;

using System.IO;
using System.Security.Cryptography;

namespace CryptoTest
{
class Program
{
static void Main(string[] args)
{
byte[] password = new byte[] { 33, 44, 55 };
MemoryStream dataStream = new MemoryStream(new byte[]
{
55, 213, 12, 66, 88, 99
});

var cryptClass = new CryptClass();

Console.WriteLine("Original:");
DisplayStream(dataStream);

Stream cryptedStream = cryptClass.Encrypt(dataStream, password);
Console.WriteLine("Crypted:");
DisplayStream(cryptedStream);

Stream decryptedStream = cryptClass.Decrypt(cryptedStream, password);
Console.WriteLine("Decrypted:");
DisplayStream(decryptedStream);

Console.ReadLine();
}

static void DisplayStream(Stream stream)
{
StringBuilder sb = new StringBuilder();

byte[] buffer = new byte[stream.Length];
stream.Read(buffer, 0, buffer.Length);

for (int i = 0; i < buffer.Length; i++)
{
sb.Append(buffer[i] + " ");
}

Console.WriteLine(sb.ToString());
}
}

public class CryptClass
{
public CryptClass()
{

}

protected static readonly byte[] Salt =
{
0x49, 0x76, 0x61, 0x6e,
0x20, 0x4d, 0x65, 0x64,
0x76, 0x65, 0x64, 0x65,
0x33, 0xb3, 0xfa, 0x9c
};


public Stream Encrypt(Stream toEncrypt, byte[] password)
{
Rijndael rijndael = BuildRijndael(password);

byte[] toEncryptByteArr = new byte[toEncrypt.Length];
toEncrypt.Read(toEncryptByteArr, 0, toEncryptByteArr.Length);

using (MemoryStream memoryStream = new MemoryStream())
{
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, rijndael.CreateEncryptor(), CryptoStreamMode.Write))
{
cryptoStream.Write(toEncryptByteArr, 0, (int)toEncrypt.Length);
// Write to memoryStream;

return new MemoryStream(memoryStream.ToArray());
}
}
}

public Stream Decrypt(Stream toDecrypt, byte[] password)
{
Rijndael rijndael = BuildRijndael(password);

byte[] toDecryptByteArr = new byte[toDecrypt.Length];
toDecrypt.Read(toDecryptByteArr, 0, toDecryptByteArr.Length);

using (MemoryStream memStream = new MemoryStream())
{
using (CryptoStream cryptoStream = new CryptoStream(memStream, rijndael.CreateDecryptor(), CryptoStreamMode.Write))
{
cryptoStream.Write(toDecryptByteArr, 0, (int)toDecrypt.Length);
return new MemoryStream(memStream.ToArray());
}
}
}

private Rijndael BuildRijndael(byte[] key)
{
PasswordDeriveBytes pdb = new PasswordDeriveBytes(key, CryptClass.Salt);
Rijndael rijndael = Rijndael.Create();
rijndael.Key = pdb.GetBytes(16);
rijndael.IV = pdb.GetBytes(16);
return rijndael;
}
}
}

01.06.2010 - 10:26 Uhr

Hallo Community,

Ich baue derzeit einen Designer für bestimmte Dialoge und es soll unter anderem möglich sein die Aufteilung innerhalb eines Controls per Grid Splitter UND per Numeric Up Down zu definieren. Damit sich der inhalt des NumericUpDown immer aktualisiert brauche ich ein two way binding auf die Width des Controls.

Das Problem ist jetzt aber wenn ich die daten im NumericUpDown verändere funktionert das ganze, wenn ich allerdings die größe der Controls per GridSplitter verändere feuert die Width Property nicht.

Info: Der TwipsConverter wird benötigt da die größenangaben in twips gemacht werden.Sieht jemand einen Fehler in meinem code? Muss ich im code behind and ActualWidth binden? Oder geht das ganze nur per Adorner?

 <Grid
VerticalAlignment="Center"
IsHitTestVisible="True"
>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>

<GridSplitter Grid.Column="0"
VerticalAlignment="Stretch"
HorizontalAlignment="Right"
Background="Green"
ShowsPreview="False"
Width="5"
/>

<TextBlock Text="{Binding Label}"
Grid.Column="0"
Width="{Binding LabelWidth, Mode=TwoWay, Converter={StaticResource TwipsConverter}, ConverterParameter=LabelWidth }"
VerticalAlignment="Top" HorizontalAlignment="Left"
IsHitTestVisible="False"
/>
<TextBox Text="ABC"
Grid.Column="2"
VerticalAlignment="Stretch"
Margin="0,0,7,0"
IsHitTestVisible="False"
/>
</Grid>

12.05.2010 - 20:07 Uhr

Also wir vertreiben ein Dokumenten Management System und wir setzen sehr wohl sowas beim kunden ein ^^. Allerdings verwenden wir kein WinApi gehacke sondern Microsoft stellt meines wissens COM Libaries bereit um soetwas zu tun.

Kann aber jetzt leider nicht sagen welche Libaries das sind. Wollte nur mal gesagt haben - ja das geht.

13.04.2010 - 22:31 Uhr

Ich habe folgendes Problem

Ich will bestimmte Programm-Konfigurationen in einem TreeView darstellen dazu binde ich eine Liste von Programmkonfigurationen an ein TreeViewItem, das Problem ist jetzt aber das nicht das Binden sondern dass so eine Konfiguration auch noch Unterknoten haben soll z.B.

  • Configuration 1*Ressourcen *Einstellungen *Gruppen *Kurztasten

  • Configuration 2 *Ressourcen *Einstellungen *Gruppen *Kurztasten


 
<TreeViewItem.ItemTemplate> 
<DataTemplate >
 <TreeViewItem Header="{Binding Title}"> 
<TreeViewItem.Items>
<TreeViewItem Header="Ressourcen" />
<TreeViewItem Header="Einstellungen" />
<TreeViewItem Header="Gruppen" />
<TreeViewItem Header="Kurztasten" />
</TreeViewItem.Items>
</TreeViewItem>
</DataTemplate >
</TreeViewItem.ItemTemplate>

Dann wird das Komplette ItemTemplate als EIN TreeNode genommen und es ist z.B nicht mehr möglich in dessen Sub Nodes per Pfeiltasten zu navigieren.Kann ich das Problem irgentwie im XAML lösen oder muss ich wirklich alle Items von Hand hinzufügen?

Edit: Leider konnte ich den xaml code nicht formatiert bekommen da mir der Editor immer die tabs gelöscht hat.

31.03.2010 - 22:45 Uhr

Das ganze geht aber nur wenn die Mainboard Soundkarte angesteckt ist - bei mir ist das nicht der fall - ich höre also nichts X(

Also als Warnsignal nur bedingt nutzbar.

17.03.2010 - 16:15 Uhr

da du zweimal nur die fehlermeldung gepostet hast kann ich dir leider nicht sagen wo dein fehler liegt - wäre toll wenn du das noch editieren würdest.

Aber generell würde ich dir raten das ganze über process start zu machen,

entweder

System.Diagnostics.Process.Start("www.google.de";);

Hierbei wird der Standardbrowser mit der seite google.de aufgerufen

System.Diagnostics.Process.Start("iexplore.exe";);

Hierbei wird der IE gestartet. Bedenkte aber das microsoft bald eine browserauswahl machen will bei der man auswählen kann welcher browser installiert werden soll. Und ich weiß nicht ob wenn man firefox installert hat der internet explorer dann noch funktionert.

08.03.2010 - 17:53 Uhr

Hallo dein.Tod,

wenn du versuchst eine Tabelle anzulegen kenne ich nur den weg über
>
und die von dir geschriebene "Art" wäre mir gänzlich neu.

Gruß
Stefan

Ich will keine Tabelle sondern einen Typ erstellen - diesen typ brauche ich damit ich einem stored proceder parameter erstellen kann, der eine Liste von Objekten entgegennimmt. Ich hatte nämlich keine lust das über xml zu machen

07.03.2010 - 23:51 Uhr

verwendetes Datenbanksystem: <Microsoft SQL Server 2008 Express>

Microsoft SQL Server Management Studio: 10.0.1600.22
Microsoft Data Access Components (MDAC): 6.0.6001.18000 (longhorn_rtm.080118-1840)

Meine frage hat zwar jetzt nicht direkt was mit C# zu tun sonder eher mit T-SQL (Versuche ein multi insert Stored Proceder mit Tabel Valued Parameters zu erstellen) hoffe allerdings das ihr so nett seid und meine kleine frage trotzdem beantwortet.

Bei folgendem Code:



-- ================================
-- Create User-defined Table Type
-- ================================
USE NC_SRV01
GO

-- Create the data type
CREATE TYPE dbo.ProvinceType AS TABLE
(
PosX int NOT NULL,
PosY int NOT NULL,
ProvType smallint NOT NULL,
ObjectId uniqueidentifier NULL
)
GO


wird immer die fehlermeldung:

Meldung 156, Ebene 15, Status 1, Zeile 3
Falsche Syntax in der Nähe des 'AS'-Schlüsselwortes.

ausgegeben obwohl der code so 1 zu 1 im msdn (und auf diversen anderen seiten) steht. Sowohl über ADO.NET als auch über das Management Studio.

Unterstützt die Express Version keine Tabel Valued Parameters? Liegt es an meiner Version oder hab ich doch irgent einen syntaxfehler?

27.02.2010 - 23:18 Uhr

Also an der Grafikkarte wirds nicht scheitern - ob ich jetzt HLSL unter .NET/XNA oder C++/DirectX ausführe ist realtiv Wurst.

Bei Prozessoren sieht das ganze schon anders aus - da ist C++ Deutlich im Vorteil, allerdings haben die Spieleentwickler noch immer Riesen Probleme mit Mulitcoreunterstützung und .NET 4.0's hauptinhalt ist multicoreunterstützung... Und wenn bald flächendeckend Vierkerner eingesetzt werden..?

Bleibt noch der Speicher - da ist .NET doch um einiges Hungriger, allerdings haben mitlerweile die meisten Spieler 2-4 gig ram - heißt hier ist das ganze auch nicht mehr sooo kritisch.

Allerdings wenn man ehrlich ist muss man sagen das reines .NET für ernsthafte Spieleprojekte immonent noch Träumerei ist und sich frühestens in 5-6 jahren anfangen wird durchzusetzen - meiner meinung nach. Immerhin müssten sich die Spieleentwickler auch ersteinmal in .NET einarbeiten.

Allerdings wird .NET von der Spieleindustrie auch nicht ignoriert, sehr viele Tools werden mitlerweile in .NET geschrieben - weil's einfach schneller geht.

Und was spricht denn dagegen das man die Engine in C++ schreibt und die Spiellogik und das Scripting in .NET macht, immerhin ist C# doch deutlich schöner als das recht prozedurale Lua und bietet bessere IDEs.

Das sich Java durchsetzt glaube ich nicht - Spiele sind immer noch Microsoft Terrain

26.02.2010 - 00:56 Uhr

Zitat msdn

Es wird nachdrücklich empfohlen, das Präfix sp_ nicht im Prozedurnamen zu verwenden. Dieses Präfix wird von SQL Server verwendet, um gespeicherte Systemprozeduren zu bestimmen.

ok wusst ich nicht - hab ich mir auch erst vor kurzem angewönt, weil ich eben gesehen hab das es der sql server so macht ^^. Naja was anderes suchen.

25.02.2010 - 18:47 Uhr

verwendetes Datenbanksystem: <MS SQL Server 2008>

Hallo,

ich bin schon länger auf der suche nach irgent einem leitfaden wie ich denn meine Tabellen, Views, Stored Proceders etc benennen soll, im web findet man zig verschiedene conventionen und microsoft gibt auch keinen einheitlichen standard vor (z.B. Microsoft CRM - alles lowercase grusel) bisher habe ich ein an .NET angelehntes naming, vermischt mit Microsoft Conventionen - jetzt würde ich gerne mal wissen welche naming conventions ihr verwendet.

Meine Bisherigen

Tabellen: PascalCase, Singular
Views: Siehe Tabellen
Stored Proceders: Leading "sp_" danach PascalCase

Columns: Pascal Case
PK Column: nur Id, kein <Tabellenname>Id
Index: IX_<TabelName>_<ColumnName> (wie management studio das vorgibt)

15.02.2010 - 21:41 Uhr

also es gibt ne extrem gute implementation von nem xna mvp zumindest für XNA, auch so das kurztasten funktionieren etc.

Link: http://www.codeproject.com/KB/WPF/XnaInWPF.aspx?msg=3138918#xx3138918xx

musst mal schaun ob du da ne slimDX implementierung draus machen kannst.

Selber ne implementierung schreiben anhand der tutorials funktionert meist nicht vernüftig - auf jeden fall hatte ich bei xna extreme probleme. (Will auch die gui mit wpf machen ^^)

17.01.2010 - 21:21 Uhr

gut dann wäre das geklart.

17.01.2010 - 03:33 Uhr

Hallo zusammen,

Also in einem meiner Programme speichere ich für jeden Typ ein bestimmtes Objekt in ein Dictionary, als Key wollte ich ursprünglich Type.GUID verwenden bis ich gemerkt habe das diese Property verdammt langsam ist. Imo verwende ich als Key des Dictionarys die Referenz des Typs was ja ohne weiteres geht da es jedes Type-Objekt ja nur ein mal gibt.

Allerdings - ich weiß nicht, per referenz indentifizieren ist irgentwie so unschön ^^. Habe jetzt gesehen das Type.GetHashCode() überschrieben ist. (Und auch genauso schnell wie referenz).

Weiß jemand von euch ob der Type HashCode unique ist? Im MSDN stand nichts dazu.

14.01.2010 - 16:50 Uhr

[VSTO][Word 2007]

Wie kann ich in Word 2007 im Ribbon unter "Start" eine Symbolleiste erstellen? Weil ich kenne nur den weg um eine Symbolleiste unter AddIns zu erstellen.

Bisher dachte ich das man lediglich unter AddIns seine Symbolleiste erstellen kann, jetzt hat aber einer unserer Mitbewerber es geschafft dass seine Symbolleiste im Ribbon unter Start gelistet ist. Ich würde jetzt gerne wissen ob das irgentwie mit VSTO geht oder evetuell über COM. Oder ob das etwas ist das man nur darf wenn man microsoft partner ist oder rumhackt.

14.01.2010 - 16:32 Uhr

wenn du eine list brauchst die bei änderungen schreit was spricht dann gegen

System.Collections.ObjectModel.ObservableCollection

13.01.2010 - 21:31 Uhr

Also erst mal mein beispiel dann die erklärung:

IStorable:



public static class Program
{
public static void Main()
{
IStoreable storable = new TextFileStore();
storable.StoreText("abc", @"C:\test.txt";
}
}

public interface IStoreable
{
void StoreText(string text, string path);
}

public class TextFileStore : IStoreable
{
#region IStoreable Member

public void StoreText(string text, string path)
{
System.IO.File.WriteAllText(path, text);
}

#endregion
}


Interfaces bieten - wie der Name schon sagt eine gemeinsame Schnittelle um etwas zu tun, beispielsweise könnte man für ISorable auch eine Implementierung machen die das ganze nicht im lokalen filesystem sondern auf einem Webserver speichert.

Anwendungsgebiet wäre z.B wenn man eine FileManager Classe erstellt die einen Konstruktor-Parameter erwartet vom Typ IStoreable mit welchem dieser dann files speichert. Wie die files gespeichert werden ist dem FileManager egal, es reicht ihm wenn das objekt die methode StoreText hat.

Eigentlich sollte doch die Klasse "TextFileStore" nicht einmal namentlich für die Klasse "Form" bekannt sein oder? Ich möchte ja eigentlich keine feste Kopplung zwischen den Klassen "Form" und "TextFileStore", sondern eine lose Kopplung indem ich gegen das Interface programmiere.

Stimmt - du könntest z.B IStoreable und TextFileStore in eine DLL auslagern und TextFileStore hierbei als internal (also nur innerhalb der dll sichtbar) kennzeichnen. In der dll gäbe es dann z.B eine Methode:



public IStorable GetStoreManager()
{
return new TextFileStore();
}


Diese Methode kann dann von deiner Applikation aufgerufen werden. Deine Applikation kennt den Typ TextFileStore nicht, weiß aber dass das object das es zurückbekommt die methode StoreText hat und kann diese aufrufen.

08.01.2010 - 16:37 Uhr

danke, das wars was ich gesucht habe,

hab zwar die methode gesehen aber nicht realisiert dass das genau das ist was ich suche.

08.01.2010 - 01:07 Uhr

Naja ich hättest es wohl genauer spezifizieren sollen - ich brauche keine allgemeine ToString() oder TryParse methode für einen speziellen typ, ich brauche eine methode die je nach typ ToString() oder Parse() aufruft.

Hintergrund ist nämlich das ich ein Configurations Objekt per reflection auslese und jede Property in eine Datenbanktablle schreibe. Diese Datenbanktabelle hat zwei columns, SettingName und SettingValue (beide string). Genauso soll es möglich sein diese datenbanktabelle entsprechend auch wieder auslesen und die properties des objekts wieder setzen.

Bevor ich mir jetzt eine methode schreibe die if(objectType == int), if(objectType == uint) usw. für sämtliche basistypen schreibe wollte ich wissen ob es jetzt nicht soetwas schon in der .NET basislibary gibt.

Edit: ok meine methoden oben sind falsch, sie müssten so aussehen:

string Serialize(object o)
object Deserialize(string s, Type targetType)

und null returnen falls der typ nicht convertiert werden kann.

07.01.2010 - 02:34 Uhr

Was ich suche ist eine Klasse mit der ich die .NET basisypen (also int, uint, short, float, double, DateTime, Enum etc.) in einen string umwandeln kann und wieder zurück.
Achtung das ganze soll nur mit basistypen laufen, also nichts mit xml serialisierung oder komplexen objekten.

Ich glaube sogar ich hätte das in der .NET basislibary schon irgentwann mal gesehen, zum verständnis das ganze stelle ich mir so vor:

string Serialize(object o)
object Deserialize(string s)

06.01.2010 - 23:55 Uhr

bei net framework 3.5 musst du aufpassen - es gibt nämlich noch ein sp1 in dem es einige ergänzungen für wpf gab.

06.01.2010 - 00:17 Uhr

bin mir grade nicht sicher ob das funktioniert aber könntest du nicht die GetHashCode und Equals methode von user überschreiben?

04.01.2010 - 16:39 Uhr

Also ein paar mehr informationen könntest du uns schon geben...

Lädst du die dll per code oder wird die dll per verweis geladen?

Wenn wir dir wirklich helfen sollen brächten wir deinen code...

hast du dir schon mal ausgeben lassen unter welchem pfad du die beiden dlls suchst? Also per message box bei Form_Load den pfad an dem die dll gescuth wird ausgeben und schauen ob die dll dort ist.

Meine erste idee: du hast die dll nur in den debug ordner getan und wenn du den prozess startest gehst du über release.

Machst du irgentwas mit current directory?

03.01.2010 - 01:33 Uhr

Also ich habs bei mir mal mit WMI versucht. Gibt da ein ganz nettes tool von microsoft, den "WMI Code Generator" der generiert dir code um bestimme PC Informationen auszulesen. Um die architektur auszulesen hat er mir folgendes ausgegeben:


using System;
using System.Management;
using System.Windows.Forms;
public class MyWMIQuery
{
public static void Main()
{
try
{
ManagementObjectSearcher searcher =
new ManagementObjectSearcher("root\\CIMV2",
"SELECT * FROM Win32_Processor";);

foreach (ManagementObject queryObj in searcher.Get())
{
Console.WriteLine("-----------------------------------";);
Console.WriteLine("Win32_Processor instance";);
Console.WriteLine("-----------------------------------";);
Console.WriteLine("Architecture: {0}", queryObj["Architecture"]);
}
}
catch (ManagementException e)
{
MessageBox.Show("An error occurred while querying for WMI data: " + e.Message);
}
}
}

queryObj["Architecture"] ist hier allerdings ein ushort zwischen 0 und 9 und laut msdn hat diese folgende bedeutung:

(0x0) x86
(0x1) MIPS
2 (0x2) Alpha
3 (0x3) PowerPC
6 (0x6) Intel Itanium Processor Family (IPF)
9 (0x9) x64

Info: Bei mir hat diese methode korrekterweise 9 ausgegeben

EDIT: Wegen deinem Problem das es falsch angezeigt wird, überprüf mal was du bei den Projekteigenschaften bei release und im debug mode als zielplattform eingestellt hast. Habs jetzt nciht überprüft könnte aber damit zusammenhängen

21.12.2009 - 21:00 Uhr

Benutzerdefinierte Zahlenformatzeichenfolgen

Unterpunkt, Tausendertrennzeichen und Zahlenskalierung
3 sekunden googlen

06.12.2009 - 19:09 Uhr

Nein keine Desktopapplikation - ich schon das browserlayout der applikation nutzen. Mir geht es nur darum das mein Server Benutzer erstellen kann - denen Rechte geben, kategorien erstellen rechte auf kategorien vergeben usw.

Dies soll hierbei nicht ein administrator sondern mein server machen können und dafür brauche ich eine api

06.12.2009 - 15:18 Uhr

hi, sorry wegen kein antwort hatte die letzen tage nciht viel zeit.

Es wundert mich das es kein forum mit webservice administration gibt - werde mir aber mal yetanotherforum anschaun, eventuell kann ich da ja was einbaun oder deren administrator läuft mit webservices.

Danke für die antworten

03.12.2009 - 23:24 Uhr

Hallo Community,

imo beschäftige ich mich mit Sicherlight und den dazugehörigen Asynchronen WCF Services - hier laufen ja sämtliche calls Asyncron ab und für jede Methode gibt es eine callAsync Methode und ein CallCompleted Event - damit man nun die einzellen calls identifizeren kann gibt es ja den zusätzlichen UserState parameter. Meine frage ist jetzt - was soll man nach best practice hier einfügen? Stellt microsoft hier Identifier bereit die man verwenden kann oder soll man eine selbst generierte TaskId verwenden um die calls zu identifzieren?

03.12.2009 - 23:02 Uhr

Meine Frage ist - kennt jemand von euch eine Forum (bzw foren api) das man entweder selbst programmieren kann oder das über webservices angesprochen werden kann?

Gemeint ist das man über webservices z.B benutzer erstellen, rechte vergeben categorien erstellen usw kann. Muss nicht mal umbedingt eine .net technologie sein (wäre natürlich bevorzugt), hauptsache ist das man es programmatisch ansprechen kann, individuelles designing wäre natürlich auch toll.

19.11.2009 - 23:13 Uhr

Ich verstehe gerade nicht was du bei einer Datenbank mit der Objekt Referenz willst - diese dienen eigentlich nur als Identifizierer im Lokalen Speicher des Computers.

Ich weiß nicht ob du dich mit C++ auskennst - aber eine Referenz ist im endeffekt eigentlich nur ein Pointer auf eine Speicheradresse - also eine Adresse deines Arbeitsspeichers die angiebt wo das Objekt dort abgelegt ist. Bei einem 32 Bit Betriebssystem ist diese Speicheradresse 32 bit lang und man kann somit teoretisch bis zu 232 Speicherbereiche adressieren. Bei einem 64 bit betriebssystem ist diese adresse 64 bit lang und man kann somit bis zu 264 Speicheradressen adressieren.

Allerdings kann es dir bei C# egal sein ob deine Speicheradresse nun 32 oder 64 bit lang ist da das C# mit den Referenzen im Hintergrund managed. Die Speicheradresse des Objekts im Arbeitsspeicher hat allerdings nichts mit einer Datenbank oder der Festplatte zu tun - davon brauchst du beim anlegen einer Datenbank Tabelle dir keinerlei Gedanken machen.

Kann es sein Das du nicht die Referenz sondern den Speicherplatz meinst den deine Id belegt? Es ist nämlich auch so das jeder Speicherbereich bei einem 64 bit OS auch 64 bit groß ist. Somit wird bei einem 64 bit betriebsystem für einen 32 Bit Integer genauso ein 64 bit speicherbereich reserviert wie bei einem 64 bit Long.

Prozessortechnisch würde es auch keinen unterschied machen da da wir mitlerweile 64 bit Prozessoren haben die pro takt 64 bit verarbeiten

Die Frage ist nun - brauchst du wirklich einen 64 bit identifier? Ein 32-Bit Integer bietet immerhin bis zu 2,147 Millarden mögliche Ids. Der Duden hat gerade mal 150.000 Wörter.

Außerdem kann es ja sein das du eventuell das Programm auch auf 32 bit maschinen verwenden willst wesshalb dir dort ein 64 bit identifier nur nachteile bringt.

15.11.2009 - 23:04 Uhr

hab jetzt natürlich nicht alle tabellen genannt sonder nur 4 der wichtigsten und meisgenutzesten tabellen - weiterhin ist mir auch klar das es schon ne ganze weile dauern wird bis mal ne community von 40.000 usern aufgebaut ist - eine auslastung von1000 user anzupeilen ist wohl am relistischten.

Merke wegen den Abfragen - ich rede hier nur von einem bereich - wenn es wirklich mal 40.000 user werden gehe ich eher so von 100-120 mio operationen dieser art pro server und tag aus.

Danke für deine Antwort - Heißt ich werd wohl doch noch n paar SQL bücher wälzen dürften

15.11.2009 - 21:37 Uhr

Das mit dem Indizes setzen nicht möglich ok - das stimmt so nicht - blos bei manchen operationen bringen sie nicht viel

Bei dem ganzen projekt handelt es sich um ein Browserspiel - heißt die aktiven spieler werden sich so ca 1-3 mal pro tag einloggen,
aktive spieler düften ca. 20 % ausmachen der rest dürfte sich alle 2-3 tage und weniger einloggen

Anfangs wird die spielerzahl bei vieleicht 1000 liegen ein Server soll allerdings 10.000-40.000 Spieler beherbergen können. (Klingt größenwahn - bei Spielen
wie die-Staemme sind 40.000 ganz normal)

Achtung da Spieler ungeduldig sind sollte keine query über 500 ms kommen

Maschine: hab ich imo noch keine Ahnung - aber würde sagen für 10.000 Spieler sollte ein 2 kerner mit 4 gig ram leicht reichen

Tabelle Regiments:

Columns
<regiment_ID, bigint,>
<cordX, int,>
<cordY, int,>
<user_ID, int,>
<units, varbinary(max),> // ca 50 byte je datensatz

Indizes
auf regminent_ID

Datensätze - schätzung - je spieler durchschitt 15 - d.h bei 10000 Spielern 200.000 Datensätze (800.000 bei 40.000 usern)

Tabelle Provinces

<cordX, int,>
<cordY, int,>
<fieldType, tinyint,>
<objectID, int,>)

Indizes
auf Kombination aus cordX und cordY

Je Spieler ca. 40 - d.h bei 10000 Spielern 400.000 Datensätze (bei 40k 1,6 mio)

Tabelle ProvincesVisible

Columns
<user_ID, int,>
<cordX, int,>
<cordY, int,>

Indizes
auf Kombination aus user_id, cordX und cordY

ca. 1, 1 Mio bei 10.000 Spielern (40k dann 4,4 mio)

Tabelle Towns

<name, varchar(32),>
<cordX, int,>
<cordY, int,>
<user_ID, int,>
<buildings, varbinary(max),

Indizes
auf Kombination cordX, cordY

Datensätze 40.000

Die Beispiele sind jetzt noch nicht ausprogrammiert weshalb ich sie jetzt nur in logic code schreibe, weiterhin nenne ich hier auch nur 1-2 skripts.

Beispiel Query 1

Ca 144 Pro Spieler - (jeder spieler hat ca. 2 regimenter am laufen die sich alle 20 minuten bewegen) (gehe eher von 4 regimentern aus)
= 1.440.000 ausführungen pro tag bei 10.000 Spielern
(d.h bei 4 Regimentern und 40.000 Spielern 11,5 mio)

Beschreibung - Ein Regiment betritt eine neue Provinz - es muss überüft werden ob dadurch eine Neue Provinz sichtbar wird. Ein Regiment sieht alle provinzen im umkreis von 5 Provinzen - außerdem
ob sich in der provinz eine stadt oder ein regiment befindet und ob es zum kampf kommt

Gegeben 1 Regmient Id, regimentCordX, regimentCordY, regimentCordXOld ,regimentCordYOld user_ID, allianz_ID

Pseudocode:

var @regiment_id
var @allianz_ID
var @user_ID
var @regimentCordX
var @regimentCordY

output var @thereTown
ouptut var @thereRegiment

  1. SELECT cordX, cordY FROM Provinces WHERE cordX BETWEEN (@regimentCordX + 5) AND (@regimentCordX - 5);

Für jeden Datensatz:
Existiert datensatz in ProvincesVisible WHERE (user_ID = datensatz.user_ID) cordX = datensatz.cordX AND cordY = datensatz.cordY
Wenn nein füge Datensatz ein
3. Existiert datensatz in ProvincesVisible WHERE (user_ID = datensatz.allianz_ID) cordX = datensatz.cordX AND cordY = datensatz.cordY
Wenn nein füge Datensatz ein
4. UPDATE Regiments SET cordX = @regimentCordX, cordY = @regimentCordY WHERE regiment_ID = regiment_id
5. @thereRegiment = Existiert regiment in Regiments WHERE cordX = @regimentCordX, cordY = @regimentCordY
6. @thereTown = Existiert town in Towns WHERE cordX = @regimentCordX, cordY = @regimentCordY

Beispiel Query 2

Häufigkeit: Abfragen: 40.000 Pro Tag bei 10000 Spielern

Beschreibung: Fragt alle Handlespartner eines Spielers ab, dazu müssen erst alle Branches des Spielers abgefragt werden - jede branch ermöglicht so
das handeln mit allen spielern im umkreis von 50 enheiten, d.h @Xmin0, @Xmin0, @Ymax0, @Ymin0

  1. "SELECT * FROM branches WHERE user_ID = @user_ID"

Im beispiel werden 4 branches gefunden.

  1. Generiere Code:

SELECT user_ID FROM branches WHERE
(
((cordX BETWEEN @Xmax0 AND @Xmin0) AND (cordY BETWEEN @Ymax0 AND @Ymin0)) OR
((cordX BETWEEN @Xmax1 AND @Xmin1) AND (cordY BETWEEN @Ymax1 AND @Ymin1)) OR
((cordX BETWEEN @Xmax2 AND @Xmin2) AND (cordY BETWEEN @Ymax2 AND @Ymin2)) OR
((cordX BETWEEN @Xmax3 AND @Xmin3) AND (cordY BETWEEN @Ymax3 AND @Ymin3))
)

Komplexe Beispiele

  • wenn sich ein Spieler anmeldet müssen ersteinmal die provinzen für die startprovinz ermittelt und erstellt wird - auch zig sql zugriffe

  • Alle 20 Minuten werden die ressourcen jedes Spielers neu Errechnet werden - dazu müssen alle regimenter, städte uvm. ermittelt werden der aktuelle ressourcen stand abgefragt werden etc.

15.11.2009 - 16:20 Uhr

verwendetes Datenbanksystem: <Bisher und zum Testen SQL Server 2008 Express - später vieleicht Kostenpflichtige versionen>

Hallo Community,

Mein Problem ist dass meine Datenbank einige Tabellen hat die sich extrem hohen Anforderungen stellen müssen, da sie einerseits sehr viele Datensätze enthalten - andererseits sich auch sehr vielen sehr komplexen abfragen stellen müssen bei denen die komplette Tabelle durchsucht werden muss.
(D.h entsprechende Indizes setzen ist nicht möglich).

Hier: Datenbank in RAM laden?
habe ich gelesen man sollte:

Das Ganze in ein Dataset laden:
Hier bin ich dagegen da ich die erfahrung gemacht habe das ein DataSet nicht wirklich optimal den Speicher nutzt außerdem (wie bereits im Thread genannt) würde es ewig dauern bis die Daten im Ram sind und wenn die Tabellen größer als mein Ram werden habe ich ein problem - außerdem müsste ich alles selbst implementieren.

Für die Andere möglichkeit eine "embedded datase" zu nutze wäre ich durchaus offen allerdings würde ich doch sehr gerne bei SQL Server bleiben, da dieser relativ bekannt ist und ich mich in die
"embedded datase" auch erst einarbeiten müsste.

Jetzt habe ich in diversen Quellen gelesen dass man die SQL Datenbank in den Ram laden kann - wie sieht das genau bei SQL Server 2008 aus?

Außerdem - was würdet ihr mir zur optimierung der Abfragen raten - viel mit Stored Procederes arbeiten?

Mfg
dein.Tod

05.11.2009 - 17:18 Uhr

die version die du installiert hast - hast dort den Buildmodus auf debug gestetzt? Programme die Release gebuilded wurden können nämlich nicht debuggt werden.

26.08.2009 - 14:31 Uhr

Danke herbivore,

allerdings habe ich das ganze jetzt doch über eine geerbte Dummyklasse gelößt, das Problem das du ansprichst und ich wegen meiner geerbten Klasse auch hatte dass sich das Readonly nicht durchschlägt weil das PropertyGrid die Klassenassemblyinfos 'cashed', kann aber über das Attribut System.ComponentModel.RefreshProperties gelößt werden.

26.08.2009 - 09:47 Uhr

Hallo Community,

ich versuche gerade den PropertyGrid Knoten Identitätsspezifikation im SQL Management Studio 2008
nachzubauen.

Ich will das wie im Beispiel standardgemäß alle Felder des Identity Objekts readonly sind und sobalt man Ist Identity auf True gesetzt wird werden die entsprechenden Felder aktiviert.

Ich habe es bisher nur noch nicht geschafft das dies auch funktioniert - zuerst habe ich versucht das ganze über ein Geerbtes Dummy Objekt zu lösen, bei dem alle Properties ReadOnly sind. Hat aber Probleme mit dem Typ gegeben. Jetzt wollte ich ExpandableObjectConverter entsprechend überschreiben, allerdings bin ich hier auch nicht weitergekommen - hat von euch jemand eine Idee wie man das lösen kann? Weil ich denke das Microsoft hier kein Normales PropertyGrid verwendet.

Mit freundlichen Grüßen
euer Tod

24.08.2009 - 20:51 Uhr

Ich wollte jetzt zum ersten mal mehr mit WCF und Asp.net Webservices befassen bin aber etwas abgeschreckt von der gewaltigen Initialisierungszeit.

Ich will einen Webservice erstellen von den meine Client-Applikationen die Liste der aktuell aktiven Server abrufen können - dies wird nur beim start des Clients benötigt und die entsprechenden Serverinformationen müssen auch nur einmal abgefragt werden.
Auf den Webservice kann jeder User zugreifen, es ist keine Domänenautentifizierung, Verschlüsselung oder sonst irgentwelche zusätze erforderlich
Das ganze wollte ich zuerst mit WCF und dann mit einem Asp.net Webservice lösen.

Zum ausprobieren habe ich jeweils ein Projekt mit WCF und Asp.net Webservices erstellt. Und bei jedem ein paar Methoden hinzugefügt und nichts an der Konfiguration geändert.

Was mich hier jetzt so stört, schon über LOCALHOST braucht WCF ca 4 sekunden für den ersten Funktionsaufruf und Asp.net Webservices ca 350 ms um das Webverweis Objekt zu initialisieren und dann nochmal 1200 ms für den ersten Funktionsaufruf. (alle weiteren Funktionsaufrufe liegen bei ASP.net bei akzeptablen 13-30 ms, WCF ähnlich).

Kann mit jemand tipps geben wie WCF und Webservices zu konfigurieren sind (besser eine bespielapplikation) die auf ca. 100km (beliebige Datenmenge) unter 400 ms (inkusive initialisierung) erreichen kann?

Oder nutze ich für einen Einmaligen Aufruf die falsche Technologie? (Den aufwand eines TCP oder UDP Servers möchte ich mir hier nicht machen)

08.08.2009 - 22:50 Uhr

Die idee mit den Timern is irgnetwie cool, aber glaube nicht ganz so performant und so leicht anwendbar, wenn z.B innerhalb der letzten 15 minuten ein event gelöscht werden soll.

Datenbank-Events? Nein nichts Datenbank technisches:

Hoffe hiermit kann ich mich endlich mal klar ausdrücken:
Wir haben eine Datenbank-Tabelle die Rows dieser Datenbanktabelle haben eine ID und ein Datetime. Bei der eintragung einer dieser Rows kann die differenz zwischen dem Datetime der Row und Datetime.Now mehrere Wochen betragen.

Dann haben wir noch ein Programm das wenn ein Datetime == Datetime.Now (auf die Milisekunde genau) irgentetwas tun soll, z.B zwei integer addieren, irgent etwas in eine andere Datenbanktabelle schreiben oder eine EMail versenden, aber es soll NICHT irgent ein anderes Programm starten oder Beenden.

08.08.2009 - 17:17 Uhr

winSharp93: Werde mir deine Vorschläge nochmal durch den Kopf gehen lassen - denke aber ich werde bei Events bleiben.

Florian Reischl: SortedDictionary ist in sofern problematisch da es einen uniquen Key benötigt - was aber bei einer Datetime nicht gewährleistet ist bin grad noch auf der suche nach der passenden Klasse.

08.08.2009 - 16:03 Uhr

winSharp: Die idee ist nicht schlecht, nur würde das ganze die sache verkomplizieren und ich müsste bei jeder abfrage der Gebäude überprüfen ob dieses schon gebaut wurde.
Außerdem würde ich Probleme kriegen, z.B bekommt der User in einem bestimmten Interval Ressourcen gutgeschrieben, hier hätte dein System ein Problem

Florian Reischl: Danke für die Antwort so werde ichs machen, die Klasse sorted Dictonary kannte ich noch nicht.

08.08.2009 - 14:46 Uhr

Danke Scheduler ist ein Keyword das mir weiterhilft...

Aber ich glaube ich habe mich etwas falsch ausgedrückt - diese events haben nichts mit dem Betreibssystem und Programmstarts zu tun.

Bei dem ganzen Projekt handelt es sich nämlich um eine Art Browserspiel wo es z.B 2 Wochen dauert bis ein Gebäude errichtet wurde. Wenn ein User jetzt ein Gebäude in Auftrag gibt wird ein event in die datenbank eingetragen und 2 Wochen später wird dieses dann abgerufen und das Gebäude wird erstellt.

Außerdem wäre der Windows Zeitplandienst bei über 100 Events je user doch etwas
unterdimensioniert.

08.08.2009 - 01:15 Uhr

verwendetes Datenbanksystem: <SQL Server 2008 Express>

Guten Abend geschätzte Community,

Ich will gerade ein Eventsystem umsetzen, habe zwar schon einen Ansatz wie ich das tun könnte, allerdings wollte allerdings vorher fragen wie man das normalerweise soetwas realisiert bevor ich das rad ein 1000. mal neu erfinde, und die ganze sache komplizierter mache als sie wirklich ist

Eventsystem - was soll das sein? Ich habe eine Tabelle Events jedes Event besteht aus einer ID einer DateTime und einem XML Content. Die Datetime wird beim erstellen des Events gesetzt und gibt an wann das Event eintritt, die Zeitspanne bis zum Eintritt kann durchaus mehrere Wochen betragen, allerdings sollte das Event (teoretisch) auf die Milisekunde genau verarbeitet werden. (Info: Kulanz von 2-5 ms)

Diese Tabelle kann durchaus eine sehr große Zahl an Ereignissen haben also sollte man doch sparsam mit den Abfragen umgehen.


Meine Idee war nun das mein programm alle 15 minuten überprüft welche events in weniger als 14 minuten eintreten, diese events werden dann in mein Programm geladen, welches dann alle geladenen events erst alle 30 sekunden prüft ob die events in weniger als 30 sekunden bis zum eintritt brauchen, dann alle events die in weniger als einer sekunde eintreten und schluss endlich die liste der programme die in weniger als einer sekunde eintreten jede ms überprüft.

Allerdings hat dass wenn ich nach 15 minuten alle Felder lese die weniger als 14 minuten brauchen es durchaus sein kann dass ein Entry doppelt geladen wird, welhalb ich nachdem ich alle Einträge der Tabelle geladen habe die einträge die weniger als 15 minuten bis zum eintritt benötigen, mit allen bereits geladenen einträgen vergleichen muss, ob es duplikate gibt. (Ich lösche die einträge in der DB ja erst wenn das Event eingetreten ist)

Habt ihr so etwas schon einmal realsiert wenn ja wie, bzw habt ihr eine bessere Lösung?

Mit freundlichen Grüßen
dein.Tod

05.08.2009 - 21:51 Uhr

Hallo sehr geschätzte Community,

ich bin gestern auf ClickOnce gestoßen und fand die Technologie ungeheuer interessant -
haupsächlich wegen der update Funktion und der einfachen Installation auf Heimcomputern.
Allerdings hätte ich noch ein paar fragen die ich bisher durch googlen und einmal selbst ausprobieren nicht selbst beantworten konnte.

  1. Browser - Ich habe in diversen quellen gelesen dass ClickOnce bisher nur IE und Firefox unterstützt - in einer anderen Quelle das man für Firefox ein PlugIn bräuchte. Da eine Installation mit meinem Firefox 3.5.2 (andscheinend) keine probleme gemacht hat, wollte ich fragen wie es mitlerweile mit Opera und Google Crome bzw vieleicht sogar Safari aussieht? Weil für einen Heimnutzer wäre es ein k.o Lriterium wenn die installation mit SEINEM Lieblingsbrowser nicht starten würde.

  2. Dateien verschieben - Nun kann es ja mal vorkommen das ein Kollege in der Firma sagt - kannst du mir das Programm nicht mal rüberschieben - oder es wird auf eine andere Partition verschoben - bzw. in den Programmeordner? Das in diesem fall die deinstallation des Programms nicht mehr möglich ist ist mir klar - aber kann danach das Programm weiterhin upgedatet werden? (Manifest ist ja weiterhin vorhanden) - bzw gibt es hierfür implementierungen?

  3. Server Installation - Ich habe in einigen Quellen gelesen das es Probleme bei Konfiguration durch bestimmte Rechtevergaben geben kann - in wie weit könnt ihr das bestätigen?

  4. Einschränkung Funktionen - Rechtetechnisch gibt es ja eine zuätzliche einschränkung durch die CLR der ANWENDUNG (nicht dem Installer) - welche Namespaces sind hierdurch betroffen bzw was sind die wichtigsten einschränkungen, neben zugriff auf dateisystem (Vieleicht zugriffsverweigerung der Anwendung auf Registry?, Zugriffsverweigerung WMI? DLL registrierung? Autostart?)

Kann jemand alternativen für Automatischen Update nennen - habe jetzt was von DDay.Update gelesen - hat damit jemand Erfahrung?

Über antworten freut sich
dein.Tod

30.07.2009 - 22:57 Uhr

Ich glaube zwar das es dass was ich will so nicht gibt aber wollte trotzdem mal nachfragen:

Hintergrund ist der das ich eine Client-Server Applikation erstellt habe - nun ist es so das es auf Clientseite mehrere Programme auf einem Rechner habe die mit dem Server kommunizieren - wesshalb ich mir überlegt habe das ich eventuell auf dem Client einen Dienst erstelle der alle bezogenen Daten managed so das vorhandene Daten nicht doppelt abgefragt werden müssen.

Jetzt wäre meine Frage ob etwas wie IPC nicht einfacher geht als jetzt die Daten per WCF über localhost zwischen den Anwendungen zu versenden, oder ob es dafür spezielle APIs gibt oder dergleichen.

Mit freundlichen Grüßen
dein.Tod

25.07.2009 - 14:36 Uhr

40 % auslastung bei vista normal - habe auch vista64 mit 4 gig ram. Ist aber auch nur eine Konfigurationssache - z.B läd vista standardgemäß bei jedem start die am häuftigsen benutzten programme in den speicher, damit diese schneller starten. (Edit: habe nicht gesehen das das mit dem cashen schon oben steht)

Solche sachen lassen sich zwar abschalten, aber wozu - reichen dir für den betrieb keine 2,4 gb ram?

17.07.2009 - 21:32 Uhr

naja z.B das Programm Hamachi erstellt ja einen Virtuellen Netzwerkanschluss also müsste es teoretisch ja möglich sein Daten an diesen anschluss zu senden und dieser anschluss sendet die antwort dann mit einer gewissen verzögerung zurück.