2010-07-13 53 views
1

当使用WebBrowser控件时,我想将JavaScript代码中的对象传递给C#。.Net WebBrowser和WinForms应用程序中的HTML之间的双向通信

解决方案是已知的 - 使用ObjectForScriptingWebBrowser的属性并调用javascript代码中的方法使用window.external

我知道该怎么做,但我想在javascript中创建具有给定类型的对象,并将它传递给C#而不使用objectdynamic。例如:

我想从JS这种方法在C#中称:

public void Test(Foo foo) 
{ 
    //do something 
} 

其中Foo是:

[ComVisible(true)] 
public class Foo 
{ 
    public string Bar; 
} 

我知道如何调用这些方法:

public void Test2(object foo) 
{ 
    //do something 
} 

public void Test3(dynamic foo) 
{ 
    //do something 
} 

但我想用第一个 - Test(Foo foo)

我应该怎么做才能将类从Foo的对象从JS传递给C#或者如何将JS对象动态转换为C#Foo对象?

回答

1

我发现至少有两种解决方案

首先,很明显,就是盛江建议的。您需要创建一个单独的类库与类型:

[ComVisible(true)] 
public interface IFoo 
{ 
    string Bar { get; set; } 
} 

[ComVisible(true)] 
public class Foo : IFoo 
{ 
    public string Bar { get; set; } 
} 

此类型库必须注册(项目/属性/编译/注册为COM互操作)。这些类型,特别是接口,应该用在控制WebBrowser的exe中。例如:

public string Bar(IFoo foo) 
{ 
    return foo.Bar; 
} 

public IFoo Bar2() 
{ 
    return new Foo() { Bar = "asdf" }; 
} 

现在我们可以在JavaScript中使用这些类型:

var foo = new ActiveXObject("ClassLibrary1.Foo"); 
foo.Bar = "qwer"; 
alert(external.Bar(x)); 
var fooFromExternal = external.Bar2(); 
alert(fooFromExternal); 
alert(external.Bar(fooFromExternal)); 

不幸的是,类库必须被登记,你会从IE得到的ActiveX警告

第二个解决方案是不创建类库,而不是将这些类型留在应用程序的exe文件。如果我们想将JavaScript中的对象传递给C#,我们仍然需要接口IFoo。我们需要的方法来对JavaScript创建在C#端对象:

public IFoo CreateFoo() 
{ 
    return new Foo() { Bar = "asdf" }; 
} 

public string Bar(IFoo foo) 
{ 
    return foo.Bar; 
} 

的Javascript用法:

var foo = external.CreateFoo(); 
alert(foo.Bar); 
foo.Bar = "qwer"; 
alert(external.Bar(foo)); 

我们并不需要注册为COM Interop什么,会有没有来自IE的ActiveX警告

相关问题