Неизвестное исключение при использовании .NET 4.5 и смешанных сборок

У меня проблема, когда установлен новый .Net Framework (версия 4.5). Я работаю над сборкой плагина, доступ к которой осуществляется через нативный код. Библиотека построена с использованием Visual Studio 2010 и платформы .NET 4.0 в качестве целевой платформы.

Следующий фрагмент кода вызывает исключение в .NET 4.5 и отлично работает в .NET 4.0. Есть идеи, как решить эту проблему?

#pragma managed(push, off)
#pragma managed(push, on)

static bool ManagedTestFunction() {
return false;
}

#pragma managed(pop)

static void CheckIfManagedUnmanagedTransitionIsPossible()
{
try
{
ManagedTestFunction();
}
catch (...)
{
throw misc::mwException(0, _T("The program is not working if .NET Framework 4.5 is installed. Please revert to previous version .NET 4.0!"));
}
};

С наилучшими пожеланиями

Майкл

1

Решение

Я бы посмотрел на то, какое исключение было изначально создано — это должно дать вам представление о том, почему код не работает в .NET Framework 4.5.

0

Другие решения

наконец я решаю проблему сам. Это может быть концептуальная проблема из-за некоторой оптимизации в .NET 4.5. Конкретизирую следующий пример:

// managed class
ref class A
{
}

// native class holding a reference to A
class B
{
msclr::gcroot<A^> m_refA;
};

При первом пересечении нативно управляемой границы новая .NET Framework пытается разрешить все управляемые типы, которые являются ссылками в нативных классах, независимо от того, используются они на самом деле или нет. В настоящее время подписка на событие AppDomain.ResolveAssembly еще не возможна. Если структура не может разрешить тип, происходит сбой.

Возможное решение — изменить класс B таким образом, чтобы он вместо этого сохранял ссылку на System :: Object ^ и приводил к динамическому приведению с помощью «cli_safe ((System :: Object ^) m_refA)»

С наилучшими пожеланиями

Майкл

0

По вопросам рекламы [email protected]