2

我有一个要从 VS2008 转换为 VS2012 的应用程序。该应用程序是混合模式,由多个项目组成。升级后,只要输入托管代码,应用程序就会在运行时崩溃,但出现以下异常:

PresentationFramework.dll 中出现“System.TypeInitializationException”类型的未处理异常

附加信息:“System.Windows.Application”的类型初始化程序引发了异常。

最深的内在例外是:

“字符串长度不能为零。参数名称:frameworkName”

堆栈跟踪是:

在 System.Runtime.Versioning.BinaryCompatibility.ParseFrameworkName(字符串 frameworkName、String& 标识符、Int32& 版本、String& 配置文件)

在 System.Runtime.Versioning.BinaryCompatibility.ParseTargetFrameworkMonikerIntoEnum(字符串 targetFrameworkMoniker,TargetFrameworkId& targetFramework,Int32& targetFrameworkVersion)

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

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

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

这只发生在干净的构建之后,并且每次运行时都会发生,直到我清理一个项目然后再次构建。然后每次我运行它时它都会起作用。

我用 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\YOURNAME\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 回答
3

通过删除 C:\Users\YOURNAME\AppData\Local\Temp 中的所有内容来解决我的问题 :)

于 2014-01-23T07:45:05.837 回答
1

经过几天的调查,我发现“损坏”的.NETFramework,Version=v4.0.AssemblyAttributes.cpp文件是由一个配置如下的 CPP 项目引起的:

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

更改项目配置和删除%TEMP%目录已成为最终解决方案。

仅仅删除%TEMP%并不能保证文件不会再次生成损坏,因此不能视为最终解决方案。

于 2014-05-02T10:52:08.683 回答
1

我整天都在为此苦苦挣扎。我尝试了上面的解决方案,但没有任何乐趣。最后,我将 Target Framework 形式的 .Net 4.5 更改为 .Net 4,然后重新编译。然后我将 Target Framework 改回 .Net 4.5。这样就整理好了。

缺口

于 2013-06-13T12:25:01.767 回答
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. 这是 msbuild 脚本中的一个错误,存在于所有最新的 Visual Studio(包括 VS2013 Update 5 和 VS2015 Update 3)中
于 2016-12-26T19:14:12.570 回答
-2

支持 CLR 的 C++ 应用程序。

未处理的异常:System.TypeInitializationException

'' 的类型初始化程序引发了异常。

修复C:\Users\YOURNAME\AppData\Local\Temp\.NETFramework,Version=v4.0.AssemblyAttributes.cpp文件工作。

于 2015-08-20T07:41:40.117 回答