总述: 程序是一个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分!!!
谢谢!!!!
内部一个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分!!!
谢谢!!!!
所以用到 window.external ComVisble
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
{
}
}
{
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 的变量!
很有意思吧!
但是就是无法转换!
就是说Class1要实现idispatch
试试
[AutomationProxy(true)]
http://u.115.com/file
提取码: aqzfu4y1
回楼上: ComVisible(true) 本身就实现了IDispatch 把。