Ho sentito dire che Nullable<T>
è una classe generica C# e non funziona con COM, come qualsiasi altra classe generica.In che modo un marshall del server COM annulla la libreria di classi C# con le diverse enumerazioni di ComInterfaceType?
Ebbene, nella mia libreria di classi C che ho:
[InterfaceType(ComInterfaceType.InterfaceIsDual),
Guid("2FCEF713-CD2E-4ACB-A9CE-E57E7F51E72E")]
public interface ICOMClass
{
int? GetNullable();
}
[ClassInterface(ClassInterfaceType.None)]
[Guid("57BBEC44-C6E6-4E14-989A-B6DB7CF6FBEB")]
public class COMClass : ICOMClass
{
public int? GetNullable()
{
int? hello = null;
return hello;
}
}
Sorprendentemente che compila e io sono in grado di collegare i riferimenti alla mia biblioteca COMClass
in VBE.
so che:
- VBA fa non lista
.GetNullable()
nella lista dei membri sul Visualizzatore oggetti (anche con Mostra membri nascosti segno di spunta) - VBA fa non lista
.GetNullable()
in l'intelli-sense discesa
ma perché:
Dim c as new COMClass
c.GetNullable
fa non gettare un piuttosto atteso Object doesn't support this property or method
?
in contrapposizione a:
c.NonExistingMethod
Qualcuno può spiegare perché?
Sono sospetto che ha qualcosa a che fare con ComInterfaceType
Enumeration perché
- entrambi:
InterfaceIsDual
&InterfaceIsIDispatch
atto proprio come ho descritto sopra
ma:
InterfaceIsIUnknown
realtà non sembra maresciallo/tocco ilGetNullable()
e l'errore previsto è gettato ...
Qualcuno può spiegare questo comportamento?
Guarda questo articolo http://www.codeproject.com/Articles/66244/Marshaling-with-C-Chapter-Marshaling-Simple-Type e fai una ricerca su '[Working with Nullable Arguments]' quando sono sulla pagina che spiegherà più in dettaglio .. – MethodMan
@DJKRAZE grazie mille per il link però non ho trovato una spiegazione alla mia domanda: perché VBA consente una chiamata a un metodo che in realtà non è visibile da nessuna parte su la libreria COM? Sono lo sviluppatore di quella libreria quindi so che esiste e ho scoperto che VBA mi permette di chiamare 'c.GetNullable()' - sto solo chiedendo perché? Perché non è completamente nascosto ecc? –
Quando si visualizza la libreria in Visualizzazione OLE, c'è qualche indicazione che il .tlb/.dll/qualunque sia nascosto nell'IDL di GetNullable? – Mike