Przekazanie instancji klasy C # z powrotem do kodu zarządzanego z JavaScript przez COM
Podstawowy zarys mojego problemu przedstawiono w poniższym kodzie. Hostuję formant WebBrowser w formie i dostarczamObjectForScripting
dwiema metodami:GiveMeAGizmo
iGiveMeAGizmoUser
. Obie metody zwracają odpowiednie instancje klas:
[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);
}
}
W JavaScript tworzę instancję obu klas, ale muszę przekazać pierwszą instancję metodzie drugiej instancji. Kod JS wygląda trochę tak:
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);
To tam uderzyłem w ścianę. Moja metoda C #GizmoUser.doSomethingWith()
nie można oddać obiektu z powrotem do typu Gizmo. Zgłasza następujący błąd:
Nie można rzutować obiektu COM typu „System .__ ComObject” na typ interfejsu „Gizmo”
Nie wiem, jak postępować, wypróbowałem kilka innych rzeczy:
Bezpieczne odlewanieGizmo g = oGizmo as Gizmo;
(g
jestnull
)Zaimplementowanie klasIDispatch
i wołanieInvokeMember
, tak jakwyjaśniono tutaj. Członkiem „nazwa” jestnull
.Potrzebuję tego do pracy z wersją .NET Framework niższą niż 4.0, więc nie mogę z niej korzystaćdynamic
. Czy ktoś wie, jak mogę to osiągnąć?