Aracılığıyla paylaş


Birlikte Çalışabilirlik İle İlgili Sorun Giderme (Visual Basic)

Ne zaman, birlikte com, yönetilen kod arasında .NET Framework, bir veya daha aşağıdaki yaygın sorunların çoğunu karşılaşabilirsiniz.

Birlikte çalışabilirlik sıralaması

Zaman zaman olmayan veri türlerini kullanmak zorunda kalabilirsiniz parçası .NET Framework.Birlikte çalışma derlemeleri com nesneleri için işin çoğunu işlemek, ancak com'a yönetilen nesnelerle kullanılan veri türlerini denetlemek zorunda kalabilirsinizÖrneğin, sınıf kitaplıkları yapılarını belirtmelisiniz BStr yönetilmeyen tür Visual Basic 6.0 ve önceki sürümleri tarafından oluşturulan com nesneleri için gönderilen dizeler.Bu gibi durumlarda kullanabileceğiniz MarshalAsAttribute neden yönetilmeyen türler olarak gösterilmesine izin yönetilen türler öznitelik.

Sabit uzunluklu dizeler yönetilmeyen kod verme

Visual Basic 6.0 ve önceki sürümleri, dize null sonlandırma karakteri olmadan bir bayt dizisi olarak com nesneleri için verilir.Diğer diller ile uyumluluk için Visual Basic 2005 dizeleri verilirken bir sonlandırma karakteri içerir.Bu uyumsuzluk gidermenin en iyi yolu sonlandırma karakter dizileri yetersiz olduğu dizeler vermektir Byte veya Char.

Devralma hiyerarşisi dışa aktarma

Yönetilen sınıf hiyerarşileri com nesneleri kullanıma zaman Düzleştir öğrenin.Örneğin, bir temel sınıf üyesi ile tanımlamak ve bir com nesnesi olarak sergilenen türetilmiş bir sınıfta temel sınıf devralır, türetilmiş bir sınıf com nesnesinde kullanan istemciler devralınan üyeleri kullanabilmek için olmayacak.Temel sınıf üyesi erişilebilir com nesneleri yalnızca temel bir sınıfın örneği ve yalnızca temel sınıf bir com nesnesi olarak da oluşturulursa.

Aşırı yüklenmiş yöntemler

Aşırı yüklenmiş yöntemler ile oluşturabileceğiniz rağmen Visual Basic, COM tarafından desteklenmezFazla yüklenmiş yöntemleri içeren bir sınıf bir com nesnesi olarak kullanıma sunulan yeni yöntem adları aşırı yüklenmiş yöntemler için oluşturulur.

Örneğin, sahip iki aşırı yükleme, bir sınıfın düşünün Synch yöntemi.Sınıfı, bir com nesnesi olarak açıktır, yeni oluşturulan yöntem adlarý olabilir Synch ve Synch_2.

Yeniden adlandırma, com nesnesinin Tüketiciler için iki sorunlara neden olabilir.

  1. İstemciler üretilen yöntem adları bekleyebilirsiniz değil.

  2. Yeni aşırı sınıfı veya onun temel sınıfı eklendiğinde bir com nesnesi olarak sergilenen sınıfında üretilen yöntem adlarını değiştirebilirsiniz.Bu sürüm sorunlara neden olabilir.

Her iki sorunları çözmek için her yöntemi aşırı com nesneleri olarak sergilenen nesneleri geliştirirken kullanmak yerine, benzersiz bir ad verin.

Birlikte çalışılabilirlik montajları ile com nesnelerinin kullanımını

Temsil ettikleri com nesnelerinin yönetimli kod donanımlarının neredeyse oldukları gibi birlikte çalışma derlemeleri kullanın.Ancak, hazırlanın ve gerçek com nesneleri olduklarından, birlikte çalışma derlemeleri ve standart derlemeler kullanan arasında bazı farklar vardır.Bu farkı alanlarının Pozlama sınıflarının ve parametreleri ve dönüş değerleri için veri türleri içerir.

İki arabirim sergilenen sınıfları ve sınıfları

Standart derleme sınıflarda farklı olarak, com sınıfları bir arabirim ve com sınıfını temsil eden bir sınıf olarak birlikte çalışma derlemeleri maruz kalır.Arabirimin adı, com sınıfı aynıdır.Birlikte çalışabilirlik sınıfın adını özgün com sınıfının aynıdır, ancak "Sınıf" sözcüğü ile eklenir.Örneğin, bir com nesnesinin bir birlikte çalışma derlemesi için başvuru içeren bir proje olduğunu varsayalım.com sınıfı adlı, MyComClass, IntelliSense ve nesne tarayıcısı adlı bir arabirim göster MyComClass ve adında bir sınıfı MyComClassClass.

Örneklerini oluşturma bir.net Framework sınıfı

Genellikle, bir kopyasını oluşturmak bir .NET Framework kullanarak sınıf New ifadesi ile sınıf adı.Bir birlikte çalışma derlemesi tarafından temsil edilen bir com sınıfının sahip olduğu kullandığınız durumda New ifadesi ile bir arabirim.com sınıfıyla kullanmıyorsanız bir Inherits deyimi, bir sınıf gibi arabirimini kullanabilirsiniz.Aşağıdaki kodu nasıl oluşturulacağını gösterir bir Command nesnesi Microsoft ActiveX Veri Nesneleri 2.8 kitaplığı com nesnesine bir başvuru içeren bir projede:

Dim cmd As New ADODB.Command

Ancak, com Sınıf türetilmiş bir sınıf için temel olarak kullanıyorsanız, aşağıdaki kodda olduğu gibi com sınıfını temsil eder birlikte çalışabilirlik sınıf kullanmanız gerekir:

Class DerivedCommand
    Inherits ADODB.CommandClass
End Class

[!NOT]

Birlikte çalışma derlemeleri arabirimleri, com sınıfları temsil eden dolaylı olarak uygulamak.Kullanılacak denememelisiniz Implements neden bu arabirimler ya da hata uygulamak için deyimi.

Parametreleri ve dönüş değerleri için veri türleri

Standart derlemeler üyelerini, birlikte çalışma derlemesini üyeler özgün nesne bildiriminde kullanılanlardan farklı veri türleri olabilir.Birlikte çalışma derlemeleri com türleri uyumlu ortak dil çalışma zamanı türlerine örtük olarak dönüştürmek, ancak her iki çalışma zamanı hataları önlemek için kullanılan veri türleri için dikkat.Örneğin, Visual Basic 6.0 ve önceki sürümlerinde, türünün değerlerini oluşturulan com nesneleri, Integer kabul .NET Framework eşdeğer türü Short.Bunları kullanmadan önce alınan üye özelliklerini incelemek için Nesne Tarayıcısı'ı kullanmanız önerilir.

Modül Düzeyi com yöntemleri

Çoğu com nesneleri kullanarak bir com sınıfının bir örneğini oluşturarak kullanılır New anahtar sözcüğünü ve nesnenin yöntemleri çağırmak.Bu kuralın tek istisnası içeren com nesneleri içerir AppObj veya GlobalMultiUse com sınıfları.Bu tür sınıf modülü düzey yöntemleri benzer Visual Basic 2005 sınıfları.Örtülü olarak Visual Basic 6.0 ve önceki sürümleri gibi nesnelerinin örneklerini sizin için kendi yöntemlerini çağıran ilk kez oluşturun.Örneğin, Visual Basic 6.0 ile çağrı ve Microsoft dao 3.6 Nesne Kitaplığı'na bir başvuru ekleyin DBEngine olmadan ilk örneğini oluşturma yöntemi:

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

Visual Basic 2005kendi yöntemlerini kullanmadan önce her zaman com nesnelerinin örneğini oluşturmanız gerekir.Bu yöntemi kullanmak için Visual Basic 2005, istenen sınıfının bir deðiþken bildirip new anahtar sözcüðünü nesne nesne değişkenine atamak için kullanın.Shared Anahtar sözcüğünü kullanılabilir olmasını istediğinizde bu sınıf yalnızca bir örneği oluşturulur.

' 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

Olay işleyicilerini işlenmeyen hatalar

Ortak bir birlikte çalışabilirlik sorunu com nesneleri tarafından harekete geçirilen olayları ele olay işleyicileri hataları kapsar.Özellikle kullanarak hatalara karşı denetleyin Bu tür hatalar yoksayılır On Error veya Try...Catch...Finally deyimleri.Örneğin, aşağıdaki örnek geldiği bir Visual Basic 2005 Microsoft ActiveX Veri Nesneleri 2.8 kitaplığı com nesnesine bir başvuru olduğu proje.

' 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

Bu örnek, beklendiği gibi bir hata yükseltir.Ancak, aynı örnek olmadan çalışırsanız Try...Catch...Finally gibi kullandıysanız bloğu, hatayı göz ardı OnError Resume Next ifadesi.Hata işleme olmazsa, sıfıra bölme sessizce başarısız olur.Bu tür hatalar hiç işlenmemiş özel durum hataları yükseltmek için com nesnelerinden olayları ele olay işleyicilerini işleme özel çeşit kullanmak önemlidir.

com birlikte çalışabilirlik hatalarını anlama

Hatasız posta, birlikte çalışabilirlik aramalar genellikle çok az bilgi sağlayan hatalara neden.Mümkün olduğunda oluşabilecek sorunlar hakkında daha fazla bilgi sağlamak üzere yapılandırılmış hata kullanın.Uygulamaları ayıklarken bu özellikle yararlı olabilir.Örne?in:

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

Özel durum nesnesi içeriğini inceleyerek hata açıklaması, hresult ve com hatalarının kaynağını gibi bilgileri bulabilirsiniz.

ActiveX denetimi sorunları

Visual Basic 6.0 ile çalışan ActiveX denetimlerinin çoğu çalışmak Visual Basic 2005 sorun olmadan.Ana konteyner denetimleri veya görsel olarak diğer denetimleri içeren denetimler oluşturduğunu.Bazı örnekler ile düzgün çalışmıyor eski denetimlerin Visual Studio aşağıdaki gibidir:

  • Microsoft Forms 2.0 çerçeve denetimi

  • Artırma-azaltma denetiminin, döndürme denetimi olarak da bilinir

  • Sheridan sekme denetimi

Yalnızca birkaç geçici çözüm desteklenmeyen ActiveX denetimi sorunları vardır.Varolan denetimleri geçirebilirsiniz Visual Studio özgün kaynak kodunuzda sahibiyseniz.Aksi durumda, güncelleştirilmiş yazılım satıcıları ile denetleyebilirsiniz.Denetimleri değiştirmek için net uyumlu sürümleri ActiveX denetimleri desteklenmez.

Geçirme ReadOnly özelliklerini denetimlerin ByRef

Visual Basic 2005geçirdiğinizde, bazen com hatası "Hata 0x800A017F ctl_e_setnotsupported" gibi yayınlar ReadOnly eski bazı ActiveX denetimlerinin özelliklerini ByRef diğer yordamları parametreleri.Visual Basic 6.0 benzer yordam çağrılarının hataya yükseltmeyin ve parametre değeri tarafından geçirilen gibi kabul edilir.' De gördüğünüz hata iletisinin Visual Basic 2005 bir özelliği olmayan bir özelliği değiştirmeye çalıştığınız bildirdiği com nesnesi Set yordam.

Çağrılan yordam erişiminiz varsa kullanarak bu hatayı önleyebilirsiniz ByVal kabul Parametreler bildirmek için anahtar sözcük ReadOnly özellikleri.Örne?in:

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

Çağrılan yordam için kaynak koduna erişim hakkınız yok, özellik değerine göre GetTypeId yordamını parantezler fazladan bir kümesini ekleyerek iletilmek üzere zorlayabilirsiniz.Örneğin, Microsoft ActiveX Veri Nesneleri 2.8 kitaplığı com nesnesine bir başvuru olduğu bir projede, kullanabilirsiniz:

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

Açığa çıkaran Interop Assemblies dağıtma

com arabirimleri açığa çıkaran derlemeler dağıtma benzersiz zorluklara sunar.Örneğin, farklı uygulamaları aynı com derleme başvuru yaptığınızda olası bir sorun oluşur.Bu durum, bir derleme yeni bir sürümünün yüklü olduğunu ve başka bir uygulamanın derleme'nın eski sürümünü kullanmaya devam yaygındır.dll paylaşan bir derleme kaldırırsanız, farkında olmadan kullanılamayan diğer derlemeler için katılırsınız.

Bu sorunu önlemek için paylaşılan birleştirmeler Genel Derleme Önbelleği (gac) için yüklemek ve bir MergeModule bileşeni için kullanın.Uygulama GAC'ye yükleyemezse, sürüme özgü alt dizininde CommonFilesFolder için yüklenmelidir.

Çağıran uygulama ile dizine değil paylaşılan birleştirmeleri yan yana yer almalıdır.

Ayrıca bkz.

Görevler

İzlenecek yol: COM Nesnelerinde Kalıtım Uygulama (Visual Basic)

Başvuru

MarshalAsAttribute

Tlbimp.exe (Tür Kitaplığı İçeri Aktarıcı)

Tlbexp.exe (Tür Kitaplığı Dışarı Aktarıcı)

Inherits Deyimi

Kavramlar

Genel Derleme Önbelleği

Diğer Kaynaklar

COM Birlikte Çalışma (Visual Basic)