Windows 8–Custom WinRT components and WinJS

Wow, I’m still alive!

I installed the RTM of Windows 8 when it became available, and in the last few days have started taking a look at writing a windows 8 app using HTML/JS, which in and of itself is a weird thing. I don’t think that windows developers of 10 years ago would’ve thought something like this would have ever come about.

As I was working on this, I ran across a problem, found the solution, and thought I’d blog about it to try and kick start me back into blogging. I already answered my own question on Stack Overflow, but will explain here.

I needed to create a custom WinRT component to do some stuff that I either wouldn’t be able to or didn’t know how to do with the javascript libraries available to me. I had a javascript class defined like this:

WinJS.Namespace.define("MyApp", {

MyClass: WinJS.Class.define(function() {

//constructor function

},

{ /*instance members*/ },

{ /*static members*/ })

});

This gives me an object I can access in javascript: var foo = new MyApp.MyClass();

I created my WinRT component like this:

namespace MyApp

{

public sealed class SomeClass

{

public int SomeMethod()

{

  return 42;

}

}

}

With the thought that from my javascript, I’d be able to do this:

var foo = new MyApp.MyClass();

var bar = new MyApp.SomeClass(); //from WinRT component

foo.SomeProperty = bar.SomeMethod();

When I tried this, I got the following error when trying to construct MyApp.MyClass (the object defined in Javascript)

0x800a01bd - Javascript runtime error: Object doesn't support this action.

I puzzled for a bit, then noticed while debugging that my “MyApp” namespace didn’t have anything in it other than the WinRT component. I changed my WinRT component to this:

namespace MyAppUtils

{

public sealed class SomeClass

{

//etc

}

}

And after this, everything was fine. So, lesson learned: If you’re using Javascript and create a custom WinRT component, make sure that the WinRT component is in a namespace all its own. Not sure why this happens, and if I find out why or if MS says something about this somewhere, I’ll come back and update this.