2010-07-13 60 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警告

相關問題