Da hast du Recht. Das hatte ich gelesen, der User ist aber Authentifiziert. Der Zugriff funzt ja auch, wenn ich den Directory String in der App hinterlege. Würde es an der Auth liegen dann würde das ja auch schon nicht klappen.
Das Prob. tritt immer auf, egal ob Service oder App.
danke für den Tipp, war vielleicht ein Missverständnis, aber bin extra im DB Forum, da das Problem nur auftritt, wenn ich den UNC Pfad aus der DB auslese. Gebe ich ihn über eine Textbox durch den User an funktioniert es.
Ich glaub ich dreh mich im Kreis
Da wird man ja noch ganz konfus. X(
ich hab folgendes Problem. Ich hab in einer DB eine Config Tabelle. Dort liegen verschiedene Pfad drin (UNC und absolut).
Z.B.: \\fileserver\freigabe
Lese ich diese Spalte aus und weise sie einer String variablen zu:
string strPath1 = drRow["column"].ToString();
dann speichert er mir in der Variable folgenden Wert: \\\\fileserver\\freigabe
Ich hab schon alle mir bekannte versucht, dazu zählen replace, @ vor die variable und/oder vor drRow aber es hat nix geholfen.
Könnt ihr mir auf die Sprünge helfen wie ich den Wert des Pfades korrekt aus der DB lesen kann? Ich brauche ihn für die die Directory und File Operationen.
jetzt wirds vollkommen abstrus. Hab das mit dem RemoteDebugger hinbekommen. Ziemlich cool das Feature, nur leider in meinem speziellen Fall nicht zu verwenden, da ich mich ja nur an bereits laufende Prozesse connecten kann. Der Dienst startet jedoch garnicht erst.
Dafür bekomm ich jetzt endlich eine Fehlermeldung ins EventLog eingetragen:
Das spannende ist auch hier: Der Service funzt einwandfrei auf den Dev Maschinen, auf allen anderen nicht. In google war was gestanden von wegen korrupter .net Framework Installation, aber die kann ja nicht auf allen Maschinen korrupt sein, dass wäre schon zu viel des guten
Was ich halt komisch finde ist, dass der Fehler auch auftritt wenn ich in der Start Methode des Services alles auskommentiere und auch alle Objektinitialisierer auskommentiere.
Hast du noch eine Idee? System.TypeInitialization klingt für mich gefährlich nach einem vergessenen ExceptionHandler, aber das kann ich ausschließen, zumindest was meine eigenen dlls angeht
Ja das dachte ich eigentlich auch, dass der Dienst abstürzen müsste und ich eine .net Fehlermeldung im Ereignisprotokoll haben müsste.
Ich hab VS 2008 Prof und .net 3.5. Windows 2003 x64 ist das ServerOS wo der Dienst laufen soll.
Die Sache mit dem Remotedebugger wäre meine nächste Frage gewesen. Wie kann ich einen Dienst debuggen. Hab da bisher nix gefunden. Werd mal nach Remotedebugger suchen. Wenn du da ein paar Tipps hättest wäre ich dir dankbar.
gute Idee. Hab glaub ich auch den Fehler gefunden, weiß aber nicht wie ich ihn rausbekomme. Wenn ich mir die Projekteigenschaften anzeigen lasse, unter dem Punkt "Veröffentlichen" und "Anwendungsdateien" dort werden mir Dateien angezeigt die er auch in den Release und Debug Ordner legt, die aber nirgends im Projekt verwendet werden. Hab da z.B. eine EMailConnector.dll drin, die verwende ich aber in einem ganz anderen Projekt und nicht in diesem Service. Die enthält nämlich ein Windows Form und Crystal Reports. Und da auf dem Server Crystal nicht installiert ist kommt der Fehler.
Was ich nicht verstehe ist, dass in den Verweisen und Projektabhängigkeiten das EMailConnector Projekt gar nicht drin ist. Ich weiß nicht woher er sich das noch zieht.
Hoffe du hast noch eine Idee wie ich das rausbekomme bzw. entfernen kann.
ich habe folgendes Problem: Ich hab einen Services programmiert inklusive Installer.
Installiere ich den Service auf einer Entwicklungsmachine funktioniert er einwandfrei, auf jedem anderen Rechner aber nicht.
Der Service lässt sich aber sehr wohl installieren, taucht auch im Dienste Manager von Windows auf, aber wenn ich den Dienst starte kommt die Meldung, dass der Dienst nicht rechtzeitig auf die Anweisung reagiert hat und er startet auch nicht. Im Eventprotokoll steht der selbe Fehler (EventID 7000) + ein weiterer: Der Dienst hat nicht innerhalb des Zeitlimits(30000) auf den Verbindungsversuch geantwortet (EventID 7009)
Ich habe jetzt schonmal so ziemlich alles auskommentiert was als Code drin ist und es geht immer noch nicht.
Mir scheint, als ob irgend eine dll fehlt, aber die gefundenen Abhängigkeiten im VS Setup Projekt sind OK.
Habt ihr noch eine Idee wie ich herausbekommen kann was das Prob ist?
Grüße
Ben
Als Anmerkung mal hier mein Code für den Dienst:
public CLEOServerService()
{
InitializeComponent();
//if (!EventLog.SourceExists(ServerConfig.EventLogSourceName))
// EventLog.CreateEventSource(ServerConfig.EventLogSourceName, ServerConfig.EventLogName);
}
protected override void OnStart(string[] args)
{
// Start the networking thread
//ServerConfig.NetworkThreadState = TypeDef.ThreadState.RUNNING;
//tCleoNetworking = new Thread(new ThreadStart(tnsNetworking.Start));
//tCleoNetworking.Start();
EventLogManager.WriteEvent("Server service: CLEO Server is running",
EventLogEntryType.Information, EventLogManager.EventMainGroups.CLEOSERVER_SERVICE);
//EventLog.WriteEntry(ServerConfig.EventLogSourceName, "Server service: CLEO Server is running", EventLogEntryType.Information, 0);
// Start the hygrometer monitoring thread
//ServerConfig.HygroMeterThreadState = TypeDef.ThreadState.RUNNING;
//tCleoHygroLogging = new Thread(new ThreadStart(hsmHygroMonitoring.Start));
//tCleoHygroLogging.Start();
}
protected override void OnStop()
{
//ServerConfig.NetworkThreadState = TypeDef.ThreadState.STOPPED;
//tnsNetworking.Stop();
//ServerConfig.HygroMeterThreadState = TypeDef.ThreadState.STOPPED;
//hsmHygroMonitoring.Stop();
//tCleoNetworking.Abort();
//tCleoHygroLogging.Abort();
}
anbei die zwei Screenies. Aussehen soll es so wie auf dem Screeni "mit Fokus". Bei dem zweiten Screenie hab ich die oberen Punkte des Strings (SmartLabel) markiert. Damit du siehst, dass es gezeichnet wird, aber der TextBox Part der ComboBox aus irgendeinem Grund drüber gemalt wird.
Hier noch mein Code. Ist nur der, der Hauptklasse, das Model und die BusinessLogic machen nix besonderes. Nur Properties und eine MeassureString Methode sind da drin. Haben aber nix mit dem Zeichnen zu tun.
Hab jetzt mal ein bisschen rumgespielt und herausgefunden woran es liegt, aber ich weiß leider keine Lösung.
Der String wird tatsächlich korrekt gezeichnet. Obwohl man ihn nicht sieht. Das Problem ist, dass die ComboBox ja noch mal eine untergeordnete Clientarea hat, welche das eigentliche Textfeld repräsentiert. Und die wird leider über mein String drüber gezeichnet.
Wisst ihr wie ich das abfangen kann? Oder wie ich diesen Teil selbst zeichnen kann?
Das selbe Problem tritt übrigens auf, wenn man von ComboBox ableitet und die Paint Methode überschreibt und UserPaint auf true setzt. dann zeichnet er den TextBox Bereich immer schwarz. Wenn jemand dafür eine Lösung kennt, dann kann ich es ja auch mit dem Überschreiben des Paint Events machen.
bin mir jetzt nicht sicher, aber hast du es mal als Bild versucht? Also den Text auf ein Image zeichnen und dann das Image krümmen. Das müsste eigentlich funktionieren.
jetzt ist doch noch ein Problem aufgetaucht, dem ich nicht ganz Herr werde.
Das SmartLabel wird zwar wunderbar gezeichnet, aber sobald sich der Wert der Text Property der ComboBox von gefüllt auf leer ändert wird das SmartLabel nicht mehr angezeigt oder ich die Property ShowSmartLabel von true auf false setze, dann bleibt das SmartLabel stehen, obwohl es nicht mehr gezeichnet werden sollte.
Edit:
Ich konnte das Problem jetzt dahingehend eingrenzen, dass das SmartLabel, also der DrawString nie gezeichnet wird, sobald das Control den Fokus verliert. Erhält das Control den Fokus dann wieder, wird es aber trotzdem nicht gezeichnet. Er zeichnet es also immer nur dann, wenn ich ein Propty im Control verändere, sobald der Fokus dann das Control verlässt wird der String nicht mehr gezeichnet, oder überzeichnet. Ich habe jetzt auch andere Windows Messages noch mit abgefangen, was aber am Resultat nichts ändert. Folgende Messages fange ich noch ab:
private static int WM_NCPAINT = 0x0085, // int = 133
WM_ERASEBKGND = 0x0014, // int = 20
WM_PAINT = 0x000F, // int = 15
WM_MOVE = 0x0003, // int = 3
WM_WINDOWPOSCHANGING = 0x0046, // int = 70
WM_SIZE = 0x0005, // int = 5
WM_SETFONT = 0x0030, // int = 30
WM_MOUSEMOVE = 0x0200, // int = 512
WM_MOUSELEAVE = 0x02A3, // int = 675
WM_SETFOCUS = 0x0007, // int = 7
WM_KILLFOCUS = 0x0008; // int = 8
OnPaint habe ich zuerst verwendet, da aber das Problem, dass er mir im TextBox Teil der ComboBox immer ein schwarzen Hintergrund gezeichnet hat.
Ich muss ja, wenn ich OnPaint überschreibe UserPaint auf true setzen, dann kommt aber eben der Fehler. Das scheint wohl etwas mit der Clientarea der ComboBox zu tun zu haben, ich habe aber nicht rausbekommen, wie ich diesen Bereich errechnen kann um ihn selbst zu zeichnen.
Habe das mit dem Else probiert. Jetzt hab ich folgenden Fehler: Damit das SmartLabel gezeichnet wird, habe ich ja eine Property
public Color SmarLabelForeColor
{
get{return clSmartLabelForeColor;}
set{clSmartLabelForeColor = value; Invalidate();}
}
welche die Farbe des SmartLabel bestimmt. Der Witz ist der, dass wenn ich die Eigenschaft ShowSmartLabel der Komponente ändere wird das SmartLabel nicht gezeichnet, obwohl Invalidate() aufgerufen wird. Ändere ich aber die ColorEigenschaft, dann zeichnet er sie plötzlich. Muss ich da eine spezielle Windows Message schicken?
Grüße
Edit: Hab den Fehler gefunden. Danke herbivore, hast mich auf die Idee gebracht. das True beim Invalidate war ein Problem.
ich habe eine ComboBox geschrieben, welche von Windows.Forms.ComboBox erbt. Eigentlich ist es eine orginale ComboBox mit ein paar zusätzlichen Coloreigenschaften.
Damit das Zeichnen richtig funktioniert habe ich die WndProc Funktion überschrieben. Das funzt auch alles soweit. Das Problem ist, das der String den ich Zeichen lasse (SmartLabel) kurz aufflackert, dann aber sofort wieder verschwindet. Also überzeichnet wird, durch irgendetwas.
Reagiere ich auf zuwenige Windows Messages? Woran kann das sonst noch liegen? Hoffe ihr habt eine Idee.
Hier meine WndProc:
ich habe in meinem Formular einen Crystal Report Viewer, der mir einen Crystal Report anzeigt den ich vorher mit einem DataSet fülle. Das funzt auch super.
Jetzt will ich das Teil ausdrucken. Der eingebaute PrintButton im CrystalViewer ist aber nicht zu gebrauchen. Da ich ja mit der Funktion
PrintToPrinter
den Report auch selbst drucken kann hab ich also einen eigenen Drucken Button gemacht der in das Design der Anwendung passt. Dieser Button ruft einen
System.Windows.Forms.PrintDialog
auf. Das Problem ist, dass sämtliche enums die der
was ja imho auch Sinn macht. Aber PaperSize z.B. lässt sich mit einem simplen
Enum.Parse
leider nicht konvertieren, da es bei Windows.Forms.PrintDialog heißt:
PaperSize.A4;
und bei Crystal:
PaperSize.PaperA4;
Gibts da irgendeine Möglichkeit außer alles von Hand zu konvertieren? Z.B. das ich den Crystal PrintDialog aufrufe von meinem Button aus anstatt den Windows.Forms.PrintDialog?
ich habe einen Windows Service geschrieben, der als Server für meine Client Applikation fungieren soll und einige Funktionen via Netzwerk zur Verfügung stellt.
Dazu starte ich beim starten des Dienstes einen neuen thread in dem der Netzwerkmanager läuft. dieser wartet in einer
while(true)
{
}
Schleife auf neue Verbindung. Kommt eine neue Verbindungsanfrage rein wird diese in einem neuen Thread gestartet und dort bearbeitet.
Mein Problem ist, dass ich bei dieser Technik immer caö 50% CPU Auslastung habe. Sobald ich den Netzwerkpart deaktiviere geht die CPU Auslastung des Dienstes auf 0 % runter. Die anderen Services die der Dienst bereitstellt ziehen also kaum CPU Last.
Ich finde die while(true) Geschichte eh nich sonderlich prickelnd habe aber leider keine andere Lösung gefunden. Ist das überhaupt das Problem? Gibts hierfür etwas eleganteres? Wie macht ihr das mit dem warten auf Netzwerkanfragen?
also ich habe einen Dienst geschrieben und dazu ein Setup Projekt der das Teil installiert. Wunderbar klappt auch alles, aber wie bekomm ich den Dienst gestartet? Ich wil ein Reboot vermeiden.
Ich vermute mal dass es über das PostBuild Event im Setup Projekt funzt, aber wie ich das verstanden habe führt das event nur batches aus via call C:\mybat.bat
Ich will aber eigentlich keine batch mitliefern. Geht das nicht noch anders? zu dem PostBuildEvent steht im MSDN leider nicht wirklich tolles.
logisch. Argh. Danke für den Schups von der Leitung. Der Beispiel code ist nicht wirklich echt. Im echten Code wird keine MessageBox angezeigt, sondern eine XML Datei per URL importiert.
Aber ist ja klar, dass das nicht laufen kann. Da der Timer in einem Windows Service laufen soll ist es denke ich mal eh besser den Thread timer zu verwenden. Hab den zwar noch nie benutzt aber das MSDN Beispiel ist nicht wirklich schwierig.
danke für den Hinweis. Bin grad dabei mich im MSDN über Thread Timer schlau zu machen.
Kannst du mir verraten, warum beim Zuweisen des Tick Events ich new EvenHandler nutzen muss? Bisher habe ich die Events immer so zugewiesen:
Hi, ich hoffe ihr könnt mir helfen.
Mein Problem: Ich starte einen Thread, der wiederum einen Windows.Forms.Timer erstellt, dessen Tick Event eine Methode zuweist und den Timer startet.
Ist nur heißer Beispielcode aber so macht es auch mein Service in dem der Code steckt.
Das Problem ist: die Methode: ttmp_tick wird niemals aufgerufen.
Ich vermute mal, dass es daran liegt, dass der Timer einen eigenen Thread aufmacht oder liege ich da falsch? Nur wie kann ich das beheben?
danke für die schnelle Antwort. Genau das wollte ich eigentlich vermeiden. Ich dachte es gibt eine Möglichkeit anhand eines Dictionaries z.b. wo zu jedem enum, den ich habe der Modul Typ drin steht, ich auch casten kann.
Also z.B.:
ich habe folgendes Problem:
Ich habe ein Panel, welches verschiedene Controls (Module) enthält. Diese heißen z.B.:
_ucMyControl
_ucNochEinControl
Diese Controls sind abgeleitet von UserControl. Ich erstelle die Controls zur Laufzeit (sind quasi die Module meiner Hauptanwendung, so als eine art MDI).
Außerdem habe ich einen enum Typ in meiner Hauptanwendung die mir die Module auflistet.
Soweit wunderbar, aber jetzt muss ich ein Panel (mein Hauptpanel, welches alle geöffneten Module beinhaltet) durchgehen und auf eine Property meiner geöffneten Module zugreifen. Welches Modul geöffnet ist habe ich in einer generischen List gespeichert die mit meinem Modul enum gefüllt ist.
Nur wie bekomme ich anhand meines Enums eine Zuordnung zu dem Modul Controls?
Ich kann zwar mit:
foreach (Control ctrl in ModHost.Controls)
{
}
Alle Controls durchgehen, aber ich muss ja ein irgendwie eine Referenz auf mein _ucMyControl bekommen. Und ich möchte eigentlich nicht eine rießen große Switch oder If Abfrage mit TypeOf machen. Geht das nicht auch irgendwie anders?
ich habe eine kleine Frage:
Ich habe meine UI bei der ich ganz normal im Form Code die Steuerelemente setzen kann.
Dann habe ich eine Klasse BusinessLogic, die im Form Code über:
BusinessLogic ooBLogic = new BusinessLogic();
referenziert ist. Somit kann ich die Klasse nutzen.
Die BusinessLogic hat eine Methode
SendMail()
diese MEthode startet einen neuen Thread, welcher Mails sendet. Soweit funzt alles.
Der Thread, welcher die Mails hat ein selbstgebautes Event, welches nach jeder gesendeten Mail versendet wird. Funzt auch. Die BusinessLogic verbindet sich an dieses Event und schmeißt wiederum ein eigenes Event. An dieses Event ist die UI Klasse connected. Das Event kommt auch direkt im UI Code an.
Der Code der ausgeführt wird setzt die Text Eigenschaft von einem Label. Und hier ist das Problem, der Debugger sagt mir dass hier ein Steuerelement von einem falschen Thread heraus geändert wird. Warum? Die Methode die das Steuerelement ändert liegt doch in der UI Klasse.
private event EventHandler<SendMailEventArgs> _oSending;
#region Event SendMail
/// <summary>
/// Executes the sendmail event
/// </summary>
/// <param name="e">An instance of the eventargs class which includes the event handler.</param>
protected virtual void OnSending(SendMailEventArgs e)
{
if (_oSending != null)
_oSending(this, e);
}
/// <summary>
/// Is executed if sendmail is sending
/// </summary>
public event EventHandler<SendMailEventArgs> Sending
{
add { _oSending += value; }
remove { _oSending -= value; }
}
#endregion
public void SendMailWrapper(string strBodyHTML, string strBodyText, string strFrom, string strFromDisplayName,
string strReturnAddress, string strSMTPServerIP, string strSMTPServerPW, string strSMTPServerUser,
string strSubject, string strTo, string[,] strarrAttachments, string strTableName,
string strDBEMailField, string[] strarrFields, string strDBSelCondSQL, string strDBUpdCondSQL,
string strDBUpdFieldsSQL)
{
tSendMail = new Thread(new ThreadStart(ooSendMailThread.Start));
ooSendMailThread.Sending += Sending_Event;
tSendMail.Start();
}
SendMailThread:
#region Event SendMail
private event EventHandler<SendMailEventArgs> _oSending;
/// <summary>
/// Executes the sendmail event
/// </summary>
/// <param name="e">An instance of the eventargs class which includes the event handler.</param>
protected virtual void OnSending(SendMailEventArgs e)
{
if (_oSending != null)
_oSending(this, e);
}
/// <summary>
/// Is executed if sendmail is sending
/// </summary>
public event EventHandler<SendMailEventArgs> Sending
{
add { _oSending += value; }
remove { _oSending -= value; }
}
#endregion
public void Start()
{
ooMail.SendHTMLMail();
OnSending(new SendMailEventArgs(ooMail.To, 1));
}
Ich bin mit Invokes soweit eigentlich vertraut. Aber die kann ich hier nach nicht verwenden, das der Invoke ja immer innerhalb einer Form klasse aufgerufen werden muss.
hängt meine Fehlermeldung dann damit zusammen? Er kann die dll laden, aber bringt immer den Fehler, dass er den dll Einsprungpunkt der Funktion nicht finden kann.
Oder muss ich den Standardkonstruktor abändern, damit der Fehler nicht kommt?
Müsste es nicht ausreichen, wenn das .net Framework auf dem Rechner drauf ist?
habe eine allgemeine Frage. Ich habe eine Form und kompiliere diese als dll.
diese dll kann ich doch aus jeder anderen Programmiersprache, die dll's laden kann ansprechen.
Also konkret: Ich möchte die Form aus einer Access 97 Anwendung heraus öffnen. Access 97 verwendet ja VBA. In VBA kann ich externe dll's verwenden, damit müsste ich doch auch dann meine Form aus meiner dll laden können oder?