2010-11-30 27 views
2

J'ai récemment terminé une classe que nous utilisons pour lier l'accès à certains services WCF. Bien sûr, cela signifie que les classes .Net (et toutes leurs propriétés) doivent être visibles par COM. Étant donné que j'utilise VB10 et que la classe Contact a environ 20 propriétés, j'ai utilisé les propriétés d'implémentation automatique. À ma grande surprise, les propriétés n'étaient pas accessibles depuis VBA dans Access. J'ai essayé de marquer les propriétés comme ComVisible (ce que je n'avais pas à faire dans le passé avec les propriétés standard) et cela ne fonctionnait toujours pas. Après avoir changé les propriétés automatiques en propriétés standard, tout a fonctionné.VB10, propriétés implémentées automatiquement et COM

Public Property FirstName As String 

Est devenu

Public Property FirstName As String 
    Get 
     return _strFirstName 
    End Get 
    Set 
     _strFirstName = value 
    End Set 
End Property 

Ma compréhension est que les deux devraient être équivalents. D'après ce que j'ai lu sur MSDN, les propriétés d'implémentation automatique prennent simplement soin de créer le backing field et le getter/setter pour vous et à toutes fins utiles, elles devraient être les mêmes. De toute évidence, ils ne le sont pas, alors quoi d'autre se passe dans les coulisses?

+0

Pour référence (parce qu'il m'a fallu 5 minutes pour trouver), voici l'article MSDN sur les auto-propriétés: http://msdn.microsoft.com/en-us/library/dd293589.aspx –

+0

Je déteste vraiment quand les gens fais ça. Je mentionne même dans mon article que j'ai lu l'article sur MSDN. Cet article est la raison pour laquelle je pose la question. Je suis très conscient du fait qu'il devrait y avoir aucune différence; Cependant, ce n'est pas ce que je veux voir dans une situation réelle dans le monde réel. – mlindegarde

+0

Je le sais. J'ai posté le lien afin que * d'autres * puissent s'y référer. Je suppose que je pourrais avoir édité dans le lien à votre poste. Désolé pour le malentendu. –

Répondre

2

Ils sont. Quelques exemples de code:

<ComVisible(True)> _ 
<ClassInterface(ClassInterfaceType.AutoDual)> _ 
Public Class Class1 
    Private prop As Boolean 
    Public Property BoolProp() As Boolean 
     Get 
      Return prop 
     End Get 
     Set(ByVal value As Boolean) 
      prop = value 
     End Set 
    End Property 

    Public Property BoolProp2() As Boolean 
End Class 

Avec commandes:

TlbExp ClassLibrary1.dll
OleView ClassLibrary2.tlb

génère ce vidage d'interface:

interface _Class1 : IDispatch { 
    [id(00000000), propget, 
     custom(54FC8F55-38DE-4703-9C4E-250351302B1C, 1)] 
    HRESULT ToString([out, retval] BSTR* pRetVal); 
    [id(0x60020001)] 
    HRESULT Equals(
        [in] VARIANT obj, 
        [out, retval] VARIANT_BOOL* pRetVal); 
    [id(0x60020002)] 
    HRESULT GetHashCode([out, retval] long* pRetVal); 
    [id(0x60020003)] 
    HRESULT GetType([out, retval] _Type** pRetVal); 
    [id(0x60020004), propget] 
    HRESULT BoolProp([out, retval] VARIANT_BOOL* pRetVal); 
    [id(0x60020004), propput] 
    HRESULT BoolProp([in] VARIANT_BOOL pRetVal); 
    [id(0x60020006), propget] 
    HRESULT BoolProp2([out, retval] VARIANT_BOOL* pRetVal); 
    [id(0x60020006), propput] 
    HRESULT BoolProp2([in] VARIANT_BOOL pRetVal); 
}; 

Il est là . Vous faites quelque chose de mal, aucune idée de quoi.

+0

Peut-être que les commandes que vous avez utilisées me manquent: "tlbexp ClassLibrary1.dll" et "oleview ClassLibrary2.tlb". Si j'utilise le code exact que vous avez posté ci-dessus (copier et coller) et que vous sélectionnez "Enregistrer pour COM interop" dans les paramètres de construction, BoolProp2 n'est pas visible depuis Access. – mlindegarde

+0

Annulez l'enregistrement de l'assembly avec Regasm.exe/u et vérifiez qu'il a disparu de Access. Pour vous assurer que vous n'avez pas choisi une ancienne version. –

+0

Très bien, je vais le faire. Je sais qu'il ne devrait y avoir aucune différence entre les deux et la décharge de l'interface semble le confirmer. Je vais accepter cela comme la réponse et supposer que j'ai foiré ailleurs. – mlindegarde