je l'interface suivante définie pour exposer une classe .NET à COM:Incohérence dans les objets passant de VBA vers .NET via COM
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
[Guid("6A983BCC-5C83-4b30-8400-690763939659")]
[ComVisible(true)]
public interface IComClass
{
object Value { get; set; }
object GetValue();
void SetValue(object value);
}
La mise en œuvre de cette interface est trivial:
[ClassInterface(ClassInterfaceType.None)]
[Guid("66D0490F-718A-4722-8425-606A6C999B82")]
[ComVisible(true)]
public class ComClass : IComClass
{
private object _value = 123.456;
public object Value
{
get
{
return this._value;
}
set
{
this._value = value;
}
}
public object GetValue()
{
return this._value;
}
public void SetValue(object value)
{
this._value = value;
}
}
J'ai ensuite enregistré cela en utilisant RegAsm, et a essayé de l'appeler à partir d'Excel via le code suivant:
Public Sub ComInterop()
Dim cc As ComClass
Set cc = New ComClass
cc.SetValue (555.555)
valueByGetter = cc.GetValue
valueByProperty = cc.Value
cc.Value = 555.555
End Sub
Lorsque je passe à travers ce code, valueByGetter = 555.5555 et valueByProperty = 555.555 comme prévu. Cependant, j'obtiens une erreur d'exécution "Objet requis" sur la dernière ligne.
Pourquoi le réglage de la valeur via la méthode de réglage fonctionne-t-il mais le paramétrage via la propriété échoue? Que dois-je changer pour que la propriété fonctionne comme prévu? Edit: J'ai eu quelques réponses utiles, donc ma question supplémentaire est "ce problème se posera-t-il avec les clients COM écrits dans d'autres langues, ou est-il spécifique à VBA?".
avez-vous essayé d'attacher le débogueur au processus d'Excel et d'intervenir et de voir exactement où il souffle? –
Vous ne savez pas quel débogueur vous voulez dire. Si je débogue le code .net via VS.Net en démarrant Excel en tant que programme externe, je ne parviens pas au point d'arrêt dans la partie set de la propriété Value, indiquant qu'il s'agit d'un problème d'Excel. Si vous voulez dire directement déboguer Excel, je ne sais pas par où commencer - pourriez-vous me donner plus d'infos? Merci. – Akash