Odstraňování problémů Interoperability (Visual Basic)
Při spolupráci mezi COM a spravovaný kód .NET Framework, se může vyskytnout jeden nebo více z následujících častých problémů.
InterOp zařazování
Někdy může být použití datových typů, které nejsou součástí .NET Framework.Sestavení InterOp zpracovávat většinu práce pro objekty COM, ale máte řídit typy dat, které se používají v případě, že jsou vystaveny spravované objekty COM.Například nutné zadat struktury knihoven tříd BStr na odeslané COM objekty vytvořené pomocí jazyka Visual Basic 6.0 a starší verze řetězce typu nespravovaná.V takových případech můžete MarshalAsAttribute atribut způsobit spravovaných typů vystavena jako nespravovaných typů.
Export do nespravovaný kód pevné délky řetězce
V jazyce Visual Basic 6.0 a starších verzích jsou exportovány řetězce objektů COM jako bajtů bez znak null ukončení sekvence.Kompatibilita s jinými jazyky Visual Basic 2005 při exportu řetězce obsahuje znak ukončení.Nejlepší způsob, jak řešit tuto nekompatibilitu je exportovat řetězce, které neobsahují znak ukončení jako pole Byte nebo Char.
Export hierarchie dědičnosti
Spravované třídy hierarchie shrnout mimo při vystavení jako objekty COM.Například pokud definovat základní třídy s členem a poté zdědí základní třídy odvozené třídy, který se projevuje jako objekt modelu COM, klienti používají odvozené třídy objektu COM nebude moci používat zděděné členy.Základní třídy členů je přístupný z objektů COM pouze jako základní třídy, instance a pak pouze v případě, že základní třída také vytvořen jako objekt COM.
Přetížené metody
Přestože můžete vytvořit přetížení metody s Visual Basic, nejsou podporovány COM.Při vystavení obsahující přetížené metody třídy jako objektu COM, jsou generovány nové názvy metod pro přetížené metody.
Zvažte například třídy, která má dva přetížení z Synch metoda.Při vystavení třídy jako objektu COM, může být nové názvy generované metodu Synch a Synch_2.
Přejmenování může způsobit spotřebitelům objektu COM dva problémy.
Klienti očekávali není metoda vygenerované názvy.
Názvy generované metoda třídy vystavena jako objekt modelu COM lze změnit nové přetížení jsou přidány do třídy nebo základní třída.To může způsobit problémy s verzemi.
Oba problémy vyřešit, dejte každé metody jedinečný název, namísto použití přetížení při vývoji objekty, které budou vystaveny jako objekty COM.
Použití objektů COM prostřednictvím sestavení Interop
Můžete používat sestavení interop téměř, jako jsou objekty COM, které představují náhrady spravovaný kód.Protože jsou obaly a ne skutečné objekty COM, existují však některé rozdíly mezi použitím sestavení interop a standardní sestavení.Tyto oblasti rozdíl patří expozice tříd a datové typy pro parametry a vrácené hodnoty.
Vystavit jako obou rozhraní třídy a třídy
Na rozdíl od tříd v sestavení standardní třídy COM vystaveni v sestavení interop jako rozhraní a třídy, který představuje třídu COM.Název rozhraní je totožná s třídou COM.Název třídy interop je stejný jako původní třídy COM, ale slovo "Třída" připojena.Předpokládejme například, že máte projektu odkaz na sestavení interop modelu COM objektu.Pokud název třídy COM MyComClass, IntelliSense a Prohlížeč objektů zobrazit rozhraní s názvem MyComClass a třídu s názvem MyComClassClass.
Vytváření instancí.NET Framework, třída
Obecně se vytvořit instanci .NET Framework třídy pomocí New příkaz s názvem třídy.Třídy COM reprezentované sestavení vzájemné spolupráce je jeden případ, kdy lze použít New prohlášení s rozhraním.Pokud nepoužíváte třídy COM s Inherits prohlášení, stejně jako třídy, můžete použít rozhraní.Následující kód ukazuje, jak vytvořit Command v projektu, který obsahuje odkaz na objekt Microsoft ActiveX Data objekty 2.8 knihovny COM objektu:
Dim cmd As New ADODB.Command
Pokud používáte jako základní třídy COM pro odvozené třídy, však musí používat interop třídy, který představuje třídu COM, jako v následujícím kódu:
Class DerivedCommand
Inherits ADODB.CommandClass
End Class
[!POZNÁMKA]
Sestavení InterOp implicitně implementovat rozhraní, které představují třídy COM.Nebyla by měli použít Implements povede prohlášení k implementaci těchto rozhraní nebo došlo k chybě.
Datové typy pro parametry a vrácené hodnoty
Na rozdíl od členů standardní sestavení mohou mít členové sestavení interop datové typy, které se liší od původní objekt prohlášení.Ačkoli typy COM sestavení interop implicitně převést na kompatibilní typy společného jazykového modulu runtime, by měly věnovat pozornost typy dat, které používají obě strany chybách runtime.Například v COM objekty vytvořené v jazyce Visual Basic 6.0 a starších verzích, hodnoty typu Integer se předpokládá .NET Framework ekvivalentního typu Short.Je vhodné posoudit vlastnosti importované členů před jejich použitím pomocí prohlížeče objektů.
Modul COM úroveň metody
Vytvoření instance pomocí třídy COM používá většina objektů COM New klíčové slovo a potom voláním metody objektu.Jedinou výjimkou tohoto pravidla zahrnuje objekty COM, které obsahují AppObj nebo GlobalMultiUse třídy COM.Takové třídy připomínají modul úrovni metod v Visual Basic 2005 tříd.Visual Basic 6.0 a starší verze implicitně vytvořit instance těchto objektů při prvním volání metody.Například v jazyce Visual Basic 6.0 můžete přidat odkaz na knihovnu Microsoft DAO 3.6 Object a volání DBEngine metody bez první vytvoření instance:
Dim db As DAO.Database
' Open the database.
Set db = DBEngine.OpenDatabase("C:\nwind.mdb")
' Use the database object.
Visual Basic 2005vyžaduje před použitím metody vždy vytvoření instancí objektů COM.Pomocí těchto metod v Visual Basic 2005, deklarování proměnné požadované třídy a pomocí nové klíčové slovo přiřadit objekt objektové proměnné.Shared Klíčových slov lze použít, pokud chcete zajistit, je vytvořen pouze jednu instanci třídy.
' 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
Chyby neošetřené v obslužné rutiny událostí
Jeden běžný problém interop zahrnuje chyby v obslužné rutiny událostí, které zpracování událostí vyvolaných objekty COM.Tyto chyby budou ignorována konkrétně zkontrolovat chyby pomocí On Error nebo Try...Catch...Finally příkazy.Například následující příklad je z Visual Basic 2005 projekt, který obsahuje odkaz na objekt Microsoft ActiveX Data objekty 2.8 knihovny 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
Tento příklad vyvolá chybu podle očekávání.Však pokud stejný příklad bez Try...Catch...Finally bloku chyba ignorována, pokud OnError Resume Next prohlášení.Bez zpracování chyb dělení nulou tiše selže.Protože takové chyby nikdy vyvolávají chyby neošetřené výjimky, je důležité používat některé formuláře zpracování výjimek v obslužné rutiny událostí, které zpracovávají události z objektů COM.
Principy COM interop chyb
Bez chyby volání manipulace, interop často vygenerovat chyby, které poskytují pouze málo informací.Kdykoli je to možné, používejte strukturované zpracování poskytnout další informace o problémech při jejich výskytu chyb.To může být zvláště užitečné při ladění aplikací.Příklad:
Try
' Place call to COM object here.
Catch ex As Exception
' Display information about the failed call.
End Try
Informace jako popis chyby HRESULT a zdroj chyby COM získáte prohlédnutím obsahu objektu výjimku.
Problémy ovládací prvek ActiveX
Většina ovládacích prvků ActiveX, které pracují s Visual Basic 6.0 pracovat s Visual Basic 2005 bez potíží.Hlavní výjimky jsou ovládací prvky kontejneru nebo prvky, které vizuálně obsahují další ovládací prvky.Některé příklady starší ovládací prvky, které nepracují správně s Visual Studio jsou následující:
Ovládací prvek Microsoft Forms 2.0 rámeček
Ovládací prvek nahoru dolů, známé také jako číselník
Ovládací prvek karta Sheridan
Existuje pouze několik řešení pro nepodporované problémy ovládacího prvku ActiveX.Můžete přenést existující ovládací prvky na Visual Studio -li vlastníkem původního zdrojového kódu.Jinak můžete zkontrolovat s dodavateli softwaru aktualizovaná.NET kompatibilní verze ovládací prvky nahradit nepodporované ovládací prvky ActiveX.
Vlastnosti ReadOnly předávání ovládací prvky typu ByRef
Visual Basic 2005Při předání někdy vyvolává chyby COM jako "CTL_E_SETNOTSUPPORTED 0x800A017F chyba" ReadOnly vlastnosti některé starší ovládací prvky ActiveX jako ByRef parametry pro jiné postupy.Podobné volání procedur jazyka Visual Basic 6.0 není zvýšit chybu a parametry jsou zpracovány jako by předán podle hodnoty.Chybová zpráva, naleznete v Visual Basic 2005 je hlášení, že se pokoušíte změnit vlastnost, která nemá vlastnost objektu COM Set postup.
Pokud máte přístup k postupu volána, této chybě můžete zabránit pomocí ByVal klíčové parametry, které přijímají deklarovat ReadOnly vlastnosti.Příklad:
Sub ProcessParams(ByVal c As Object)
'Use the arguments here.
End Sub
Pokud nemáte přístup ke zdrojovému kódu volání procedury, můžete vynutit vlastnosti předání hodnotou přidáním zvláštní skupinu závorky kolem volání procedury.Například v projektu obsahuje odkaz na objekt Microsoft ActiveX Data objekty 2.8 knihovny COM můžete:
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
Zavedení sestavení, které zprostředkovávají Interop
Zavedení sestavení, které poskytují rozhraní COM představuje některé jedinečné výzvám.Potenciální problém například nastane, když samostatné aplikace odkazovat na stejné sestavení modelu COM.Tato situace je běžné při instalaci nové verze sestavení a stará verze sestavení stále používá jiná aplikace.Pokud odinstalovat sestavení, který sdílí knihovny DLL lze neúmyslně zablokovat jej na ostatních sestaveních.
Chcete-li se vyhnout tomuto problému, by instalace sdílená sestavení na Global Assembly Cache (GAC) a použití MergeModule pro komponentu.Pokud aplikaci nelze nainstalovat v mezipaměti GAC, je třeba nainstalovat do CommonFilesFolder v podadresáři specifické verze.
Sestavení, které nejsou sdíleny by umístěna vedle sebe v adresáři s volající aplikaci.
Viz také
Úkoly
Názorný postup: Provádění dědičnost s objekty COM (Visual Basic)
Referenční dokumentace
TLBIMP.exe (Importér knihovny)
Tlbexp.exe (Exportér knihovny)