这几天在做一些asp的工作,发现这个语言真的很不好用,业务处理能力太差了,难怪微软急忙推出asp.net来作为它的替代品。可是asp作为一个流行这么多年的语言,已经占据不少的市场份额,asp.net作为一个全新的平台和asp很不一样难做移植,那我们能不能用asp直接调用.net的库呢,下面来展示一个可行的解决方案:
A,首先用VS2010新建一个C#类库项目,我们在里面定义一个测试类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace ClassLibrary1
{
[ComVisible(true)] //对com可见
[ClassInterface(ClassInterfaceType.AutoDual)] //对com公开
public class Class1
{
public string combine(string a, string b) {
return a + b;
}
}
}
//ClassInterfaceType的选择可以参照下面链接的说明,我这里尽量简化代码
//http://archive.cnblogs.com/a/1527632/
B,打开开始菜单中Visual Studio 命令提示(2010)工具
C:\>sn -k c:\myKey.snk
创建签名文件myKey.snk,然后在C#项目上右键,点击属性,选择签名,选中为程序集签名,选择myKey.snk文件,运行项目生成dll文件
在命令提示工具里面切换到dll所在目录
F:\nsp>tlbexp ClassLibrary1.dll /out:ClassLibrary1.tlb
Microsoft (R) .NET Framework Assembly to Type Library Converter 4.0.30319.1
Copyright (C) Microsoft Corporation. All rights reserved.
Assembly exported to 'F:\nsp\ClassLibrary1.tlb'
F:\nsp>regasm ClassLibrary1.dll /tlb ClassLibrary1.tlb /codebase
Microsoft(R) .NET Framework 程序集注册实用工具 4.0.30319.1
版权所有(C) Microsoft Corporation 1998-2004。保留所有权利。
成功注册了类型
成功注册了导出到“F:\nsp\ClassLibrary1.tlb”的程序集和类型库
F:\nsp>gacutil /i ClassLibrary1.dll
Microsoft (R) .NET Global Assembly Cache Utility. Version 4.0.30319.1
版权所有(C) Microsoft Corporation。保留所有权利。
程序集已成功添加到缓存中
F:\nsp>
执行上面的一组操作,分别生成tlb类型库文件,导入注册表(此时dll可以作为com使用),将dll程序集加到GAC(全局程序集缓存)
C,创建一个test.asp文件,输入如下代码
<%
set s = CreateObject("ClassLibrary1.Class1")
Response.Write(s.combine("Hello","World"))
%>
打开浏览器或者运行IDE查看,字符串已经被拼接起来。
如上面那个链接中说,在产品里面用ClassInterfaceType.AutoDual并不好,具体原因我不是很理解,我们可以像下面一样实现一个接口
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace ClassLibrary1
{
interface IClass1
{
string combine(string a, string b);
}
[ComVisible(true)] //对com可见
[ClassInterface(ClassInterfaceType.None)] //对com公开
public class Class1:IClass1
{
public string combine(string a, string b) {
return a + b;
}
}
}
剩下的步骤和B一样,不论怎样,能在功能简单的asp里面调用asp.net封装的dll还是感觉很好,不过不知道服务器是否还需要.net framework的支持。