Wednesday, 25 May 2016

Cannot find type System.MarshalByRefObject error in UWP app

Playing and learning with UWPs today, I found a strange error when compiling with VS 2015:

Xaml Internal Error error WMC9999: Cannot find type System.MarshalByRefObject

It's a bit misleading, but one can easily see that it's related to DLL references. After dealing with it for a while, I realized some of my Nuget packages were not up to date. Updating them fixed the issue.

More precisely, updating Microsoft.NETCore.UniversalWindowsPlatform to version 5.1.0 fixed the issue.

Hope it helps! 

Friday, 6 May 2016

DirectInput, XInput, Windows.Gaming.Input, y ahora qué? Forza Motor Sport 6

Desde que supe que Forza Motorsport 6 iba a ser una UWP (app universal), y por tanto iba a tener una versión Windows 10, estaba muy expectante para ver qué pasaba con un tema muy concreto: DirectInput. 

Microsoft lleva años dando bandazos con determinadas tecnologías de juegos (todos recordamos el bizarro caso de XNA). Y DirectInput es un caso parecido, aún más extremo si cabe. Para los que no lo sepáis, DirectInput es un módulo dentro de DirectX que se encarga(ba) de acceder a dispositivos como Joysticks, volantes, gamepads, etc.

Cuando salió Windows 8, lanzaron el que (se suponía) iba a ser su sucesor: XInput. Pero inexplicablemetne hicieron una chapuza que solo soportaba gamepads, nada de dispositivos de entrada genéricos ni Force Feedback.

En applicaciones Windows Desktop, uno puede seguir usando la librería, por muy deprecada que esté. De hecho, si vais a la web de Developers de Logitech y os bajáis su SDK, veréis que aún está basado en DirectInput: http://gaming.logitech.com/en-us/developers

El problema, es que las Apps Universales no son aplicaciones desktop, sino aplicaciones del AppStore, y por tanto no pueden referenciar DLLs antiguas. Y ahí está la movida: no existe actualmente un sustituto válido para DirectInput.

Si uno va a la MSDN, para consultar qué tecnologías de juegos pueden usarse en UWP (https://msdn.microsoft.com/en-us/library/windows/apps/mt282476.aspx), verá una sección específica para Input, en la que pone esto:


Hay un API nuevo rondando desde hace tiempo: Windows.Gaming.Input, pero nuevamente no es, ni de lejos, un sustituto a DirectInput. De nuevo, ni Force Feedback ni soporte para dispositivos de entrada genéricos HID. Solo gamepads.

Así que cuando vi que Forza iba a ser una UWP, enseguida me pregunté cómo se lo iban a montar para dar soporte a los volantes y pedales de alta gama que los aficionados a este tipo de juegos suelen tener en casa. Sistemas que, en algunos casos, se acercan a los 1000 euros.

Y hoy que se ha publicado la BETA, se ha desvelado el misterio: no lo hace. No soporta volantes. At all...

Y claro, la gente está que trina... Los comentarios en la appstore son de risa... 

Supongo que en Microsoft estarán trabajando a destajo para convertir Windows.Gaming.Input en lo que siempre debió ser, pero con Microsoft nunca se sabe... :D

Thursday, 10 March 2016

Advanced text replacements in Visual Studio using RegEx

This is just a quick tip about making advanced text replaments in Visual Studio.

You are probably used to the "Replace in Files" tool accessible through the Ctrl+Shift+H shortcut (see below). As you already know, you can make text replacements in multiple files, entire solutions, etc.


Using Regular Expressions (you can test them first using this site), you can make quite complex replacements that are really handy when refactoring code. Especially when those changes appear in many different places.

For instance, let's say you were accessing attributes of a class all around your code. Something like:

                        nd.Attributes["ATTRIB_NAME"].Value = "ATTRIB_VALUE";                        

And that you want to change that, replacing with a call to a method. Something like:

nd.SetAttributeValue("ATTRIB_NAME", "ATTRIB_VALUE");

First, you need a way to find all appearances of something similar, no matter what's inside those strings (ATTRIB_NAME, ATTRIB_VALUE). That can be easily achieved with the following "Find What" argument:

.Attributes\["(.*)"\].InnerText = (.*);

It includes the (.*) RegEx, which basically matches any string. By using the brackets (), it will also instruct Visual Studio to tag whatever it matches the RegEx in each find-and-replace operation. That way, we can use that values in the "Replace With" argument:

.SetAttributeValue("$1", $2);

By using $1..$n, we specify found strings tagged in the "Find What" parameter. That way, the resulting replacement will include what we want, and re-use whatever was found in the original string. 

This page includes more information about using RegEx in Visual Studio.

Thursday, 4 February 2016

C# Intellisense making wrong suggestions inside foreach statements

There’s a bug in Visual Studio that has been annoying me for quite a long time: sometimes, Intellisense doesn’t work well inside “foreach” statements in C#. It makes suggestions, but the wrong ones.

For example, if I start writing “foreach (System.Xm….)” with the intention to write “System.Xml.XmlNode”, Intellisense only offers stupid options like System.FromXml that make no sense.

I’ve realized that this only happens if the parenthesis are closed. So, if you delete the closing parenthesis before start typing, Intellisense works as expected. 


I´m sure there are other ways to fix this, but for now unchecking the “Automatic brace completion” option (see below) will suffice. 

In fact, it’s an option I never liked, so two birds with one stone… J