Jest tylko jedna realizacja IDispatch za obiekt COM, więc jeśli chcesz zadzwonić, takich jak IDispatch::Invoke aby odnieść sukces, trzeba mieć DISPID unikalnych za obiekt COM.
EDYCJA: W rzeczywistości, po bardziej szczegółowym przemyśleniu, pytanie to jest zupełnie nieistotne, jak podkreśla Hans w swoim komentarzu. Ponieważ definiujesz ClassInterfaceType jako None, oznacza to, że .NET będzie tylko tworzył pierwszy interfejs IMyInterface1, który nadaje się do użytku (domyślnie, ale możesz skonfigurować domyślny interfejs przy użyciu atrybutu klasy ComDefaultInterfaceAttribute).
Jeśli użyjesz ClassInterfaceType jako AutoDual lub AutoDispatch, DISPID zostaną wygenerowane automatycznie, a zdefiniowane ręcznie nie będą używane.
.NET nie łączy ani nie łączy interfejsów, a fakt, że dyski są różne, nie ma zatem znaczenia w tym przypadku ".NET expected as COM", ponieważ używany jest tylko jeden zestaw identyfikatorów DISPID (dla domyślnego interfejsu). Uwaga: jeśli zdefiniuj dwa razy ten sam zestaw DISPIDów na tej samej klasie, będzie się on kompilował dobrze, ale regresja będzie narzekać i ignorować duplikaty.
Oto mały program w C++, który potwierdza to wszystko:
int _tmain(int argc, _TCHAR* argv[])
{
CoInitialize(NULL);
IDispatch *pDispatch;
CoCreateInstance(__uuidof(MyClass), NULL, CLSCTX_ALL, IID_IDispatch, (void**)&pDispatch);
DISPID dispid;
LPOLESTR name1 = L"Name1";
LPOLESTR name2 = L"Name2";
HRESULT hr;
hr = pDispatch->GetIDsOfNames(IID_NULL, &name1, 1, 0, &dispid);
printf("Name1:%i hr=0x%08X\n", dispid, hr);
hr = pDispatch->GetIDsOfNames(IID_NULL, &name2, 1, 0, &dispid);
printf("Name2:%i hr=0x%08X\n", dispid, hr);
pDispatch->Release();
CoUninitialize();
return 0;
}
Będzie wyjście to:
Name1:1 hr=0x00000000 (S_OK)
Name2:-1 hr=0x80020006 (DISP_E_UNKNOWNNAME)
to zmienić, aby AutoDispatch lub AutoDual, to będzie wyjście to (IDS są obliczane korzystaniu z niektórych algorytm):
Name1:1610743812 hr=0x00000000
Name2:1610743813 hr=0x00000000
Pierwszy wymieniony interfejs jest jedynym, który VB6 może zobaczyć po późnym wiązaniu. Będzie to interfejs oznaczony jako interfejs [Domyślny]. Więc nie jest to prawdziwy problem, ponieważ drugi interfejs i tak nie jest użyteczny. Chociaż to prawdopodobnie jest prawdziwy problem;) –