Application.Restart   otázka

VB.NET

Zdravím všechny,

měl bych dotaz k Application.Restart()

Mám uložena některá uživatelská nastavení v My.Settings, jedná se konkrétně o název serveru a databáze pro connectionstring. Problém je v tom, když edituji data, uložím je My.Settings.Save() a poté chci aplikaci restartovat výše uvedeným příkazem, použijí se data, která zadána v my.settings dříve. Pokud ale na aplikaci použiji příkaz Application.Exit() a znovu aplikaci spustím ručně, je nastavení v pořádku. Nevíte, co dělám špatně?

Díky M.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jako první bych zkusil zapnout Save My.Settings on Shutdown ve vlastnostech projektu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To mě taky napadlo, bohužel stále stejný problém

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak bych zkusil experimentálně vytvořit novou testovací Windows Forms aplikaci a zkusil jestli to v ní bude dělat taky.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Urobil som testovaciu aplikáciu v C# 2010 a robí to rovnaký problém.Ak spustím Settings.Default.Save() a potom Application.Exit() a aplikáciu znovu spustím, pamätá si hodnotu textboxu nabindovanú na application settings.Ak nedám Settings.Default.Save() alebo aplikáciu reštartujem pomocou Application.Restart(), načíta počiatočnú hodnotu tak, ako je nastavená v projekte.

Link na stiahnutie testovacej aplikácie:

http://stanoweb.aspone.cz/TestAppWinForm...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zkoušel jsem udělat novou testovací aplikaci v C# 2008 a funguje to bez problémů. Uložit novou hodnotu do vlastnosti nastavení, zavolat Save a po opětovném spuštění aplikace načíst hodnotu z vlastnosti - načetla se nová (ne výchozí) hodnota.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak tomuto vážne nerozumiem. Žeby bol nejaký zásadný rozdiel medzi .net 3.5(?) a .net 4?

Skúšal ste sa pozrieť na moju testovaciu aplikáciu?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jenom na zdrojáky, nepoužívám VS2010. Co tam proboha dělá ta zrůdnost global::TestAppWinForms.Properties.Settings.Default.TEXTFIELD?? To jste okopíroval z VS-generovaných zdrojáků? Používejte jenom Properties.Settings.Default.TEXTFIELD. Dále se mi tam nezdá ten data binding, zkuste to bez něj. Obecně nepoužívejte data binding pro ukládání konfiguračních hodnot, z vlastních zkušeností vím, že se to často sere.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Áno, to Properties. ma nenapadlo, tak som použil presne to, čo spomínate. V c# som totiž začal robiť len nedávno, keď som začal robiť v XNA a zjavne v tom nie som dobrý.Ostatne ani vo VB.NET som nebol dobrý.

Ešte to skúsim prerobiť bez data-bindingu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Takže z Form1.Designer.cs som odstranil riadok s pridaním data-bindingu a taktiež riadok s textBox1.Text = .

Form1.cs som upravil takto:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace TestAppWinForms
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            textBox1.Text = "Application shuttted down.";
            MessageBox.Show("Property value set.Application will now exit.Start it again.");
            Application.Exit();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            textBox1.Text = "Application restarted.";
            MessageBox.Show("Property value set.Application will now restart.");
            Application.Restart();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            textBox1.Text = Properties.Settings.Default.TEXTFIELD;
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            Properties.Settings.Default.TEXTFIELD = textBox1.Text;

            Properties.Settings.Default.Save();//bez tohto riadku nefunguje nič.
        }
    }
}

Vďaka manuálnemu uloženiu funguje možnosť 1 - Application.Shutdown() a manuálny štart.Avšak Application.Restart() opäť spôsobuje načítanie defaultnej hodnoty.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

NIKDY ručně neupravujte soubory vytvořené Visual Studiem (*.Designer.vb, *.Designer.cs).

Už se mi to nechce řešit, ale zřejmě při Application.Restart nenastane událost FormClosing a tím pádem se nastavení neuloží.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Nechcelo sa mi mazať data-binding ručne. To už je jedno, hlavná vec, že som prišiel tej záhade na koreň(resp. ste ma na riešenie naviedol vy sám).

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Len tak náhodou, ani vtedy nemám súbory VS upravovať, ak mám na forme control typu DEMO.DEMO a VS mi vlastnou chybou(alebo debilitou) nedovolí pokračovať v návrhu formu(už s tým mám skúsenosť)?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To je jediná vyjímka kdy nezbývá jiná možnost.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To, že mi nefungovalo načítanie po Application.Restart() vysvetľuje váš príspevok nižšie.Pri manuálnom spustení mimo VS mi funguje aj načítanie po Application.Restart().

Skúšal ste to testovať aj vo VS?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nezkoušel, už jsem psal že VS2010 nepoužívám. A něco tak primitivního není potřeba otevírat ve VS, stačí zběžně proletět CS soubory.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Když spustím Vaši applikaci z EXE souboru, funguje správně. Z vývojového prostředí (Express) nikoliv - mimo diskutovaný problém se po restartu aplikace záhadně zpřístupní Debug menu tak, jako by aplikace neběžela.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Bože můj, další perla. Nevíte jak funguje side-by-side konfigurace ve Frameworku. Znamená to, že každá verze assembly má svoje úložiště pro konfigurační soubory, tzn. assembly tazatele je např. 1.0.100.200 a vámi přeložená assembly je samozřejmě jiná verze (1.0.100.300) a tudíž spuštěná z VS nenačte předtím uloženou hodnotu z konfiguračního souboru, který je v jiné složce. Restart aplikace nezajišťuje Visual Studio, takže při jejím ukončení a opětovném spuštění je od ní odpojen debugger.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět
' po uložení s
My.Settings.Save() 
' před Application.Restart() dejte
My.Settings.Reload()

nahlásit spamnahlásit spam -3 / 3 odpovědětodpovědět

ten reload až po restartu!

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Co je to za blbost?! Po spuštění aplikace a při prvnímu přístupu k vlastnostem nastavení samozřejmě budou načteny aktuální hodnoty takže volání Reloadu postrádá jakýkoliv smysl.

nahlásit spamnahlásit spam 3 / 3 odpovědětodpovědět

Blbost? Nejde o "Po spuštění aplikace", ale o Application.Restart() a to je rozdíl!

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Pane, příště se zamyslete, než zase plácnete takovou obří hovadinu. Vy jste snad přesvědčen, že po zavolání Restart dál běží původní instance aplikace... Tvrzení "Po spuštění aplikace" je zcela na místě.

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Ještě jste nepochopil, co vlastně tazatel řeší, ale školíte, hodnotíte, vytahujete se - nejspíš se programováním živíte - na amatéra, který se jen tak pro zábavu podíval na řešený problém.

Není podstatné, co si myslím o tom, co se děje, nezabývám se tím. Jen jsem konstatoval skutečnost, že problém, který tazatel řeší existuje pouze ve vývojovém prostředí. Zkuste si to a teprve potom známkujte!

Nemusíte mi odpovídat, já na vaše invektivy dál reagovat nebudu.

nahlásit spamnahlásit spam 1 / 3 odpovědětodpovědět

Jasně položený dotaz by měl pochopit i takový hlupák jako vy, ne? Zajímalo by mě, proč odpovídáte na věci, o kterých víte naprostý prd (nezabývám se tím). Tím, že na něco odpovíte podobnými nesmysly jako tyto vaše dvě odpovědi, kromě vlastního ztrapnění akorát zmatete tazatele.

nahlásit spamnahlásit spam -2 / 2 odpovědětodpovědět

Už sa na to prišlo. (Zle) robíte to, že aplikáciu spúšťate cez VS.

Dôvod vysvetlil p. Linhart nižšie:Znamená to, že každá verze assembly má svoje úložiště pro konfigurační soubory, tzn. assembly tazatele je např. 1.0.100.200 a vámi přeložená assembly je samozřejmě jiná verze (1.0.100.300) a tudíž spuštěná z VS nenačte předtím uloženou hodnotu z konfiguračního souboru, který je v jiné složce. Restart aplikace nezajišťuje Visual Studio, takže při jejím ukončení a opětovném spuštění je od ní odpojen debugger.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dá se to řešit dočasným nastavením pevně určené verze assembly (1.0.0.0 místo 1.0.*), nebo kopírováním konfiguračních souborů před každým laděním (velmi zdržující).

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback