Вызов C# dll из C++ с использованием CoCreateInstance

Мой проект C# библиотека классов с одним единственным классом:

  namespace myLib
  {
    // Interface declaration.
    [Guid("Some GUID")]
    [InterfaceType(ComInterfaceType.InterfaceIsDual)]
    public interface ICsClass
    {
        [DispId(1)]
        int Add(int Number1, int Number2);
    };

    [Guid("Some GUID")]
    [ClassInterface(ClassInterfaceType.None)]
    [ProgId("myLib.CsClas")]       
    public class CsClas : ICsClass
    {
         public int Add(int a, int b)
        {
            return a + b;
        }
    }
}

я проверил Register for com interop с помощью VS2010 который породил dll & tlb файлы для меня, хорошо до сих пор.

Мой проект Win32 Dll приложение с одним cpp файл:

    #import "MyLib.tlb" raw_interfaces_only
    using namespace MyLib;

...............

#ifdef __cplusplus
extern "C"{
#endif
    __declspec(dllexport) long Add(int a,int b)
    {
        CoInitialize(NULL); 
        long lResult = 0;       
        // Use Smart pointer
        CComQIPtr <ICsClass> spCoClass;
        if (SUCCEEDED (spCoClass.CoCreateInstance(L"myLib.CsClas")))
        {
            spCoClass->Add(a,b,&lResult);   
            wprintf(L"The result is %d\n", lResult);
            std::cout << "#"+lResult << '\n'; 
        }
        CoUninitialize();
        return lResult;
    }
#ifdef __cplusplus
}
#endif

.......

Я могу собрать этот Dll, и все выглядит хорошо до сих пор.

Вопрос, когда я использую свой Win32 Dll и пытаюсь вызвать функцию Add этой строкой:

 SUCCEEDED (spCoClass.CoCreateInstance(L"myLib.CsClas"))

Никогда не проходит, В чем может быть проблема, Не было ли это правильно зарегистрировано?

Любезно помочь.

1 ответ

Написанный код не дает вам хорошего способа диагностики ошибки. Напишите это так:

    HRESULT hr = spCoClass.CoCreateInstance(L"myLib.CsClas");
    if (SUCCEEDED(hr)) {
       // etc..
    }

Типичный код ошибки: 0x80040154, "Класс не зарегистрирован". Etcetera.

Другие вопросы по тегам