如何在网页中访问基本的 JSIL 库(来自 C#)?

How to access a basic JSIL library (from C#) in a web page?

我正在尝试开始 JSIL。据我所知,我已按照指示进行操作。我有一个非常基本的 C# 虚拟项目,代码为:

namespace TestLib
{
    public class MagicType
    {
        public int Multiply(int x, int y)
        { // test instance method
            return x * y;
        }
        public static int Add(int x, int y)
        {// test static int method
            return x + y;
        }
    }
}

我用 jsilc 编译了它,并创建了一个网站来托管它和 jsil 脚本。我的 html 初始化这个:

<script type="text/javascript">
    var jsilConfig = {
        libraryRoot: '/js/jsil/',
        scriptRoot: '/js/testlib/',
        manifestRoot: '/js/testlib/',
        manifests: ['TestLib.dll'] // gets as far as Loading '/js/testlib/TestLib.dll.manifest.js'...
                                   // which is 200 / OK
    };
    var asm = null;
    var runMain = function () { // doesn't get invoked
        console.log('> main');
        asm = JSIL.GetAssembly("TestLib", true); // (executed outside method) returns a stub with no content
        console.log('< main');
    };
</script>
<script src="/js/jsil/jsil.js"></script>

但是...我无法访问图书馆。控制台输出表明正在加载:

Loading '/js/testlib/TestLib.dll.manifest.js'...

这是 200 OK。但是,我无法访问它。如果我 运行:

var asm = JSIL.GetAssembly("TestLib", true);

然后我取回图书馆存根,但里面什么都没有。有一个 asm.$typesByName,但那是一个空对象。我想要做的(为了看到它起作用)是调用 MultiplyAdd 方法。

所以:我错过了什么?我的意图是托管一个我可以通过 js 访问的转译库,据我所知,这是 :可能的。我只是无法让它发挥作用。我已经在这里上传了我的整个测试项目:https://github.com/mgravell/jsilfun

缺少的部分是 JSIL 的浏览器层分两个阶段执行加载:引导程序,您已成功加载并加载清单,然后是浏览器脚手架,它设置 DOM接口并实际执行您加载的程序集。这发生在两个阶段,因为很多事情都是异步的,您可能有理由自己加载其他程序集或在实际 运行 所有代码之前做其他工作。

浏览器脚手架公开了一个名为 onLoad 的函数(是的,抱歉),您可以调用它来执行第二阶段。这些例子都是用 <body onload="onLoad()"> 或类似的东西来做的,但你可以用任何你想要的方式来称呼它。