2016-04-04 1 views
0

Comme par MSDN, en ce qui concerne la conversion des types effectuées par le RCW entre le client .Net aux objets non gérés, il est écrit:RCW ne convertit pas entier lors du passage de .Net à COM

... Autre les types ne nécessitent aucune conversion. Par exemple, un encapsuleur standard transmettra toujours un entier de 4 octets entre le code managé et non managé sans convertir le type.

AFAIK,

  • Int32 (type Net) représente un entier signé 32 bits.
  • entier
  • (VBA) représente un 16 bits signé

Donc, si un Int32 est passé comme paramètre d'un .Net à une méthode VBA et aucune conversion est effectuée par le RCW alors comment le paramètre est passé?

Répondre

1

L'important est de savoir comment la conversion est définie entre les deux mondes (non géré et géré) dans le code natif ou managé. Si la conversion est définie à l'aide d'une bibliothèque de types COM/Automation (dans DLL ou TLB par exemple), elle sera automatiquement déclarée comme type correspondant, en particulier pour les types très connus tels que le type entier non signé 16 bits .

Ainsi, un type VBA 16 bits sera déclaré comme équivalent (s'il s'agit d'un type standard bien connu) .NET 16 octets. Par exemple, VBA integer sera déclaré en tant que Int16 .NET (comme le mot-clé short en C#). Si la conversion est définie manuellement, par exemple en utilisant .NET interface avec des annotations COM, il incombe au développeur de s'assurer que la déclaration est cohérente pour les deux côtés (ou que des problèmes/bugs/crashs peuvent survenir).

Je suggère deux liens dans le document officiel à ce sujet: Default Marshaling Behavior et Blittable and Non-Blittable Types pour déterminer ce qui peut être considéré comme des types standard ou bien connus.

+0

Merci @Simon Mourier pour l'explication. Si je vous comprends bien, c'est la responsabilité du programmeur de passer en paramètre un Int16 à une méthode VBA pour un entier? – ehh

+0

Cela dépend de la façon dont vous définissez la méthode d'interface, mais si c'est fait manuellement, alors oui, comme ce qui est fait dans cette question sur SO: http://stackoverflow.com/questions/25134560/import-c-dll-in-c -sharp-how-to-convert-short-type (bien que ce ne soit pas COM c'est la même idée) –

+0

Merci pour la clarification – ehh