1

新しい .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!"));
    }
};

よろしくお願いします

マイケル

4

2 に答える 2

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 イベントをサブスクライブすることはまだできません。フレームワークが型を解決できない場合、クラッシュが発生します。

考えられる解決策は、代わりに System::Object^ への参照を格納するようにクラス B を変更し、「cli_safe((System::Object^) m_refA)」を使用して動的にキャストすることです。

よろしくお願いします

マイケル

于 2012-12-13T09:20:46.207 に答える
0

最初にスローされた例外を確認すると、コードが .NET Framework 4.5 で動作しない理由の手がかりが得られるはずです。

于 2012-12-11T11:52:01.330 に答える