Słyszałem, że Nullable<T>
jest klasą ogólną C# i nie działa z COM - jak każda inna klasa ogólna.Jak serwer marszałek COM nullable w bibliotece klasy C# z różnych wyliczeń ComInterfaceType?
Cóż, w moim C# biblioteki klas mam:
[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;
}
}
Zaskakująco że kompiluje i jestem w stanie dołączyć referencje do mojego COMClass
biblioteki w VBE.
wiem, że:
- VBA robi nie listy
.GetNullable()
na liście członków na Object Browser (nawet z Pokaż ukryte członkowie zaznaczone) - VBA robi nie listy
.GetNullable()
w Intelli-sense drop down:
ale dlaczego:
Dim c as new COMClass
c.GetNullable
ma nie rzucać raczej spodziewać Object doesn't support this property or method
?
w przeciwieństwie do:
c.NonExistingMethod
Może ktoś wyjaśnić, dlaczego?
jestem podejrzliwy, że ma coś wspólnego z ComInterfaceType
Enumeration ponieważ
- zarówno:
InterfaceIsDual
&InterfaceIsIDispatch
akcie jak opisałem powyżej
ALE:
InterfaceIsIUnknown
faktycznie nie wydaje się być marszałkiem/dotykowyGetNullable()
i spodziewany jest błąd ...
Może ktoś wyjaśnić to zachowanie?
Spójrz na ten artykuł http://www.codeproject.com/Articles/66244/Marshaling-with-C-Chapter-Marshaling-Simple-Type i nie szukaj na '[Praca z pustych Argumenty]' Kiedy są na stronie, która wyjaśni bardziej szczegółowo. – MethodMan
@DJKRAZE bardzo dziękuję za link, ale nie znalazłem wyjaśnienia na moje pytanie: dlaczego VBA pozwala na wywołanie metody, która w rzeczywistości nie jest widoczna nigdzie na biblioteka COM? Jestem programistą tej biblioteki, więc wiem, że istnieje i dowiedziałem się, że VBA pozwala mi wywoływać 'c.GetNullable()' - po prostu pytam dlaczego? Dlaczego nie jest całkowicie ukryty itp.? –
Kiedy przeglądasz bibliotekę w OLE View, czy jest jakaś wskazówka, że plik .tlb/.dll/cokolwiek ma GetNullable pochowany w IDL? – Mike