Обвиващ клас с чисти виртуални методи

Имам неуправляван dll, който съдържа клас само с чисти виртуални методи (вид обратни извиквания):

class PAClient
{
public:
    __declspec(dllexport) virtual void SetCalculationStarted() = 0;     
    __declspec(dllexport) virtual void SetCalculationStopped() = 0; 
}

Сега трябва да изпратя тези извиквания на функции към управлявания C# код и реших да използвам интерфейс за това. Ето какво направих:

public interface class IPAClientWrapper
{
    void SetCalculationStarted();       
    void SetCalculationStopped();   
};

private class PAClientWrapper : public PAClient
{
private:
    gcroot<IPAClientWrapper^> callBack;

public:

    PAClientWrapper(IPAClientWrapper^ c)
    {
        callBack = c;
    }

    void SetCalculationStarted()
    {
        callBack->SetCalculationStarted();
    }

    void SetCalculationStopped()
    {
        callBack->SetCalculationStopped();
    }
}

Но всеки път, когато се извика unmanaged SetCalculationStarted(), неуправляемият код хвърля изключение:

An unhandled exception of type 'System.AccessViolationException' occurred in PAnalysisLib.dll

Additional information: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

РЕДАКТИРАНЕ:

public partial class Form1 : Form, IPAClientWrapper
{
    public Form1()
    {
        InitializeComponent();
    }

    public void SetCalculationStarted()
    {
        Console.WriteLine("started");
    }

    public void SetCalculationStopped()
    {
        Console.WriteLine("stopped");
    }

}

пропускам ли нещо


person VladL    schedule 05.02.2013    source източник
comment
Наистина не съм сигурен, но може би не знае как да извика чистите виртуални методи, тъй като те нямат дефиниция. Опитвали ли сте го с подклас, който ги дефинира?   -  person dutt    schedule 05.02.2013
comment
Можете ли да наследите от неуправляван клас? Не можете да създадете обект от чист виртуален естествен клас.   -  person qPCR4vir    schedule 05.02.2013
comment
@dutt нещото, което се опитах да постигна, е да препратя извикванията на функцията към C#, там внедрявам IPAClientWrapper интерфейс. внедряването на IPAClientWrapper трябва да бъде дефиниция за тези виртуални методи. Правилно ли разбирам нещата?   -  person VladL    schedule 05.02.2013
comment
@qPCR4vir това е C++/CLI, кодът е компилиран без грешки, така че предполагам, че мога да го наследя. Къде създадох обект от него?   -  person VladL    schedule 05.02.2013
comment
Трябва да се уверите, че вашият код на C# и C++ използва една и съща конвенция за извикване. Освен това къде е вашият C# код?   -  person Security Hound    schedule 05.02.2013
comment
@Ramhound Добавих C# кода, съмнявам се, че ще помогне на някой да отговори на въпроса ми. Няма нужда да се указва конвенция за извикване, тъй като SetCalculationStarted и SetCalculationStopped са функции за обратно извикване, така че те трябва да бъдат задействани от неуправлявания код и препратени към управлявания.   -  person VladL    schedule 05.02.2013
comment
@VladL - Нещо... кара кода ви да се опитва да прочете защитена памет. Вашето внедряване няма голям смисъл, ако трябва да бъда честен.   -  person Security Hound    schedule 05.02.2013
comment
@Ramhound бихте ли препоръчали по-добър?   -  person VladL    schedule 05.02.2013
comment
Всичко това ми изглежда добре. Прихващане на изключението в програма за отстраняване на грешки; имате много повече информация за вашия проблем, отколкото ние.   -  person Ben Voigt    schedule 06.02.2013