Класс-оболочка с чистыми виртуальными методами

У меня есть неуправляемая 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();
    }
}

Но каждый раз, когда вызывается неуправляемый 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++ использует одно и то же соглашение о вызовах. Кроме того, где ваш код С#?   -  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