2

VS2008からVS2012に変換しているアプリがあります。アプリは混合モードであり、複数のプロジェクトで構成されています。アップグレード後、マネージコードが入力されるとすぐにアプリがクラッシュしますが、次の例外があります。

タイプ'System.TypeInitializationException'の未処理の例外がPresentationFramework.dllで発生しました

追加情報:「System.Windows.Application」の型初期化子が例外をスローしました。

最も深い内部例外は次のとおりです。

「文字列の長さをゼロにすることはできません。パラメータ名:frameworkName」

スタックトレースは次のとおりです。

System.Runtime.Versioning.BinaryCompatibility.ParseFrameworkName(String frameworkName、String&identifier、Int32&version、String&profile)で

System.Runtime.Versioning.BinaryCompatibility.ParseTargetFrameworkMonikerIntoEnum(String targetFrameworkMoniker、TargetFrameworkId&targetFramework、Int32&targetFrameworkVersion)で

System.Runtime.Versioning.BinaryCompatibility.ReadTargetFrameworkId()で

System.Runtime.Versioning.BinaryCompatibility.get_AppWasBuiltForFramework()で

System.Runtime.Versioning.BinaryCompatibility..cctor()で

これは、クリーンビルドの後でのみ発生し、1つのプロジェクトをクリーンアップしてから再度ビルドするまで、実行するたびに発生します。その後、実行するたびに機能します。

JetBrainsを使用して.exeファイルを確認し、アプリが動作したときとクラッシュしたときのファイルを比較しました。アプリがクラッシュすると、次の行が.exeに含まれます。

[アセンブリ:TargetFramework( ""、FrameworkDisplayName = ".NET Framework 4")]

明らかに、フレームワーク文字列は空白であり、それが例外の原因となっています。アプリが動作する場合、その行は存在しないため、例外はありません。

明確にするために編集:アプリは、上記の行が.exeマニフェストに完全に含まれていない場合に機能します。VS2008では、上記の行が.exeマニフェストに含まれていないことを確認しました。マニフェストに含めるべきではないようです。VS2012のクリーンビルドでは、追加されて問題が発生しています。また、app.configファイルを使用していません。

これを修正する方法はありますか?

4

6 に答える 6

12

私はこれに3日間取り組んできましたが、答えを見つけました。

どうやらMSBuildはというファイルを自動作成します

.NETFramework,Version=v4.0.AssemblyAttributes.cpp

あなたの

C:\Users\あなたの名前\AppData\Local\Temp

ディレクトリ。.exe ファイルを作成するときに、このファイルを使用します。

私のマシンでは、このファイルには次のものが含まれていました。

#using <mscorlib.dll>
[assembly: System::Runtime::Versioning::TargetFrameworkAttribute(L"", FrameworkDisplayName=L".NET Framework 4")];

空の文字列が問題を引き起こしていました。私はこれを言うためにファイルを変更しました:

#using <mscorlib.dll>
[assembly: System::Runtime::Versioning::TargetFrameworkAttribute(L".NETFramework,Version=v4.0", FrameworkDisplayName=L".NET Framework 4")];

今、すべてが動作します!ファイルがどのようにしてその状態になったのかはわかりませんが、触ったことはありません。VS2008では使用されていないと思います。そのようなファイルが私のビルドで使用されていることに、私は少しイライラしています。

于 2012-11-12T19:43:13.233 に答える
1
  1. この情報は、ファイル%TEMP%\.NETFramework,Version=%.NET_VERSION%.AssemblyAttributes.cppから挿入されます。
  2. ファイルは、一時ディレクトリに存在しない場合にのみ生成されます
  3. 「混合」ライブラリをコンパイルすると、空の .NET バージョンで破損したファイルが生成され、この後にコンパイルされたすべての混合 DLL が破損します。
  4. それを解決するには、%temp% を削除し、この行をすべての混合 lib プロジェクトに (またはグローバル プロパティ シートを介して) 追加する必要があります。

    <!-- Must be located after <ConfigurationType>StaticLibrary</ConfigurationType> -->
    <GenerateTargetFrameworkAttribute Condition="'$(ConfigurationType)'=='StaticLibrary'">false</GenerateTargetFrameworkAttribute> 
    

  5. 混合ライブラリのコンパイル中に破損したファイルの生成をオフにします
  6. これは、最新のすべての Visual Studio (VS2013 Update 5 および VS2015 Update 3 を含む) に存在する msbuild スクリプトのバグです。
于 2016-12-26T19:14:12.570 に答える
1

調査に何日も費やした後、「破損した」.NETFramework,Version=v4.0.AssemblyAttributes.cppファイルは、次のように構成された 1 つの CPP プロジェクトが原因であることがわかりました。

<ConfigurationType>StaticLibrary</ConfigurationType>
<CLRSupport>true</CLRSupport>

プロジェクト構成の変更と%TEMP%ディレクトリの削除は、決定的な解決策です。

削除するだけ%TEMP%では、ファイルが再び破損して生成されないという保証はないため、決定的な解決策とは見なされません。

于 2014-05-02T10:52:08.683 に答える
1

私は一日中これに苦労してきました。上記の解決策を試しましたが、喜びはありませんでした。最後に、ターゲット フレームワーク フォーム .Net 4.5 を .Net 4 に変更し、再コンパイルしました。その後、Target Framework を .Net 4.5 に戻しました。これで並びました。

ニック

于 2013-06-13T12:25:01.767 に答える
-2

CLR をサポートする C++ アプリケーション。

未処理の例外: System.TypeInitializationException

'' の型初期化子が例外をスローしました。

C:\Users\YOURNAME\AppData\Local\Temp\.NETFramework,Version=v4.0.AssemblyAttributes.cppファイルの修正は機能しました。

于 2015-08-20T07:41:40.117 に答える