2017-05-26 5 views
3

私はJSILを使い始めています。私が理解する限り、私は指示に従った。私はコードで非常に基本的なC#のダミープロジェクトを持っている:Webページの基本的な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スクリプトと一緒にこれをホストするWebサイトを作成しました。私の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> 

...私はライブラリにアクセスできません。コンソール出力は、ロード中であることを示します。

これは200 OKです。しかし、私はそれにアクセスすることはできません。実行した場合:

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

私はライブラリにスタブを戻しますが、その中には何もありません。 asm.$typesByNameがありますが、それは空のオブジェクトです。私がしたいことは(それが動作するのを見て)MultiplyAddのメソッドを呼び出すことです。

So:私は何が欠けていますか?私の目的は、私が理解している通り、であるjsを通してアクセスできる蒸散ライブラリをホストすることです。:可能です。私はそれを機能させることができません。 https://github.com/mgravell/jsilfun

答えて

4

欠けている部分は、JSILのブラウザレイヤーが次の2つの段階で読み込みを実行することです。ブートストラップが正しくロードされ、マニフェストを読み込んだ後、ブラウザの足場があります。これはDOMインターフェイスを設定し、ロードしたアセンブリを実際に実行します。多くのことが非同期であり、実際にすべてのコードを実行する前に追加のアセンブリを独自にロードするか、他の作業を行う理由があるため、これは2つの段階で発生します。

ブラウザの足場は、第2段階を実行するために呼び出すことができるonLoad(ええ、申し訳ありません)という機能を公開しています。すべての例では<body onload="onLoad()">などと似ていますが、任意の方法で呼び出すことができます。

関連する問題