Wie setzen ein enum definiert, die in einer COM-Bibliothek via interop als Rückgabe-Typ einer c# - Funktion
Hoffentlich die Frage ist klar, aber pad it out für Klarheit:
Ich habe eine VB6-dll, definiert ein enum, die ich bin Referenzierung in meinem C# - dll. Die C# - dll definiert einen CCW in der richtigen Art und Weise mit einem idispatch-Schnittstelle, in der Sie deklariert eine Funktion, der Rückgabetyp ist die Enumeration.
Beim laufen regasm ich bekomme eine Warnung, dass die enum ist nicht COM-sichtbar und so die Funktion nicht exportiert. Da es definiert, die in meinem VB6-Bibliothek, die ich hätte gedacht, es ist schon COM-sichtbar, weil es definiert eine COM-dll.
Ich klar, dass ich aufhören kann über Unordnung und verwenden Sie ein int übergeben werden, die enum-und nur noch casting-entweder Ende, aber es ist die richtige frustrierend und ich würde gerne wissen, ob eine Möglichkeit besteht.
Wie gewünscht ist hier einige Beispiel-code:
VB6-dll definiert ein enum
Public Enum myEnum
first = 0
second = 1
End Enum
Diese Daten werden importiert über interop in den C# - und wenn Sie die Metadaten anzeigen, die es sieht wie folgt aus
[Guid("EnumGUID")]
public enum myEnum
{
first = 0,
second = 1
}
Dann die CCW Schnittstelle definiert ist
[ComVisible(true)]
[Guid("InterfaceGuid")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IMyCCWInterface
{
[DispId(1)]
myEnum myFunction();
}
Regasm beschwert, dass myEnum ist nicht com-sichtbar. Ich muss Zustimmen, da die Metadaten-Ansicht nicht über die com-sichtbar-Attribut. Seltsam, wenn ich mit anderen Typen definiert in der VB-dll für die Argumente der Funktion bekomme ich keine Beschwerden, nur scheint die enum-und ich vermute, es ist weil ich bin tatsächlich der interopped Umsetzung der VB6-enum und nicht die tatsächlichen enum.
So, ich glaube, ich verstehe das Problem, was ich gerne wissen würde ist, ob es einen Weg, um diese Arbeit mit enums, die nicht die hacken alle zwischen-oder auto-generierten code.
- Ist VB6 dll ist eine COM-dll? Bitte zeig uns etwas code, um das problem zu verstehen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sieht es aus wie die Lösung ist, um die "Embed Interop Types" - Eigenschaft auf False für die importierten COM-assembly in den C# - Projekt.
Um dies zu testen, die ich erstellt ein VB-COM-dll als
StackOverflow.ExampleCom
mit dem folgenden code in esDann erstellte ich eine C# Klasse Projekt und importiert diese StackOverflow-COM-Bibliothek. Den folgenden code in C# erstellt dann ein COM-Objekt, das neu macht der Aufzählungstyp definiert, der in die VB-code erstellen die gleiche situation beschrieben, die von der OP.
Wenn wir bauen diese dann zu versuchen, erstellen Sie eine Typbibliothek aus dieser Versammlung mit
regasm /tlb:EnumDemo.tlb bin\Debug\EnumDemo.dll
dann bekomme ich eine Warnung über die Verwendung von nicht COM-sichtbar Wert-Typen. Aber mal der Verweis auf die VB-COM-dll hat den "Embed Interop Types" - Satz falsch, verschwindet die Warnung und überprüfung der generierten Typbibliothek mit OleView zeigt, dass der Typ verwendet wird und dieimportlib
Hinzugefügt wurde, Verweis auf die original-dll.Du hast Recht. Problem ist beim importieren der Enumerationen, die in Ihrem code, der es Ihnen erlaubt, diese zu benutzen, Enumerationen, die in Ihrem code - inside Ihre Montage. Sie würden nicht in der Lage sein, um Sie direkt zu benutzen. Sie müssen definieren, Enumerationen in .NETZ und machte Sie ComVisible.Sie werden ausgesetzt, als EnumType_myEnum statt nur myEnum (siehe diese)