Blue的博客

JS调用c#编写的DLL

一个简单的办法是用WebBrowser做媒介,作为网页的宿主对象,继而通过将控件的ObjectForScripting赋值为当前窗体对象,通过窗体对象去引申调用C#项目里的其他文件。

可是,往往我们不需要通过窗体里面套WebBrowser来解决,那窗体有时候也不需要么。OK,那我隐藏掉窗体,隐藏掉所有……呵呵,太牵强了总也能行可那总归是牵强。

本文给大家提供一种设计思路,不见得完全适用(微软的机器可以),但望能抛砖引玉,期望高人提出更好的解决方案。

下面,引入正题:将C#编写的DLL已COM组件形式注册,再由JS调用

 首先做准备工作:

1、为您的VS添加OLE/COM Object View工具

“工具>>外部工具”,点击添加,选择路径,默认在“C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\Bin\OleView.Exe”(我的版本是VS2005 Team Suit)。填好相应参数就OK了。

JS怎样调用c编写的DLL - 龙鲤 - 有意栽花花不放 无心插柳柳成荫

2、创建一个类库项目,命名为DllCOMDemo

3、开始编码,类Demo.cs

代码:

JS怎样调用c编写的DLL - 龙鲤 - 有意栽花花不放 无心插柳柳成荫

 

COM组件需要引用接口实现;GUID为COM的clasid;

GUID要通过以下方式创建:

点击“工具>>创建GUID”,如图:

 

JS怎样调用c编写的DLL - 龙鲤 - 有意栽花花不放 无心插柳柳成荫

 4、设置程序集属性:

勾选“使程序集COM可见”,如下图

JS怎样调用c编写的DLL - 龙鲤 - 有意栽花花不放 无心插柳柳成荫

或者在AssemblyInfo.cs文件里面修改“[assembly: ComVisible(true)]”。

同时,在“生成”里面勾选“为COM Interop注册”。

5、生成项目,这时您就可以通过刚才添加的OLE View工具查看了。注意,COM组件的clsid为C#里面类(Demo.cs)上面的GUID。

默认在".NET Category"节点下查看,名称为您的程序集名称,如“DllCOMDemo.Demo”。

在选中的节点上右键选择“Copy HTML <object> Tag to Clipboard”,将COM组件的html代码复制到剪切板中。

6、创建TestDll.htm

 JS怎样调用c编写的DLL - 龙鲤 - 有意栽花花不放 无心插柳柳成荫

7、效果

JS怎样调用c编写的DLL - 龙鲤 - 有意栽花花不放 无心插柳柳成荫

这样子,我们就可以通过将C#代码注册成COM组件的形式来实现JS调用C#了。

 

以上是自动注册。

如果要手动注册COM组件(无论哪种注册方式“使程序集COM可见”必须设置为true),需要用到regasm.exe,默认%Windows\\Microsoft.NET\Framework\v2.0.50727%目录下。使用此命令注册时需要首先将程序集定义为“强程序集”,您可以使用al.exe为您的程序集产生一个密钥文件。这样,当您使用regasm注册时会自动在所在文件夹下自动搜索密钥文件注册。

如果使用regasm命令注册失败,请附带 /codebase参数。

如:regasm DllCOMDemo.dll /codebase DllCOMDemo.dll

 同样,我们也可以通过这种思路将C#中的自定义控件以COM组件形式注册,然后在html页面内使用。当然,这个意义似乎不重要。

 

 

 

 

Demo.cs类代码

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace DllCOMDemo
{
    [Guid("369588B3-0AC7-43fb-AB02-D92E9AC744AC")]
    public interface IDemo
    {
        string Name          { get;set;}
        string Gender        { get;set;}
        DateTime Birthday    { get;set;}
        int GetAge();
        string GetManInformation();
    }

    [Guid("437081BB-3023-49e7-9461-55326F08C44E")]
    public class Demo : IDemo
    {
        string name = "华骨龙";
        string gender = "男";
        DateTime birthday = new DateTime(1987, 2, 8);

        public string Name { get { return this.name; } set { this.name = value; } }
        public string Gender { get { return this.gender; } set { this.gender = value; } }
        public DateTime Birthday { get { return this.birthday; } set { this.birthday = value; } }

        public int GetAge() { return DateTime.Now.Year - this.Birthday.Year; }
        public string GetManInformation(){
            return string.Format("姓名:{0};年龄:{1};性别:{2};生日:{3}", Name,GetAge(),Gender,Birthday);
        }
        public string SayHello(string name){ return "【Message from C# DLL】Hello " + name ; }
    }
}

 

 


 

 TestDll.htm代码

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
 <HEAD>
  <TITLE> JS调用C#编写的DLL测试 </TITLE>
 </HEAD>

 <BODY>
 <script type="text/javascript" language="javascript">
 function GetManInfor(){
 lblinfor.innerHTML += "点击“" + event.srcElement.value + "”>>>"
 + csObj.GetManInformation() + "<br />";
 }
 function SetCSObj(){
 csObj.Name   = "雨露思恋";
 csObj.Gender  = "男";
 csObj.Birthday  = "1980-05-20";
 lblinfor.innerHTML += "Initialization Success!" + "<br />";
 }
 function GetAge(){
 lblinfor.innerHTML += "点击“" + event.srcElement.value + "”>>>" + csObj.Name
 + "的年龄是:" + csObj.GetAge() + "<br />";
 }
 function SayHello(){
 lblinfor.innerHTML += "点击“" + event.srcElement.value + "”>>>"
 + csObj.SayHello("Tom") + "<br />";
 }
 </script>
  <object id="csObj" classid="clsid:437081BB-3023-49E7-9461-55326F08C44E" style="width:0;height:0"></object>
  <input type="button" value="获取默认属性" onclick="GetManInfor()" />
  <input type="button" value="自定义设置" onclick="SetCSObj()" />
  <input type="button" value="重新读取" onclick="GetManInfor()" />
  <input type="button" value="获取年龄" onclick="GetAge()" />
  <input type="button" value="Say Hello To Tom" onclick="SayHello()" />
  <br /><br /><br />
  <span id="lblinfor" />
 </BODY>
</HTML>


posted on 2010-12-15 15:58  Blueeyes  阅读(4252)  评论(1编辑  收藏  举报