如何在C#中使用Javascript引擎,JavaScript脚本调用自定义的COM组件的接口?需求如下:
1、C#,如何支持Javascript引擎,这样,可以在C#程序中执行Javascriptjiaoben。这个问题已经有了解决方法。参考:http://www.lihuasoft.net/article/show.php?id=8412、对其他的C#编写的COM接口也想要通过Javascript进行调用,又如何处理呢?
   例如: 一个COM接口为IMyClassInterface,其中有个函数MyFunc(),Javascript脚本写成
    
   //Javascript file
   function MyMain()
   {
        var nRet = MyFunc();
   }   C#程序通过运行这个Javascript而运行其中的MyFunc();目的,用户通过简单的Javascript编程来调用提供的COM组件接口完成用户自己所需要的逻辑功能。这样的需求如何作?怎么作?谢谢!

解决方案 »

  1.   

    不是所有COM都能被脚本使用,脚本调用的条件之一是Com对象要实现IDispatch接口。C#中可以用ComInterfaceType.InterfaceIsIDispatch来修饰一个接口为IDispatch,并用ComVisible(true)来对外界公开接口。详细见下面的例子:将下面的MyCom.cs和test.js拷贝存盘到同一个目录下。
    然后在Visual Studio工具的Dos窗口下,CD到该目录,并运行以下命令(后面有解释):
    csc /target:library MyCom.cs
    regasm /tlb /codebase MyCom.dll
    wscript.exe test.js// MyCom.cs
    //
    using System;
    using System.Runtime.InteropServices;[assembly: ComVisible(true)]
    [assembly: Guid("11cb4989-6094-4a8e-9355-111111111111")]namespace MyCom
    {
        [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)]
        public interface ICalc
        {
            int Add(int x, int y);
            void SayHello();
        }    [ClassInterface( ClassInterfaceType.None )]
        [ProgId("MyCom.MyCalc")]
        public class MyCalc : ICalc
        {
            public int Add(int x, int y)
            {
                return x + y;
            }
            public void SayHello()
            {
                System.Windows.Forms.MessageBox.Show("Hello from C# COM");
            }
        }
    }// test.js
    //
    MyCom = WScript.CreateObject("MyCom.MyCalc");
    sum = MyCom.Add(10, 8);WScript.echo("The sum is " + sum);
    MyCom.SayHello();csc /target:library MyCom.cs
    是将MyCom.cs源文件编译为.Net类库。注:请先确认当前的途径可以使用csc。regasm /tlb /codebase MyCom.dll
    将类库登记为COM对象。/tlb是要求产生并登记Type Library(用来具体描述该COM),/codebase指定如何找到该COM。这里可以忽略“该类库没有强命名”的警告。wscript.exe test.js
    测试在javascript下调用C#对象。[ProgId("MyCom.MyCalc")]
    给该COM对象取个容易引用的名字[ClassInterface( ClassInterfaceType.None )]
    不公开继承自object的函数MyCom = WScript.CreateObject("MyCom.MyCalc");
    在Javascript中创建一个COM对象sum = MyCom.Add(10, 8);
    调用COM对象公开的接口
      

  2.   

    5楼的方法已经讲得比较清楚了简单来说,就是 C#写个public的类以及public的方法,并且使用ComVisible用浏览器的客户端需要regasm 注册.net的组件最后页面上的js就可以CreateObject,并调用方法了