Windows 8–Custom WinRT components and WinJS
- by Jonas Bush
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.