У меня проблема, когда установлен новый .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!"));
}
};
С наилучшими пожеланиями
Майкл
Я бы посмотрел на то, какое исключение было изначально создано — это должно дать вам представление о том, почему код не работает в .NET Framework 4.5.
наконец я решаю проблему сам. Это может быть концептуальная проблема из-за некоторой оптимизации в .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)»
С наилучшими пожеланиями
Майкл