2016-12-13 1 views
2

Ich erhalte eine Fehlermeldung, wenn ich versuche, einen C# -Thread von Visual Basic Classic über COM aufzurufen. Der Fehler besagt, dass generische Typen nicht gemarshallt werden können, was merkwürdig ist, da keine Generika beteiligt sind.Aufruf von Threads über COM-Interop

COM-Schnittstelle:

[Guid("C8B306A5-980D-4226-8130-5E2E0F710FC2")] 
[InterfaceType(ComInterfaceType.InterfaceIsDual)] 
public interface comInterface 
{ 
    [DispId(1)] 
    Task firstTask(); 
} 

Implementation:

[Guid("0D5E5234-B1C0-4CFA-9B35-21F091E2E8C4")] 
[ClassInterface(ClassInterfaceType.None)] 
[ProgId("COMproject.implementClass")] 
public class implementClass : comInterface{ 
public async Task firstTask(){ 
//doSomething 
} 

Anruf in VB6:

Dim comObject As muhDLL.comInterface 
Set comObject = New muhDLL.implementClass 
comObject.firstTask 

ich eine Methode nur erzeugen kann, die den Faden in C# aufruft und das Verfahren aussetzen durch COM aber dann bekomme ich Warnungen und der Code sieht im Allgemeinen hässlich aus. Gibt es eine Möglichkeit, wie ich eine asynchrone Aufgabe direkt über COM aufrufen kann und warum scheint COM keine Aufgaben zu unterstützen oder mache ich etwas völlig falsches?

+1

was ist der Fehler, den Sie erstellen zu bekommen? – gilmishal

+0

Entschuldigung, ich habe den Beitrag bearbeitet. "Generische Typen können nicht gemarshallt werden" Ausnahme – MrKey

+0

Ok, ich bin ein bisschen rostig mit COM, aber es scheint logisch, dass es wegen der 'Task' ist, bezweifle ich, dass COM eine Aufgabe zurückgeben kann. Ich bin mir nicht sicher, was Sie erreichen wollen, indem Sie die Methode async erstellen, denn soweit ich weiß, verwaltet COM Ihre Threads beim Aufruf, und ich bezweifle, dass es den Vorteil von Async have nutzt. Ich würde zuerst versuchen, die Methode zu erstellen, ohne Aufgabe zurückzugeben oder async zu verwenden und zu überprüfen, ob es funktioniert. – gilmishal

Antwort

0
[Guid("C8B306A5-980D-4226-8130-5E2E0F710FC2")] 
[InterfaceType(ComInterfaceType.InterfaceIsDual)] 
public interface comInterface 
{ 
    [DispId(1)] 
    Task firstTask(); 
} 

Der obige Code sagt, dass Sie ein Task Objekt an den COM-Code zurückkehren möchten. Aufgabe ist ein Objekt mit Eigenschaften, Methoden usw., die Informationen zu Ihrer Funktion darstellen, die void zurückgibt. Um die Aufgabe zu COM zurückzugeben, müsste sie COM sichtbar sein und alle ihre Mitglieder müssten ComVisible sein (denke ich). Ich weiß es nicht. Normalerweise können Sie ein ComVisible-Attribut für eine Klasse sehen, wenn Sie die Definition ändern und den Attributbereich über der Klasse erweitern, aber in diesem Fall nicht.

Ich bin kein Experte in diesem, aber ich glaube nicht, dass ComInterop auch mit async Funktionen funktioniert. Ich habe nicht viel Multithreading mit COM gemacht, daher bin ich mir nicht ganz sicher.

Ich habe eine App, in der ich eine Funktion verfügbar gemacht, die void zurückgegeben, aber es rief eine asynchrone Methode innerhalb es. Als das asynchrone Zeug fertig war, habe ich ein Ereignis ausgelöst, das ich COM ausgesetzt habe, und COM-Code würde damit umgehen.

Here is a link auf Ereignisse und Umgang mit ihnen in COM-Code

+0

Die gesamte Baugruppe ist COM sichtbar; Daher muss ich dieses Attribut nicht explizit für alle Methoden deklarieren. Vielen Dank für Ihren Vorschlag. Ich werde auf Veranstaltungen aufmerksam machen. Ich verwende derzeit Bool-Funktionen, um die asynchronen Funktionen aufzurufen, deren Rückgabe false ist, wenn ein Fehler in der asynchronen Funktion aufgetreten ist. – MrKey

Verwandte Themen