Udostępnij za pośrednictwem


Rozwiązywanie problemów związanych z współdziałaniem (Visual Basic)

Kiedy współdziałanie między COM i kod zarządzany z .NET Framework, może się pojawić jeden lub więcej następujących typowych problemów.

Kierowanie międzyoperacyjne

W czasie, należy użyć typów danych, które nie są częścią .NET Framework.Zestawy międzyoperacyjne obsługują większość pracy dla obiektów COM, ale może mieć do kontrolowania typów danych, które są używane, gdy zarządzane obiekty są narażone na modelu COM.Na przykład, należy określić struktur w bibliotekach klasy BStr niezarządzanych typu na ciągi przesyłane do obiektów COM utworzony przez program Visual Basic 6.0 i starsze wersje.W takich przypadkach można użyć MarshalAsAttribute atrybut spowodować typy zarządzane narażonych jako typy niezarządzanego.

Eksportowanie ciągi znaków o stałej długości do niezarządzanego kodu

W języku Visual Basic 6.0 i wersjach wcześniejszych ciągi są eksportowane do obiektów COM jako sekwencji bajtów bez znaku null zakończenie.Dla zachowania zgodności z innych języków Visual Basic 2005 zawiera znak zakończenie podczas eksportowania ciągi.Najlepszym sposobem rozwiązania tej niezgodności jest wyeksportowanie ciągi znaków, których brakuje znaku zakończenie jako tablice Byte lub Char.

Eksportowanie hierarchii dziedziczenia

Zarządzane hierarchie Spłaszcz out, gdy jako obiekty COM klasy.Na przykład jeśli zdefiniowanie klasy podstawowej z członkiem, a następnie dziedziczą z klasy bazowej w klasie pochodnej, która jest ujawniona jako obiekt COM, klienci, którzy używają pochodna klasy obiektu modelu COM nie będzie mógł korzystać z dziedziczonych członków.Członkowie klasy podstawowej jest możliwy z obiektami COM tylko jako wystąpień klasy bazowej, a następnie tylko wtedy, gdy klasa bazowa również jest tworzona jako obiekt COM.

Metody przeciążane

Chociaż można tworzyć przeciążenia metody z Visual Basic, nie są obsługiwane przez model COM.Jeśli klasa zawierająca metody przeciążane jest ujawniona jako obiekt COM, dla metody przeciążane generowane są nowe nazwy metody.

Rozważmy na przykład klasa, która ma dwa przeciążenia Synch metody.Gdy klasa jest ujawniona jako obiekt COM, nowe nazwy generowanych metodą może być Synch i Synch_2.

Zmiana nazwy może być przyczyną problemów z dwóch konsumentów obiektu COM.

  1. Klienci nie może oczekiwać nazw wygenerowanej metody.

  2. Nazwy generowane metoda w klasie narażonych jako obiekt COM można zmienić, gdy nowe overloads są dodawane do klasy lub jej klasy podstawowej.Może to spowodować problemy przechowywania wersji.

Do obu problemów, należy nadać każdej metody unikatową nazwę, zamiast korzystać z przeciążenia podczas tworzenia obiektów, które będą dostępne jako obiekty COM.

Użycie obiektów COM za pośrednictwem zestawy międzyoperacyjne

Zestawy międzyoperacyjne za pomocą prawie tak, jakby znajdowały się one kodu zarządzanego zastępujące obiektów COM, który reprezentują.Jednakże ponieważ są one otoki, a nie rzeczywiste obiekty COM, istnieją pewne różnice między używaniem zestawy międzyoperacyjne i standardowych zestawów.Różnica na tych obszarach obejmują narażenie klasy i typy danych dla parametrów i zwracanych wartości.

Klasy jako obu interfejsach i klasy

W przeciwieństwie do klas w standardowych zestawach klas COM są narażone w zestawy międzyoperacyjne jako interfejs i klasy, która reprezentuje klasę COM.Nazwa interfejsu jest identyczna z klasy COM.Nazwa klasy współdziałania jest taki sam jak oryginalny klasy COM, ale ze słowem "Klasa" dołączane.Na przykład załóżmy, że masz projektu w odniesieniu do zestawu międzyoperacyjnego, dla obiektu COM.Jeśli klasy COM o nazwie MyComClass, IntelliSense, jak i przeglądarka obiektów Pokaż interfejsu o nazwie MyComClass i klasę o nazwie MyComClassClass.

Tworzenie wystąpienia.NET Framework, klasa

Ogólnie, można utworzyć wystąpienia .NET Framework klasy za pomocą New instrukcji z nazwą klasy.Posiadanie klasy COM, reprezentowane przez zestawu międzyoperacyjnego jest jeden przypadek, w którym można użyć New instrukcji przy użyciu interfejsu.O ile nie są przy użyciu klasy COM z Inherits instrukcji, tak samo jak klasy, można użyć interfejsu.Poniższy kod ilustruje sposób tworzenia Command obiektu w programie project, które zawiera odwołanie do obiektu Microsoft ActiveX danych obiektów 2.8 biblioteki COM:

Dim cmd As New ADODB.Command

Jednak używasz klasy COM jako podstawy dla klasy pochodnej, należy użyć klasy współdziałania, która reprezentuje klasę COM, jak w poniższym kodzie:

Class DerivedCommand
    Inherits ADODB.CommandClass
End Class

[!UWAGA]

Zestawy międzyoperacyjne niejawnie implementuje interfejsy, które reprezentują klas COM.Nie należy próbować używać Implements spowoduje instrukcji do realizacji tych interfejsów lub błąd.

Typy danych dla parametrów i zwracanych wartości

W odróżnieniu od członków zespołów standardowe zestawu międzyoperacyjnego członkowie mogą mieć typy danych, które różnią się od tych używanych w pierwotnym zgłoszeniu obiektu.Chociaż zestawy międzyoperacyjne niejawnie przekonwertować typu COM zgodne popularne typy środowiska wykonawczego języka, powinny zwrócić uwagę na typy danych, które są używane przez obie strony, aby zapobiec błędy czasu wykonania.Na przykład w przypadku obiektów COM, utworzone w programie Visual Basic 6.0 i wersjach wcześniejszych, wartości typu Integer zakładać .NET Framework równoważnego rodzaju Short.Zaleca się, używając przeglądarki obiektów do zbadania właściwości importowane członków przed ich użyciem.

Moduł metody na poziomie modelu COM

Większość obiektów COM są używane przez utworzenie wystąpienia klasy COM za pomocą New słowa kluczowego, a następnie wywołując metody obiektu.Jedynym wyjątkiem od tej reguły obejmuje obiekty COM, które zawierają AppObj lub GlobalMultiUse klasy COM.Takie klas przypominają moduł metody poziomu w Visual Basic 2005 klasy.Program Visual Basic 6.0 i starsze wersje niejawnie tworzy wystąpienia takich obiektów w przypadku wywołania jednej z metod ich po raz pierwszy.Na przykład w języku Visual Basic 6.0 można dodać odwołanie do biblioteki obiektów Microsoft DAO 3.6 i wywołanie DBEngine metody bez tworzenia wystąpienia:

Dim db As DAO.Database
' Open the database.
Set db = DBEngine.OpenDatabase("C:\nwind.mdb")
' Use the database object.

Visual Basic 2005wymaga tworzenia wystąpień obiektów COM przed użyciem ich metod.Aby użyć tych metod w Visual Basic 2005, zadeklarować zmienną żądanej klasy i przypisywać obiekt do zmiennej obiektu za pomocą nowego słowa kluczowego.Shared Słów kluczowych można używać, gdy chcesz upewnić się, że tylko jedno wystąpienie tej klasy jest tworzony.

' Class level variable. 
Shared DBEngine As New DAO.DBEngine

Sub DAOOpenRecordset()
    Dim db As DAO.Database
    Dim rst As DAO.Recordset
    Dim fld As DAO.Field
    ' Open the database.
    db = DBEngine.OpenDatabase("C:\nwind.mdb")

    ' Open the Recordset.
    rst = db.OpenRecordset(
        "SELECT * FROM Customers WHERE Region = 'WA'",
        DAO.RecordsetTypeEnum.dbOpenForwardOnly,
        DAO.RecordsetOptionEnum.dbReadOnly)
    ' Print the values for the fields in the debug window. 
    For Each fld In rst.Fields
        Debug.WriteLine(fld.Value.ToString & ";")
    Next
    Debug.WriteLine("")
    ' Close the Recordset.
    rst.Close()
End Sub

Nieobsługiwane błędy w procedurach obsługi zdarzeń

Jeden typowy problem międzyoperacyjne pociąga za sobą błędy w procedurach obsługi zdarzeń, które obsługują zdarzenia wywoływane przez obiekty COM.Błędy takie są ignorowane, chyba że wyraźnie sprawdzić błędy za pomocą On Error lub Try...Catch...Finally instrukcji.Na przykład, poniższy przykład pochodzi z Visual Basic 2005 projekt, który zawiera odwołanie do obiektu Microsoft ActiveX danych obiektów 2.8 biblioteki COM.

' To use this example, add a reference to the  
'     Microsoft ActiveX Data Objects 2.8 Library   
' from the COM tab of the project references page. 
Dim WithEvents cn As New ADODB.Connection
Sub ADODBConnect()
    cn.ConnectionString =
    "Provider=Microsoft.Jet.OLEDB.4.0;" &
    "Data Source=C:\NWIND.MDB"
    cn.Open()
    MsgBox(cn.ConnectionString)
End Sub 

Private Sub Form1_Load(ByVal sender As System.Object,
    ByVal e As System.EventArgs) Handles MyBase.Load

    ADODBConnect()
End Sub 

Private Sub cn_ConnectComplete(
    ByVal pError As ADODB.Error,
    ByRef adStatus As ADODB.EventStatusEnum,
    ByVal pConnection As ADODB.Connection) Handles cn.ConnectComplete

    '  This is the event handler for the cn_ConnectComplete event raised  
    '  by the ADODB.Connection object when a database is opened. 
    Dim x As Integer = 6
    Dim y As Integer = 0
    Try
        x = CInt(x / y) ' Attempt to divide by zero.
        ' This procedure would fail silently without exception handling. 
    Catch ex As Exception
        MsgBox("There was an error: " & ex.Message)
    End Try 
End Sub

W tym przykładzie zgłasza błąd, zgodnie z oczekiwaniami.Jednakże jeśli spróbuj tego samego przykładu, bez Try...Catch...Finally blok, błąd jest ignorowana, jak w przypadku korzystania OnError Resume Next instrukcji.Bez obsługi błędów po cichu zawiedzie dzielenie przez zero.Ponieważ błędy takie nie wzbudzi nieobsłużony wyjątek błędy, ważne jest używanie jakiejś formy obsługi wyjątków w programy obsługi zdarzeń, które obsługi zdarzeń obiektów COM.

Opis błędów międzyoperacyjne COM

Bez błędu wywołania obsługi, współdziałania często generować błędy, które zapewniają niewiele informacji.W każdym przypadku, gdy jest to możliwe, należy użyć strukturalnej obsługi zapewnienie dodatkowych informacji o problemach, kiedy występują one błędów.Może to być szczególnie przydatne podczas debugowania aplikacji.Na przykład:

Try 
    ' Place call to COM object here. 
Catch ex As Exception
    ' Display information about the failed call. 
End Try

Informacje, takie jak opis błędu HRESULT i źródła błędów w modelu COM można znaleźć, przeglądając zawartość obiektu wyjątek.

Kwestie formantu ActiveX

Większość formantów ActiveX, które działają z programu Visual Basic 6.0, pracować z Visual Basic 2005 bez problemów.Główne wyjątki są formanty kontenera lub formanty, które wizualnie zawierają inne formanty.Niektóre przykłady starszych formanty, które nie działają poprawnie z Visual Studio są w następujący sposób:

  • Formant Microsoft formularzy 2.0 ramki

  • Formantu góra-dół, znany również jako formantu pokrętła

  • Formant karty Sheridan

Istnieje tylko kilka obejścia problemów formantu ActiveX nieobsługiwany.Można migrować istniejące formanty do Visual Studio Jeśli właścicielem oryginalnego kodu źródłowego.W przeciwnym razie można skontaktować się z dostawcami oprogramowania dla aktualizacji.NET zgodnych wersjach formantów, aby zastąpić nieobsługiwane formanty ActiveX.

Przekazywanie właściwości ReadOnly ByRef formantów

Visual Basic 2005Czasami podnosi błędy COM, takie jak "CTL_E_SETNOTSUPPORTED 0x800A017F błąd", po przesunięciu ReadOnly właściwości niektórych starszych formantów ActiveX jako ByRef parametry dla innych procedur.Podobne wywołania procedury programu Visual Basic 6.0 nie zgłaszają błąd i parametry są traktowane tak, jakby został przekazany przez wartość.Komunikat o błędzie, zobacz w Visual Basic 2005 jest obiektem COM, sprawozdawczości, że próbujesz zmienić właściwość, która nie ma właściwości Set procedury.

Jeśli masz dostęp do wywoływanej procedury, można zapobiec wystąpieniu błędu za pomocą ByVal słowo kluczowe, aby deklarować parametrów, które akceptują ReadOnly właściwości.Na przykład:

Sub ProcessParams(ByVal c As Object)
    'Use the arguments here. 
End Sub

Jeśli nie masz dostępu do kodu źródłowego wywoływanej procedury, można wymusić właściwości, które mają być przekazywane przez wartość dodając dodatkowy zestaw nawiasy wokół wywołanie procedury.Na przykład w programie project zawiera odwołanie do obiektu Microsoft ActiveX danych obiektów 2.8 biblioteki COM, można:

Sub PassByVal(ByVal pError As ADODB.Error)
    ' The extra set of parentheses around the arguments 
    ' forces them to be passed by value.
    ProcessParams((pError.Description))
End Sub

Wdrażanie zestawów, które udostępniają Interop

Wdrażanie zestawów, które udostępniają interfejsów COM przedstawia niektóre unikatowe wyzwania.Na przykład potencjalny problem występuje podczas tego samego zestawu COM odwołać się za odrębne wnioski.Sytuacja ta jest wspólne, gdy zainstalowana jest nowa wersja zestawu i inna aplikacja nadal używa starych wersji zestawu.Odinstalowanie zestawu udostępnia bibliotekę DLL, użytkownik może przypadkowo był niedostępny dla innych zestawów.

Aby uniknąć tego problemu, należy zainstalować zestawy współużytkowane do globalnej pamięci podręcznej zestawu (GAC) i użyć MergeModule dla składnika.Jeśli w pamięci podręcznej GAC nie można zainstalować tę aplikację, należy zainstalować na CommonFilesFolder w podkatalogu określonej wersji.

Zespoły, które nie są udostępnione powinien znajdować się obok siebie w katalogu z aplikacji wywołującej.

Zobacz też

Zadania

Wskazówki: wdrażanie dziedziczenia z obiektami COM (Visual Basic)

Informacje

MarshalAsAttribute

Tlbimp.exe (Importer biblioteki typów)

Tlbexp.exe (Eksporter biblioteki typów)

Inherits — Instrukcja

Koncepcje

Global Assembly Cache

Inne zasoby

COM Interop (Visual Basic)