C++ i C# COM

0

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.

0

OK, doszedłem w końcu. Okazało się, że muszę usunąć z interfejsu w C#: [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]

Ale teraz jest kolejny problem. Przy konstruktorze:

 
IImageConverterPtr pIConv(__uuidof(ImageConverter));

dostaję błąd systemu: 127 - PROC_NOT_FOUND. Podejrzałem sobie tą DLLkę (tą C#) w dllExportViewer i lista jest zupełnie pusta. Tak jakby dll niczego nie eksportował. Ktoś coś może powiedzieć na ten temat?

0

OK, wyrzuciłem raw_interfaces_only z klauzuli #import i dodałem:
#import "mscorlib.tlb"

Błąd 127 nadal się pojawia, ale wszystko działa. Trochę to dziwne.

0

Co należy napisac w ogloszeniu o pracę żeby zainteresować programistę C++ do zaaplikowania na oferte pracy?

0

Strasznie sie kajam, bo zasadniczo nic, ale bardzo chcialabym poznać odpowiedź na to pytanie a Wy programujecie w C++ więc może wiecie.

5

Cześć, chcę wywołać z poziomu C++ metodę z C#. Nie chcę używać do tego CLI.

Czyli nie chcesz używać narzędzia, które do tego służy, które jest proste w użyciu, i które działa, a zamiat tego szukasz skomplikowanej drogi naokoło.

0

W Delphi robi się to bardzo łatwo (są odpowiednie wizardy).
Idąc tym tropem polecam spróbować z C++ Builder.
Być może efekt tego co on wyprodukuje da się skompilować pod innymi kompilatorami (obecnie bazuje on na clang).

https://www.embarcadero.com/products/cbuilder/starter/promotional-download
http://docwiki.embarcadero.com/RADStudio/Seattle/en/Import_Component_Wizard

1 użytkowników online, w tym zalogowanych: 0, gości: 1