总述: 程序是一个form.
       内部一个WebBrowser, 实现了 window.external 。 其中需要暴露给 Js的都设置了 ComVisble(true)环境:
      C#文件:
      有暴露的类
      [ComVisble(true)]
      public class Class1(){ public Class1(){} }
      有2个函数      
      1.    Class1 GetClass1(){ return new Class1() };
      2.    bool  ValidateClass1( Class1 clsInstance1 ){   return true; }      Js文件:
      1.   var clsInstance1 = GetClass1();       
      2.   alert( ValidateClass1( clsInstance1 ); 问题:
      Js引擎能很好的得到 clsInstance1 , 甚至你 alert(clsInstance1) 都能得到消息 "Class1 xxxxx"
      但是一旦把 clsInstance1 作为函数 ValidateClass1的函数参数变量 ,则会得到异常错误 Class does not support Automation 这个问题把我弄得很崩溃,明明js可以创建变量 clsInstance1 , 却无法作为 ValidateClass1 的参数。
 后来我把 ValidateClass改成了 ValidateClass( object clsInstance1 ) 
 js不报错了,但是C#显示 clsInstance1 成了 __System_Com_object , 而且无法转换成 Class1我被这个问题搞死了,js明明可以创建这种类,并且可以alert,为什么作为参数就会说 does not support automation!!求大家帮助!如果解决愿意200分!!!
谢谢!!!!
      

解决方案 »

  1.   

    嗯,是的哦。
    所以用到 window.external ComVisble
      

  2.   

    我把测试代码贴一下,大家可以简单的测试一下!using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    namespace testjs
    {
        [ComVisible(true)]
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            private void Form1_Load(object sender, EventArgs e)
            {
                webBrowser1.DocumentText = @"<html></html>";
            }
            private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
            {
                webBrowser1.Navigate(@"javascript:
                var clsTest = window.external.GetClass1();
                alert( clsTest );
                alert( window.external.ValidateClass1(clsTest));
                ");
                webBrowser1.ObjectForScripting = this;
            }        public Class1 GetClass1()
            {
                return new Class1();
            }
            public bool ValidateClass1(Class1 test)
            {
                return true;
            }    }
        
        [ComVisible(true)]
        public class Class1
        {
        }
    }
      

  3.   

    是吧,这个问题很奇怪吧!而且,如果你把代码改成:public bool ValidateClass1(object test)
     {
      return true;
     }此时,得到的test的类型是 System.__ComObject你如果强制传唤就有异常, 说: can not cast __ComObject to jsTest.Class1 xxxxxxxxxxx还有更有趣,也是更困惑的在后面!!!
    如果我们给 Class1 增加一个属性:
     public class Class1
        {
            public Class1()
            {
                ABC = "Hello World";
            }
            public string ABC { get; private set; }
        }然后在ValidateClass1(...)这个函数中作如下操作: public bool ValidateClass1(object clsTest)
            {
             
                object value = clsTest.GetType().InvokeMember("ABC", BindingFlags.GetProperty | BindingFlags.Instance, null, clsTest, new object[] { });
                MessageBox.Show(value.ToString());
              
                return true;
            }这时候 value 可以得到正确的值 "ABC" !
    也就是说clsTest 的确是一个 Class1 的变量!
    很有意思吧!
    但是就是无法转换!
      

  4.   

    winform 程序怎么还有js调用。 不太明白。
      

  5.   

    js 使用的com类型要支持自动化
    就是说Class1要实现idispatch
    试试
     [AutomationProxy(true)]
      

  6.   

    我已经把测试工程打包了,115下载
    http://u.115.com/file 
    提取码: aqzfu4y1
    回楼上: ComVisible(true) 本身就实现了IDispatch 把。