2017-05-26 54 views
3

我正在尝试使用JSIL开始。据我所知,我遵循了指示。我有代码一个非常基本的C#项目假人:如何访问网页中的基本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

回答

4

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

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