Имам неуправляван 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");
}
}
пропускам ли нещо