Cześć, chcę wywołać z poziomu C++ metodę z C#. Nie chcę używać do tego CLI. Wyczytałem, że mogę to zrobić, używając COM. Nawet wyczytałem jak to zrobić.
Po stronie C# mam:
[Guid("D0537186-304B-45A0-BB1A-F5A7EE65AE46")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IImageConverter
{
[DispId(1)]
void TestM();
}
[Guid("C0C473F5-08FA-4BD1-A5AE-5ACD3D3AF557")]
[ClassInterface(ClassInterfaceType.None)]
public class ImageConverter : IImageConverter
{
public ImageConverter()
{
}
public void TestM()
{
}
}
I w C# mam pozaznaczane, żeby rejestrował COM i, że assembly jest com visible. Tworzy się DLL, tworzy się plik tlb. Importuję plik tlb (#import) w C++. Automatycznie tworzy się plik tlh.
I do tego momentu wszystko jest zgodnie z oczekiwaniami. Dalej dzieje się coś, czego nie mogę ogarnąć. Mam taki kod:
CoInitialize(NULL);
//tworzę smart pointera, IImageConverterPtr jest zadeklarowany w pliku tlh:
//_COM_SMARTPTR_TYPEDEF(IImageConverter, __uuidof(IImageConverter));
IImageConverterPtr pIConv(__uuidof(ImageConverter));
pIConv->TestM();
CoUninitialize();
Wydaje się, że to powinno działać. Ale. C++ nie widzi metody TestM(). Dopiero, jeśli zrobić coś takiego:
IImageConverter * p = pIConv;
p.TestM();
To widzi, ale wywala błąd: "left of .TestM must have class/struct...
W żaden sposób nie mogę dobrać się do metod interfejsu. O co tu chodzi?
Nie chcę używać ani ATL, ani CLI.