如何在网页中访问基本的 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
,但那是一个空对象。我想要做的(为了看到它起作用)是调用 Multiply
和 Add
方法。
所以:我错过了什么?我的意图是托管一个我可以通过 js 访问的转译库,据我所知,这是 :可能的。我只是无法让它发挥作用。我已经在这里上传了我的整个测试项目:https://github.com/mgravell/jsilfun
缺少的部分是 JSIL 的浏览器层分两个阶段执行加载:引导程序,您已成功加载并加载清单,然后是浏览器脚手架,它设置 DOM接口并实际执行您加载的程序集。这发生在两个阶段,因为很多事情都是异步的,您可能有理由自己加载其他程序集或在实际 运行 所有代码之前做其他工作。
浏览器脚手架公开了一个名为 onLoad
的函数(是的,抱歉),您可以调用它来执行第二阶段。这些例子都是用 <body onload="onLoad()">
或类似的东西来做的,但你可以用任何你想要的方式来称呼它。
我正在尝试开始 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
,但那是一个空对象。我想要做的(为了看到它起作用)是调用 Multiply
和 Add
方法。
所以:我错过了什么?我的意图是托管一个我可以通过 js 访问的转译库,据我所知,这是 :可能的。我只是无法让它发挥作用。我已经在这里上传了我的整个测试项目:https://github.com/mgravell/jsilfun
缺少的部分是 JSIL 的浏览器层分两个阶段执行加载:引导程序,您已成功加载并加载清单,然后是浏览器脚手架,它设置 DOM接口并实际执行您加载的程序集。这发生在两个阶段,因为很多事情都是异步的,您可能有理由自己加载其他程序集或在实际 运行 所有代码之前做其他工作。
浏览器脚手架公开了一个名为 onLoad
的函数(是的,抱歉),您可以调用它来执行第二阶段。这些例子都是用 <body onload="onLoad()">
或类似的东西来做的,但你可以用任何你想要的方式来称呼它。