2010. április havi bejegyzések

Mixed mode assembly hiba .NET 4 alatt

Épp WPF alól matatok SQLite adatbázist (majd a jövő csütörtöki Ethical Hacking Konferencián megmutatom, hogy miért 😉 ), ami tökéletesen működött is .NET 2.0 alatt, de mikor áttettem .NET 4 alá, az alábbi hibaüzenet köszöntött, ráadásul futási időben:

System.IO.FileLoadException was unhandled
Message=Mixed mode assembly is built against version ‘v2.0.50727’ of the runtime and cannot be loaded in the 4.0 runtime without additional configuration information.

A problémát nyilvánvalóan az okozta, hogy a netről letöltött System.Data.SQLite szerelvény még az előző framework verzióhoz készült. A mixed mode assembly egyébként olyan szerelvény, ami .NET-es és C++ kódot is tartalmaz. A hibaüzenetből kiderül, hogy valami konfigolni kell, ezért létrehoztam egy app.config fájlt az alábbi tartalommal és máris megoldódott a probléma:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <startup useLegacyV2RuntimeActivationPolicy="true">
            <supportedRuntime version="v4.0"/>
        </startup>
    </configuration>

Hasonló előjöhet webes fejlesztésnél is, ott a WebDev.WebServer40.exe.config fájlt kell kiegészíteni a startup elemmel. A useLegacyV2RuntimeActivationPolicy-ről bővebben Mark Miller blogbejegyzésében lehet olvasni.

 

Technorati-címkék: ,

Reklámok

Query string kiolvasása JavaScriptből

Gyakran előfordul, hogy query stringben kell paramétereket cserélni ASP.NET és JavaScript között, ami egyrészt azért problémás, mert JavaScriptben nincs Request.QueryString gyűjtemény 🙂 másrészt mert az értékek az URL-ben kódolva is lehetnek.

JavaScriptben az alábbi segédfüggvénnyel kényelmesen ki lehet olvasni a megadott nevű URL paramétert. Ha nincs ilyen nevű kulcs az URL-ben, akkor a második paraméterként átadott default értéket adja vissza:

  function getQueryString(key, default_)
  {      
    if (default_==null) 
      default_="";      
    key = key.replace(/[[]/,"\[").replace(/[]]/,"\]");
    var regex = new RegExp("[\?&]"+key+"=([^&#]*)");
    var qs = regex.exec(window.location.href); 
    if(qs == null)
      return default_;
    else
      return qs[1];
  }

Bevallom, ezt nem én találtam ki (talán ezért működik jól), de sajnos a forrást már nem tudom megnevezni, régen akadtam rá a neten.

Azt az esetet azonban nem kezeli jól, amikor szerver oldalon Server.UrlEncode hívással kódolva kerül átadásra a paraméter. A tapasztalatok azt mutatják, hogy ilyenkor JavaScriptben egy decodeURIComponent hívás után már jó az érték. Valahogy így:

  var keyword = decodeURIComponent( getQueryString( 'k' ) );

Ti mit használtok?

Technorati-címkék: ,

VS 2010: szeretlek is meg nem is

Nagyon vártuk már, hogy elkészüljön a .NET 4.0 és vele együtt egy újabb és jobb Studio, ami hétfőn végre be is következett. Kedden fel is kúszott a gépemre, de nem felhőtlen az örömöm.

Kezdjük a jó hírekkel

A Visual Studio 2010-zel a Microsoft nagy bravúrt hajtott végre: előre megmondták, hogy mikor fog elkészülni, addigra tényleg megcsinálták ÉÉÉÉS letölthetővé is tették az MSDN előfizetők számára. Régen volt már ilyen! Sőt, ha hozzátesszük, hogy már az MSDNAA-ban is elérhető (adminnak manuálisan engedélyeznie kell a Hosted ELMS opciók között), akkor talán sohasem. A Studioból továbbra sincs x64-es verzió, de szerencsére az x86-os is kiválóan fut 64-biten (bár azért a readme-ben elég sok 64-bites issue van, nem is olvastam végig), sőt gond nélkül működik side-by-side a régi verzióval.

Az Ultimate Edition telepítője 2334 MB, de gondoltak arra is, aki nem akar ennyit töltögetni: a Web Installer mindössze 4 MB. Óvatosan a web installerrel, mert nem kürtöli világgá, de valójában trial verziót telepít. Míg a teljes nagy ISO beégetve tartalmazza a termékkulcsot (pre-pidded, de kinyerhető) és a telepítő nem is kéri, addig a Web Installernek utólag meg kell adni egy kulcsot (tehát nem kell újratelepíteni), ha nem akarjuk, hogy lejárjon. A kulcsok már elérhetők az MSDN előfizetők számára.

Aki az ingyenes verziókat szereti, annak jó hír, hogy egyúttal az Express változatok is elkészültek, amik továbbra is ingyenesen letölthetőek, sőt a Web Platform Installerrel ez már nagyon egyszerűen megtehető.

A telepítő egyébként barátságosabb, nem kérdez sokat (végre a Crystal Reportsot sem kell kivenni), nálam csak egy újraindításhoz ragaszkodott.

A Microsoftos bővítmények közül nekem leginkább a Web Deployment Projectsre volt szükségem, amiből egyelőre Beta változat tölthető le az új Studiohoz. Tetszik, hogy kompatibilis a régi verzióval, de azért az új MSDeploy támogatása is belekerült (igaz, csak alapszinten). Silverlight rajongók is örülhetnek, mert a Silverlight 4-hez is letölthető már a fejlesztőeszköz kiegészítés RC változata.

Az új VS nagyságrendekkel jobban használható, mint a korai béták voltak: aki attól tart, hogy a WPF dög lassú, annak íme a bizonyíték, hogy mégsem. Nem csak pofás a GUI, de reszponzív is, a multimonitor támogatáshoz pedig egy pillanat alatt hozzá lehet szokni, az összes újdonságot pedig meg sem próbálom felsorolni, tényleg sok van.

Nagyon tetszik, hogy a New Project dialógusablakba bekerült egy Online Templates szekció, ahol már most sok érdekes project van a Visual Studio Gallery-ből és a lista remélhetőleg a Web Platform Installerhez hasonlóan gyors ütemben fog bővülni:

VS 2010: Online templates szekció a New Project dialógusablakban

Nem vagyok teljesen elégedett

Nem állíthatom, hogy mindennek örülök, ami változott a Visual Studioban – cloud árnyékolja be az örömömet.

Az első csalódás rögtön a telepítésnél érheti a mobil alkalmazásfejlesztőket: nincs Compact Framework támogatás az új Studioban, sőt nincs új Compact Framework sem. Aki tehát Windows Mobile 6.x-re szeretne/kell fejleszteni, az ne akarjon áttérni Visual Studio 2010-re. Igazi showstopper. Öröm az ürömben, hogy a Windows Phone 7-re fejlesztőknek lesz VS 2010 Express for Windows Phone.

A második durva csalódást azok fogják elszenvedni, akik az offline MSDN-t részesítik előnyben. Oda a jó kis vastag kliens alkalmazás, már az offline MSDN Library is egy helyi webszerveren fut, böngészőben. A kereső katasztrófa, mert a régi Index ablak helyett itt most pontosan kell tudnom, hogy mit keresek. Ha ez így folytatódik, a következő verzióban egy Bing desktop search is települni fog. A sebessége is pont olyan.

A Start Page-et alaposan sikerült átpofozni, de azt továbbra sem értem, miért kellene Studion belül weboldalakat olvasgatnom, mikor erre ott a jó öreg böngésző. Az egyetlen előnye, hogy testreszabható, például alig 353 sor kóddal visszatehetjük rá az eltűnt Open Website és New WebSite menüpontokat. Bízom benne, hogy idővel valaki előrukkol valami igazán értelmessel, addig kikapcsolva marad.

Az egyik igazán bosszantó feature ebben a verzióban is megmaradt: változtattak a projekt fájl szerkezetén, tehát miután egyszer megnyitjuk az új Studioval, utána a régivel nem fogjuk tudni használni. Igazán kitalálhatnának erre Redmondban egy támogatott megoldást, addig marad Steve Dunn ingyenes eszköze.

 

Ami a C# nyelvet és a .NET Frameworköt illeti, azok önmagában megérnének külön-külön is egy-egy misét. Van újdonság bőven, amivel együtt jár, hogy breaking change-ek is vannak mind a C# nyelvben, mind pedig a .NET Frameworkben és az ASP.NET-ben, illetve természetesen néhány típus és tag obsolete lett.

A bosszantó és showstopper dolgoktól eltekintve tetszik az új Studio, az új Framework pedig megint feladja a leckét a tanulni vágyóknak.

Lopjunk sütit a böngészőtől

Egy .NET-es alkalmazásból a WebRequest osztály segítségével bármikor indíthatunk HTTP kéréseket egy weboldal felé. Ha a weboldal bejelentkezést igényel, akkor a webalkalmazás a szokásos módon cookie-k segítségével fogja megoldani az állapotkezelést, és a kliensre hárul a feladat, hogy a cookie-t minden kérésnél visszaküldje a szerverre. Ha a felhasználó böngészőből és a kliens alkalmazásból is eléri az alkalmazást, akkor sajnos kétszer kell bejelentkeznie, amire csak az lehet a megoldás, ha képesek vagyunk a böngésző által eltárolt sütit megszerezni.

Firefox böngésző esetén szerencsénk van, a perzisztens sütik egy cookies.sqlite fájlban tárolódnak, csak éppen a könyvtár kiderítése problémás. Az biztos, hogy a C:UsersfelhasználónévAppDataRoamingMozillaFirefoxProfiles mappa valamelyik almappájában van, az alábbi függvény visszaadja, hogy pontosan hol:

  private static string GetCookiePath()
  {
    string appDataPath = Environment.GetFolderPath( Environment.SpecialFolder.ApplicationData );
    string profilesPath = Path.Combine( appDataPath, @"MozillaFirefoxProfiles" );

    DirectoryInfo di = new DirectoryInfo( profilesPath );
    DirectoryInfo[] dir = di.GetDirectories( "*.default" );
    if( dir.Length != 1 )
    {
        return String.Empty;
    }

    string cookiePath = Path.Combine( profilesPath, dir[ 0 ].Name + @"" + "cookies.sqlite" );

    if( !File.Exists( cookiePath ) )
    {
        return String.Empty;
    }

    return cookiePath;
  }

A cookie-kat tartalmazó fájl szerencsére strukturált, konkrétan egy SQLite adatbázisról van szó, amihez szerencsére van szabadon letölthető managed provider. Miután referenciát adtunk a System.Data.SQLite.dll szerelvényre, a szokásos connection és command osztályokon keresztül érhetjük el az adatokat. A sütik a moz_cookies táblában vannak, ami name, path, host és value oszlopokat tartalmaz. Arra kell csak figyelni, hogy a host mező “www.” előtag nélküli domain neveket tartalmaz.

A WebRequest osztálynak egy CookieContainer példányt kell átadni, az alábbi függvény kiolvassa az adatbázisból a paraméterként megadott hoszt névhez tartozó sütiket és egy CookieContainer példányba csomagolva adja vissza:

  public static CookieContainer GetCookieContainer( string url )
  {
    Uri uri = new Uri( url );
    string host = uri.Host.Replace( "www.", "" );

    CookieContainer container = new CookieContainer();

    using( SQLiteConnection conn = new SQLiteConnection( "Data Source=" + FirefoxHelper.GetCookiePath() ) )
    {
        using( SQLiteCommand cmd = conn.CreateCommand() )
        {
            cmd.CommandText = "select * from moz_cookies where host like '%" + host + "%';";
            conn.Open();
            using( SQLiteDataReader reader = cmd.ExecuteReader() )
            {
                while( reader.Read() )
                {
                    container.Add( new Cookie( reader[ "name" ].ToString(), reader[ "value" ].ToString(),
                                               reader[ "path" ].ToString(), reader[ "host" ].ToString() ) );
                }
            }
        }
    }

    return container;
  }

Persze ha csak egyetlen süti értékére vagyunk kíváncsiak, akkor a domain név és a süti nevének ismeretében azt is megtudhatjuk:

  container.GetCookies( new Uri( url ) )[ cookieName ].Value;

Internet Explorer esetén a Wininet API-n keresztül tudjuk kiolvasni a böngésző által tárolt sütiket. Az InternetGetCookie helyett célszerűbb az újabb operációs rendszert igénylő InternetGetCookieEx függvény használata, mert azzal konkrét süti értékét is megkaphatjuk, sőt a HttpOnly sütiket is engedi olvasni.

Bármily kényelmesnek is tűnik ez a programozási lehetőség, akár a felhasználó tudta nélkül vissza lehet vele élni. Hogy ez milyen biztonsági fenyegetéseket rejt magában? Megmutatom az április 29-i Ethical Hacking konferencián. Már lehet regisztrálni!

 

Technorati-címkék: ,,,

Húsvéti kis színes (linkblog)

Hírek a nagyvilágból:

Visual Studio 2010 virtuális gépek: benne laborok, példák és minden, ami a teljes application lifecycle management kipróbálásához kell. Egyelőre a szoftverek Release Candidate változata érhető el, pedig akár már a végleges is lehetne.

BCL csapat a CodePlexen: nem a BCL forráskódja, hanem példák és osztályok, amik nem kerültek bele a Frameworkbe, de hasznosak lehetnek. Szerkeszteni nem lehet, leginkább megosztanak és visszajelzéseket gyűjtenek. Már van fent BigRational, LongPath, PerfMonitor és TraceEvent kód.

ASP.NET WebForms MVP (Model-View-Presenter): Tatham Oddie és Damian Edwards projektje, mellyel az MVC-hez hasonlóan az ASP.NET WebFormsba is bekerülhet a kód szeparálás és a tesztelhetőség. Ugyanerről szóban a 202. Hanselminutes podcastban.

Microsoft Ajax Minifier 4.0: immár nem csak JavaScript, hanem CSS fájlok minimalizálására is képes. Nekem az tetszik benne leginkább, hogy MSBuild task formájában is elérhető, így nagyon könnyen beépíthető a fordítási folyamatba. Erről írtam is korábban.

IIS UrlRewrite Module 2.0: sok újdonság van benne, például egyszerűbb lett a hibakeresés a naplózásnak köszönhetően és van HtmlEncode támogatás is, sőt végre nem csak a bejövő requestre, hanem a kimenő responsra is lehet szabályokat megfogalmazni. Ami messze legjobban tetszik: provider alapú bővíthetőség, példákkal.

patterns & practices Web Client Developer Guidance: a P&P csapat gőzerővel dolgozik, hogy a VS 2010 megjelenésére legyenek részletes ajánlások és referencia implementációk webfejlesztők számára. A béta változat letölthető a CodePlexről.

Orchard alpha: az Orchard projekt célja egy ASP.NET platformon futó, újrafelhasználható komponensekből felépített, nyílt forráskódú CMS rendszer létrehozása közösségi alapokon. A MIX-en kezdtek el róla először nyilvánosan beszélni, már letölthető az alpha verzió és a fejlesztésbe is be lehet szállni!

Feature Builder Power Tool for VS 2010: az Architecture Team által közreadott Visual Studio bővítmény (VSIX) előállító eszköz. A Preview változat letölthető a Visual Studio Gallery-ből, Michael Lehman bemutató videói pedig a Channel9-on nézhetők meg.

 

Technorati-címkék: ,,,