【发布时间】:2014-01-14 17:38:08
【问题描述】:
我的问题的基本轮廓如下面的代码所示。我在表单中托管了一个 WebBrowser 控件,并为ObjectForScripting 提供了两种方法:GiveMeAGizmo 和GiveMeAGizmoUser。两种方法都返回各自的类实例:
[ComVisible]
public class Gizmo
{
public string name { get; set; }
}
[ComVisible]
public class GizmoUser
{
public void doSomethingWith(object oGizmo)
{
Gizmo g = (Gizmo) oGizmo;
System.Diagnostics.Debug.WriteLine(g.name);
}
}
在 JavaScript 中,我创建了两个类的实例,但我需要将第一个实例传递给第二个实例的方法。 JS代码看起来有点像这样:
var
// Returns a Gizmo instance
gizmo = window.external.GiveMeAGizmo(),
// Returns a GizmoUser instance
gUser = window.external.GiveMeAGizmoUser();
gizmo.name = 'hello';
// Passes Gizmo instance back to C# code
gUser.doSomethingWith(gizmo);
这是我碰壁的地方。我的 C# 方法 GizmoUser.doSomethingWith() 无法将对象转换回 Gizmo 类型。它抛出以下错误:
无法将“System.__ComObject”类型的 COM 对象转换为接口类型“Gizmo”
不确定如何继续,我尝试了其他一些方法:
- 安全投射
Gizmo g = oGizmo as Gizmo;(g是null) - 让类实现
IDispatch并调用InvokeMember,如explained here。成员“姓名”是null。
我需要它与低于 4.0 的 .NET 框架版本一起使用,所以我不能使用 dynamic。有人知道我怎样才能让它工作吗?
【问题讨论】:
-
oGizmo在调试器中是什么样子的?还是总是为空? -
@Abhinav:它的类型是
System.__ComObject。如果我尝试oGizmo.GetType().GetMembers(),它会返回null(GetProperties()和GetMethods()相同。 -
你能显示“GiveMeAGizmo()”代码吗?
标签: c# javascript .net com webbrowser-control