Resource   zodpovězená otázka

VB.NET, Visual Studio

Zdravím, prosím jak zařadit nšjaký soubor do resource, tak aby se přidal do kompilace? Konkrétně...jde mi o HTML soubor. Díky moc předem za všechny reakce.

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

Ve vlastnostech projektu na záložce Resources vyberte Add Resource/Add Existing File... a vyberte požadovaný soubor. Ten bude potom k dispozici přes pseudo-namespace My, konkrétně My.Resources.<Název souboru>

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

jj, super. Díky. Ještě bych měl jednu. Teď mi to nějak nejde zadat jako zdroj pro ten browser. Můžete mi prosím poradit?

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

No tak samozřejmě pro ten WebBrowser ta stránka musí být fyzicky přítomná na disku takže jedno z řešení by mohlo být vytvořit ten soubor z Resources v dočasné složce... K čemu to má sloužit? Možná by se dalo najít lepší řešení.

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

No...potřebuji jednoduchou věc. Postě se nějak nechytám v VB.net, jsem holt vychovaný VB6. To je jedno, jde mi o to že má v aplikaci ten browser a chci v něm zobrazovat tu stránku z lokálu. Chtěl bych to nacpa do jednoho EXE souboru.

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

Jde-li o jednoduchou stránku, pak ji lze vytvořit přímo v kódu. Zde je příklad:

Public Class Form1
  Private Sub Form1_Load(ByVal sender As System.Object, _
      ByVal e As System.EventArgs) Handles MyBase.Load
    WebBrowser1.DocumentText = _
     "<html><head><title>" & _
     "Stránka vytvořená v aplikaci VB.NET" & _
     "</title></head>" & _
     "<body  STYLE=""font-family: Verdana; font-size: 12pt"">" & _
     "<P>Vítejte na mojí stránce!</P>" & _
     "<P>&nbsp;</P>" & _
     "<P>Nějaké povídání...</P>" & _
     "</body></html>"
  End Sub
End Class

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

Dobrý nápad! Ovšem zůstává otázka, jak řešit např. obrázky...

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

Nevím, jestli WebBrowser náhodou neumí formát MHT (mohl by, je to vykreslovací jádro IE), je to vlastně HTML s přibalenými obrázky, skripty a styly. Můžete to vyzkoušet, v nějakém prohlížeči (IE to umí určitě, ostatní nevím) stránku otevřete a dejte Uložit jako..., jako typ souboru vyberte Webový archiv MHT a pak to zkuste plácnout do WebBrowseru.

A nejjednodušší by asi bylo pak ten MHT soubor buď z Resources uložit na disk do Tempu, nebo ho nějak získat jako stream a ten přímo v paměti převést na String ve správném kódování a plácnout ho do WebBrowseru.

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

Nebo se to dá řešit třeba přes res: "pseudoprotokol", takže napíšete jako src obrázku "res://PE_soubor.dll/nazev_te_resource". Takhle jsem to řešil kdysi v C++ a ActiveX, jestli to umí pracovat s managed resources nevím, takže by to chtělo pohledat na googlu. V nejhorším by se to připojilo dodatečně jako klasická resource pomocí Resource Hackeru.

Omlouvám se, že tenhle příspěvek je takový nekompletní, ale je to dlouho, co jsem si s tím hrál, takže jednak si nepamatuji vše, jednak nevím, jak to bude dobře běhat na .NETu.

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

Doplnil bych, že ve VS 2008 je díky podpoře LINQ možné zapisovat XML přímo do kódu, asi takto:

        Dim src As String = <html>
                                <head>
                                    <title><%= My.Application.Info.Title %></title>
                                </head>
                                <body>
                                    <h1><%= My.Application.Info.Title %></h1>
                                    <p style="font:icon;"><%= My.Application.Info.Description %></p>
                                </body>
                            </html>.ToString()

s tím, že Vám Visual Studio kód hezky nabarví a upozorní na případné chyby.

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

Děkuji. Koukám ale, že musím každý řádek dát do uvozovek a na konec napsat & _. Tak to musím předělat celý zdroják. Nic...každopádně mockrát děkuji.

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

Těch "& _" je tam hodně jen pro zdejší vyobrazení, aby řádky byly krátké a kód byl při zkopírování funkční. Ale je to (včetně přidávání uvozovek) zbytečné, když zvolíte řešení pana Hercega!. Když MHT soubor - např. "pokus.mht" - dáte do resources a vlastnost "Copy to Output Directory" nastavíte na "Copy always", k načtení stránky do browseru stačí:

 WebBrowser1.Navigate("file:///" & FileIO.FileSystem.CombinePath _
       (My.Application.Info.DirectoryPath, "pokus.mht"))
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Udelal jsem to, a nic. Možná jsem to špatně zařadil. Mohl bych poprosit o přesné zadání? Jako i s private sub.... Nějak se nechytám. Díky.

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

Pokud soubor mht přidáte do Resources, není třeba nikde nastavovat "Copy to Output Directory", protože soubor mht bude "zkopírován" přímo do exe/dll souboru. A naopak pokud hodláte mít mht soubor vždy umístěn ve složce aplikace, není třeba ho dávat do Resources.

Kód pro zkopírování mht souboru z Resources do dočasné složky:

'Proměnná definovaná na úrovni třídy
Private webArchiveFileName As String = Path.GetTempFileName() + ".mht"

'Předpokladem je umístění mht souboru do Resources
'pod názvem WebArchive a import jmenného prostoru System.IO
Try
  File.WriteAllBytes(webArchiveFileName, My.Resources.WebArchive)
Catch
  'Při vytváření nebo zápisu souboru došlo k chybě.
End Try

Kód pro následné použití v komponentě WebBrowser:

WebBrowser1.Navigate(New Uri(webArchiveFileName))
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Všem vám moc děkuji. Já jsem prostě stracený :( Pořád mi to nefunguje. Vzdávám to. Každopádně moc děkuji za pomoc.

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

pro Autor: neregistrovaný

Vždyť je to tu v podstatě vyřešené. Co konkrétně nefunguje? Možná se po uložení HTML do MHT z lokálního zobrazení neukazují obrázky. Pak je třeba odstranit ve zdrojovém kódu MHT lokální absolutní cesty a nechat jen jména souborů s příponou.

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

Vycházím-li z přání tazatele, tak nechci mít samostatný soubor s webovou stránkou. Proto ji dám do resources. Abych stránku načetl do browseru, potřebuji ji na disku. Proto "Copy to Output Directory". Při ukončování práce můžu soubor vymazat. Návrh je amatérský, tudíž asi nedokonalý, ale funkční.

Vaše řešení je ve výsledku rozdílné v tom, že soubor se stránkou je uložen do temporary složky. Navíc však s příponou .tmp a ve WebBroseru se ukáže zdrojový kód.

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

Jde o to, čemu říkáte Resources. Já za Resources považuji veškerá data, která jsou do Assembly přilinkována v průběhu kompilace, tudíž žádný externí soubor. Možná si to pletete se složkou Resources a jejím obsahem která se vytváří automaticky. Každopádně nastavíte-li vlastnost Copy to Output Directory na Copy Always, žádný soubor se nikam automaticky neextrahuje, zkuste si to. WebBrowser bude hlásit že "Tento program nemůže tuto webovou stránku zobrazit"...

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

My Project - Open - záložka Resources - Add Resource - Add Existing File

Otevřel jste mi oči, děkuji. "Copy to Output Directory" tedy platí jen při building aplikace.

Je fakt, že snaha si odpustit jeden soubor (MHT) je asi zbytečná, vystavěná aplikace stejně není jen EXE soubor, jeden navíc už nehraje roli.

Napsal jste jak zakompilovaný soubor extrahovat, také přínosná informace! Jak však určit typ souboru? Šlo by to lépe než změnou přípony ve stringu?

 Dim webArchiveFileName As String = IO.Path.GetTempFileName()
 Dim soub As String = webArchiveFileName.Replace("tmp", "mht")
 IO.File.WriteAllBytes(soub, My.Resources.pokus)
 WebBrowser1.Navigate(soub)

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

Pokud v projektu nemáte odkazy na nějaké Assemblies mimo ty z .NET Frameworku, pak sestavená aplikace je skutečně jen jediný exe/dll soubor. Ostatní soubory lze klidně smazat. Soubory *.pdb obsahují informace pro ladění a soubory *.vshost.* představují speciální hostitelský proces opět pro účely ladění. Soubory *.config jsou konfigurační soubory které se vytvářejí automaticky při spuštění aplikace.

Typ souboru z Resources nijak určit nelze. Z hlediska aplikace je to pole bajtů a vy musíte vědět jaké Resource vaše aplikace obsahuje a podle toho s nimi naložit. Resources jsou vlastně konstanty a proto předem víme co která představuje a není třeba je nijak dynamicky identifikovat (přidat Resource do již hotové Assembly by mělo jít dynamicky pomocí Reflection ale to jen tak okrajově).

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

Že aplikace funguje jen s EXE souborem jsem zjistil, ale v "Tuning, aneb optimalizace kódu" píšete, že teprve při prvním spuštění se kompilace dokončuje. K tomu nejsou další soubory potřeba?

Zkusil jsem stránku s mnoha obrázky uložit do MHT a Vámi uvedeným postupem doplněným replace "tmp" na "mht" zobrazil ve WebBrowseru a až mě překvapilo, jak to funguje. Nedostatek při uložení do MHT je, že se neuloží soubory pozadí. Dále je dobře doplnit kód aplikace o vymazaní dočasného MHT souboru.

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

Kompilace Just-in-Time se provádí za běhu aplikace, ale to je pro vás naprosto transparentní proces. Abych se přiznal tak ani sám nevím kam se ukládá nativní kód vygenerovaný JIT kompilátorem. Nekompiluje se samozřejmě všechno, ale jen ty části aplikace které jsou zrovna potřeba (takže kompletně přeloženo do nativního kódu to může být třeba až po dvacátém spuštění). Samozřejmě to neznamená že když chcete aplikaci distribuovat tak musíte někde vyhrabat i ten nativní kód, to vůbec ne.

nahlásit spamnahlásit spam 2 / 2 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