2009-11-06 9 views
6

Dodałem 3 opcjonalne parametry boolowskie do metody znalezionej w bibliotece DLL VB6. Klasa, w której się znajduje, to MultiUse (publiczna), a sama metoda jest prywatna. Klasa implementuje określony interfejs z TLB, umożliwiając publiczne wywołania tej metody.Czy jest możliwe, że C# ma problemy z wywoływaniem metod VB6, które mają opcjonalne parametry?

Po dodaniu 3 opcjonalnych parametrów po stronie VB6, zmodyfikowałem powiązany kod C# tak, aby określił 3 opcjonalne parametry. Jest zbudowany w porządku ... Jednak kiedy próbuję uruchomić ten kod, to nie powiedzie się z następującym komunikatem o błędzie:

Method not found: „Boolean MyTLBName.IMyClassName.MyMethod (System.Object, System. String, Boolean, Boolean, Int32, Int32 ByRef, System.Object, System.Object, System.Object, Boolean, Boolean, Boolean) ".

Zauważ, jak wszystkie 3 parametry boolowskie są wyświetlane w komunikacie o błędzie? Wygląda dobrze dla mnie ... Wiem, że określiłem te 3 wartości logiczne, wywołując metodę z C#.

podejrzane, że zaznaczone na interfejs MyTLBName.IMyClassName w OLEView i widział tak:

[id (0x60030000)]

HRESULT MyMethod(
       //Cut out the other parameters - they are working fine. 
       [in, optional, defaultvalue(-1)] VARIANT_BOOL blnMyFirstOptionalBoolean, 
       [in, optional, defaultvalue(-1)] VARIANT_BOOL blnMySecondOptionalBoolean, 
       [in, optional, defaultvalue(-1)] VARIANT_BOOL blnMyThirdOptionalBoolean, 
       [out, retval] VARIANT_BOOL* __MIDL_0324); 

Ponownie, 3 opcjonalne parametry są widoczne i wyglądać dobrze .

Wydaje mi się, że powinno działać ... ale może czegoś brakuje.

Czy jest jakiś sposób, żeby to zadziałało bez konieczności tworzenia kolejnej wersji "MyMethod" w TLB? (Z inną nazwą i tymi 3 parametrami w razie potrzeby, a nie opcjonalnie)

Odpowiedz

5

Obecnie C# ma problemy z wywoływaniem funkcji VB6 z opcjonalnymi parametrami. Bardzo ciężko walczyłem z tym projektem, w którym absolutnie potrzebowałem użyć komponentu VB6 dostarczonego przez zewnętrznego dostawcę.

Znalazłem, że najłatwiejszym rozwiązaniem było utworzenie klasy w VB, aby wywoływać te funkcje, ponieważ VB.Net obsługuje opcjonalne parametry, a następnie wywołuje tę klasę VB6 z C#.

W klasie napisanej w VB.Net, zastosowałem właściwą metodę przeciążania, aby zapewnić kilka metod wywoływania tej jednej funkcji VB6.

Przykład - powiedzmy, że funkcja VB6 ma trzy parametry, pierwszy wymagany, a drugi dwa opcjonalne, bym utworzył trzy funkcje w komponencie VB.Net.

Public Sub CallComponent(byVal myParameter as Integer) 
    ....call component with one parm 
End Sub 

Public Sub CallComponent(byVal myParameter as Integer, byVal parm2 as String,) 
    ....call component with two parms 
End Sub 

etc ...

I wygląda na to opcjonalne parametry idą w 4.0: http://geekswithblogs.net/michelotti/archive/2009/02/05/c-4.0-optional-parameters.aspx

+1

+1 Wow. Co za ból. –

+0

Mam zamiar dać temu szansę ... dzięki za podpowiedź –

+0

Link do technologii technicznej jest zepsuty. –