2017-05-26 58 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()">或類似的東西來做到這一點,但你可以任何你想要的方式來調用它。