HTA
HTML应用(HTML Application,HTA)可以算是最早的WebView了,在Windows 2000到Windows 10中都可以使用,实际上就是一个启用本地权限的IE浏览器,可以借助ActiveX在.NET上开发扩展。编写一个静态HTML页面,然后将其扩展名修改为HTA,就变成了一个本地应用,这个页面拥有信任站点权限。但是相应地,有些限制跨域的Web开发手段就不能使用了。除此之外,还必须考虑当前使用的IE版本。
元信息标签
除了标准的HTML页面外,可以在<head>标签里面加入一个<HTA:AppLICATION>标签用于描述应用本身:
<head>
<HTA:AppLICATION
ICON="favicon.ico"
WINDOWSTATE="maximize">
</HTA:AppLICATION>
...
基于.NET的COM组件
对于IE 11版本来说,其必须使用.NET 4.0以上版本创建的COM组件。一个.NET 上的COM组件实例如下:
using System;
using System.Runtime.InteropServices;
namespace Exercise.Background
{
[ComVisible(true)]
[Guid("54AC547E-32D6-4540-9A2A-B5B71E2A313F")]
public interface ICalculator
{
[ComVisible(true)]
double Add(double val1, double val2);
}
[ComVisible(true)]
[Guid("8A7DE620-5D50-441D-ACC2-543CA8F2B664")]
public class CalculatorImpl:ICalculator
{
[ComVisible(true)]
public double Add(double val1, double val2)
{
return val1 + val2;
}
}
}
编译,然后在管理员权限下使用C:\Windows\Microsoft.NET\Framework或Framework64下v4.0.x目录中的regasm.exe注册生成的DLL。
在HTA中调用COM组件
在页面中首先声明组件(使用实现类的CLSID):
<object CLASSID = "CLSID: 8A7DE620- 5D50- 441d- ACC2- 543CA8F2B664" id = " calculator "></object>
然后在Javascript中按HTML ID调用即可:
<script>
window.onload = function() {
var output = document.getElementById("output");
output.innerHTML = calculator.Add(1.0, 2.0).toString();
}
</script>
这种创建COM的方式只能创建单例。可以在单例的基础上使用工厂方法创建其它对象,注意如果使用数据对象,数据对象也必须根据接口传入参数:
interface IStudent {
void SetAge(int age);
...
}
class StudentImpl {
public void SetAge(int age) { ... }
...
}
换言之,对于Javascript而言只能看到COM的接口。如果不想按照COM的约定实现序列化,也可以借助JSON.NET等工具,直接传递JSON/XML字符串。