Der grundlegende Umriss meines Problems wird im folgenden Code gezeigt. Ich hostet ein WebBrowser-Steuerelement in einem Formular und ein ObjectForScripting
mit zwei Methoden: GiveMeAGizmo
und GiveMeAGizmoUser
. Beide Methoden geben die entsprechenden Klasseninstanzen zurück:
In JavaScript erstelle ich eine Instanz beider Klassen, aber ich muss die erste Instanz an eine Methode der zweiten Instanz übergeben. Der JS-Code sieht ein bisschen so aus:
%Vor% Hier habe ich eine Wand getroffen. Meine C # -Methode GizmoUser.doSomethingWith()
kann das Objekt nicht auf einen Gizmo-Typ zurückgeben. Es wirft den folgenden Fehler auf:
Das COM-Objekt des Typs 'System .__ ComObject' kann nicht in den Schnittstellentyp 'Gizmo'
umgewandelt werden
Ich bin mir nicht sicher, wie es weitergeht. Ich habe ein paar andere Dinge ausprobiert:
Gizmo g = oGizmo as Gizmo;
( g
ist null
) IDispatch
implementieren und rufen Sie InvokeMember
auf, wie hier erklärt . Der Name des Mitglieds ist null
. Ich brauche dies, um mit der .NET-Framework-Version niedriger als 4.0 zu arbeiten, daher kann ich dynamic
nicht verwenden. Weiß jemand, wie ich das zum Laufen bringen kann?
Wie interessant. Wenn wir das oGizmo
-Objekt zurück in doSomethingWith
erhalten, ist es vom Typ Windows Runtime Object
. Dieses Verhalten ist konsistent zwischen JavaScript und VBScript.
Wenn wir nun MarshalAs(UnmanagedType.IUnknown)
für den Rückgabewert der GiveMeAGizmo()
-Methode angeben, alles funktioniert , kann das Objekt in% co_de zurückgeworfen werden % innerhalb Gizmo
:
Immer noch, wenn wir doSomethingWith
oder UnmanagedType.IDispatch
angeben (der Standardname, der das Objekt als COM UnmanagedType.Struct
marshallt), ist das Problem zurück.
Daher gibt es bisher eine Problemumgehung, aber keine vernünftige Erklärung für ein solches COM-Interop-Verhalten.
[UPDATE] Einige weitere Experimente unten. Beachten Sie, dass VARIANT
erfolgreich ist, während gizmo1
nicht:
C # :
%Vor%JavaScript:
%Vor% Es ist nur eine Vermutung, aber ich denke, dass ein solches Verhalten etwas mit .NET-Sicherheitsberechtigungssätzen zu tun haben kann, die von gizmo2
.
Sie müssen zwei Dinge tun
Finden Sie den Objekttyp wie beschrieben hier .
Extrahieren Sie das tatsächliche Objekt aus Marshal.GetObjectForIUnknown (gelesen bis zum Ende, es gibt eine Schnittstelle zu implementieren).
Tags und Links javascript .net c# com webbrowser-control