Я пишу библиотеку-оболочку, используя C ++ / CLI для неуправляемого проекта C ++. Цель состоит в том, чтобы предоставить эту библиотеку приложениям на C #. Вот что у меня есть.
#pragma once
#include "Settings.h"
#include "Settings/SettingsPrivate.h"
public ref class Settings
{
public:
Settings();
virtual ~Settings();
protected:
!Settings();
public:
unsigned char GetModel(int iNumber);
private:
CSettings* m_pSettings;
};
#include "stdafx.h"
#include "Managed/Settings.h"
Settings::Settings()
{
// Pointer to unmanaged object
m_pSettings = new CSettings();
}
Settings::~Settings()
{
this->!Settings();
}
Settings::!Settings()
{
if (m_pSettings)
{
delete m_pSettings;
m_pSettings = NULL;
}
}
unsigned char Settings::GetModel(int iNumber)
{
return m_pSettingss->GetModel(iNumber);
}
Код отлично работает в тестовом приложении, которое я написал. Вызов функции выполнен успешно. Проблема в том, что когда GC завершает этот объект, он генерирует исключение.
Произошло необработанное исключение типа «System.AccessViolationException» в Wrapper.dll
Дополнительная информация: Попытка чтения или записи в защищенную память. Это часто указывает на то, что другая память повреждена.
Я не вижу очевидной причины, по которой выбрасывается это исключение. Я попытался избавиться от объекта явно, вызвав Dispose из моего приложения C #. Это все еще бросает то же самое исключение.
Вот тестовое приложение:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace WrapperTest
{
class Program
{
static void Main(string[] args)
{
Settings settings = new Settings();
byte b = settings.GetModel(0);
settings.Dispose();
return;
}
}
}
Кто-нибудь укажет, что я делаю неправильно?