2007-11-21

Windows Vista me destruyó la PC 2 veces en menos de 2 días y otra vez… vuelvo a XP

El domingo, luego de instalar una actualización que se bajó de Windows Update, mi PC dejó de funcionar. Restauré una imagen de Ghost que tenía creada, pero se ve que algo malo tenía, porque no andaba Windows Update y tiraba algunos errores, por lo que decidí reinstalar. El lunes estuve todo el dia instalando Windows Vista y bajando drivers. Una vez que estuvo todo andando, abrí los updates y bajé todo lo que había para actualizar y… reinicie. Esa fue la última vez que Windows Vista pudo arrancar.

Teniendo mas ira que un ejercito de vikingos en puerta de vírgenes, decidí contar hasta 10, pensar en la tumba de quien no terminó de probar los updates y agarrar la imagen de Windows XP.

Otra vez en el viejo y querido OS lanzado en 2001 por Microsoft, espero terminar mis idas y venidas por Vista y XP, al menos hasta que salga el SP2 de Vista.

PD: Encontré para usar con XP un programa que simula (y muy bien) el Exposé (o como se escriba) de OS X. Lo pueden conseguir en http://www.reflexvision.net/

Z

2007-11-08

Post descolgado: Para los fanas de DragonBall y nostálgicos del Lemmings… LBZ3D!

Gente, les dejo aca un excelente jueguito de pelea en 3D basado en los personajes de DragonBall Z… hechos lemmings!

Es medio exigente con la placa de video, pero el juego esta muy bueno: HomePage

Z

2007-11-05

Copy as HTML en Visual Studio

Para toda la gente que tenga un blog o similar y tenga que pegar código, le recomiendo que use el CopySourceAsHtml y a olvidarse de los problemas de Blogger, Word 2007 o Live Writer cuando pegás un pedazo de código!. (Gracias Mariano!)

Lo pueden bajar de aca.

Z

Accediendo dinamicamente a WebServices

Hoy estábamos viendo con uno de los chicos del laburo que necesitaba poder acceder a distintos WebServices (desconocidos para el en tiempo de compilación) y queríamos encontrar una forma cómoda de hacerlo.

Después de buscar un poco, encontramos una solución que pareció bastante piola: usando el WSDL del WebService, generar la clase proxy en runtime y usar los WebMethods por Reflection. Está claro que no es la solución óptima en términos de velocidad, pero con unas clases helper que hice, resulta muy cómodo para usar.

El siguiente código lee el WSDL y genera la nueva clase en runtime:




try

{

    //Get the web service description

    Uri uri = new Uri(wsdlUrl);

 

    WebRequest webRequest = WebRequest.Create(uri);

    System.IO.Stream requestStream = webRequest.GetResponse().GetResponseStream();

    ServiceDescription sd = ServiceDescription.Read(requestStream);

    string sdName = sd.Services[0].Name;

 

    //Create the ServiceDescriptionImporter

    ServiceDescriptionImporter sdImporter = new ServiceDescriptionImporter();

    sdImporter.AddServiceDescription(sd, String.Empty, String.Empty);

    sdImporter.ProtocolName = "Soap";

    sdImporter.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties;

 

    CodeNamespace codeNamespace = new CodeNamespace(DefaultNamespace);

    CodeCompileUnit compileUnit = new CodeCompileUnit();

    compileUnit.Namespaces.Add(codeNamespace);

 

    //Import the ServiceDescription

    ServiceDescriptionImportWarnings warnings = sdImporter.Import(codeNamespace, compileUnit);

 

    if (warnings == 0) //No warnings

    {

        CSharpCodeProvider codeProvider = new CSharpCodeProvider();

        codeProvider.GenerateCodeFromNamespace(codeNamespace, new StringWriter(), new CodeGeneratorOptions());

 

        //Compile the assembly

        string[] assemblyReferences = new string[2] { "System.Web.Services.dll", "System.Xml.dll" };

        CompilerParameters param = new CompilerParameters(assemblyReferences);

        param.GenerateExecutable = false;

        param.GenerateInMemory = true;

        param.TreatWarningsAsErrors = false;

        param.WarningLevel = 4;

 

        CompilerResults results = codeProvider.CompileAssemblyFromDom(param, compileUnit);

        Assembly assembly = results.CompiledAssembly;

 

        Type[] types = assembly.GetExportedTypes();

        //Get the generated Type

        return new DynamicProxyClass(types[0], GetMethodNames(sd.PortTypes[0].Operations));

    }

    else

    {

        throw new Exception(String.Format("Importing has warnings: {0}", warnings.ToString()));

    }

}

catch (Exception ex)

{

    throw new Exception("Couldn't generate proxy class (see inner exception)", ex);

}



Acá se puede ver que lo que devuelvo es una DynamicProxyClass. Esta clase lo que hace es wrappear la clase generada y exponer solo los métodos del WebService, sus tipos de retorno y sus parámetros.

Si les interesa jugar con esto, dejo para bajar el código completo de la solución.


Z