Zurückgeben einer C # -Klasseninstanz von JavaScript über COM an den verwalteten Code

8

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:

%Vor%

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:

  • Sicheres Casting Gizmo g = oGizmo as Gizmo; ( g ist null )
  • Lassen Sie die Klassen 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?

    
Andy E 14.01.2014, 17:38
quelle

2 Antworten

4

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 :

%Vor%

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:

ist

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 .

    
Noseratio 15.01.2014, 00:42
quelle
0

Sie müssen zwei Dinge tun

  1. Finden Sie den Objekttyp wie beschrieben hier .

  2. Extrahieren Sie das tatsächliche Objekt aus Marshal.GetObjectForIUnknown (gelesen bis zum Ende, es gibt eine Schnittstelle zu implementieren).

Abhinav 14.01.2014 17:51
quelle