Десериализация перестает работать, если я загружаю MFC DLL из обычной DLL.
Я задавал этот вопрос раньше, но в то время я думал, что он был сложным, поэтому я не получил никакого ответа, решающего проблему для меня.
См. C # .NET User Control внутри собственного приложения. Проблемы цепочки ресурсов
Теперь я сделал тестовое приложение, показывающее ту же проблему.
Вы можете найти файлы с zip-кодом по адресу https://skydrive.live.com/?#cid=0977B1167FE01BB3&id=977B1167FE01BB3%21105&sc=documents.
Если я загружаю библиотеку расширения MFC из обычной библиотеки DLL, десериализация перестает работать, если я вызываю библиотеку расширения MFC непосредственно из приложения.
Когда я пытаюсь десериализовать, я получаю следующее CArchiveException «безымянный файл содержит неожиданный объект».
Кроме того, выходные данные в Visual Studio 2008 дают следующую информацию при запуске отладочной версии SerializeTest:
«Предупреждение: невозможно загрузить CSerializableClass из архива. Класс не определен.
CArchive исключение: badClass.
Исключение первого шанса в 0x7c812afb в SerializeTestD.exe: Microsoft C ++ исключение: CArchiveException в ячейке памяти 0x0012edf8. ”
Следующий тестовый код выполняется в CMFCDLL :: DoIt
void CMFCDLL :: DoIt (void)
{
BYTE * pBuf = (BYTE *)new char [1024];
{
CSerializableClass *pSerializableClass = new CSerializableClass;
CMemFile mf;
mf.Attach(pBuf, 1024);
CArchive ar(&mf, CArchive::store);
ar << pSerializableClass;
ar.Close();
mf.Detach();
delete pSerializableClass;
}
{
CSerializableClass *pSerializableClass = NULL;
CMemFile mf;
mf.Attach(pBuf, 1024);
CArchive ar(&mf, CArchive::load);
try
{
ar >> pSerializableClass;
ar.Close();
mf.Detach();
ASSERT(pSerializableClass && pSerializableClass->GetText() == _T("This is a serialize test"));
delete pSerializableClass;
}
catch(CArchiveException *p)
{
char str[500];
p->GetErrorMessage(str,500);
AfxMessageBox(str);
p->Delete();
ar.Abort();
mf.Detach();
}
}
delete pBuf;
}
Код, который завершается ошибкой - это ar >> pSerializableClass.
Есть идеи, почему я получаю эту проблему?
Почему я должен использовать обычную DLL?
Я пишу оболочку .NET, и DLL-библиотека смешанного режима - это обычная DLL-библиотека, обращающаяся к сериализации в DLL-библиотеке расширений MFC.