我有一个应用程序,我正在从VS2008转换为VS2012。该应用程序是混合模式,由多个项目组成。升级后,只要输入托管代码,应用程序就会在运行时崩溃,并出现以下异常:
PresentationFramework.dll中出现未处理的“System.TypeInitializationException”类型异常
附加信息:'System.Windows.Application'的类型初始值设定项引发了异常。
最深的内在例外是:
“字符串的长度不能为零。参数名称:frameworkName”
堆栈跟踪是:
at System.Runtime.Versioning.BinaryCompatibility.ParseFrameworkName(String frameworkName,String& identifier,Int32& version,String& profile)
at 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()
这仅在干净的构建之后发生,并且每次运行时都会发生,直到我清理单个项目然后再次构建。然后每次运行它都会起作用。
我用JetBrains查看了.exe文件,并比较了应用程序运行时和崩溃时的样子。当应用程序崩溃时,此行位于.exe:
[assembly:TargetFramework(“”,FrameworkDisplayName =“.NET Framework 4”)]
显然框架字符串是空白的,这导致了异常。当应用程序工作时,该行不存在,因此没有例外。
编辑清晰度:当.exe清单中完全没有上述行时,该应用程序正常工作。我已经确认在VS2008中,上面的行不在.exe清单中。看起来它根本不应该在清单中,并且在VS2012中的干净构建中它会被添加并导致问题。另外,我没有使用app.config文件。
有没有办法解决这个问题?
答案 0 :(得分:12)
我已经为此工作了3天,我找到了答案。
显然,MSBuild会自动创建一个名为
的文件.NETFramework,版本= v4.0.AssemblyAttributes.cpp
中的
C:\用户\ YOURNAME \应用程序数据\本地\温度
目录。它在创建.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中使用过。我有点恼火,我的构建中正在使用这样的文件。
答案 1 :(得分:3)
通过删除C:\ Users \ YOURNAME \ AppData \ Local \ Temp中的所有内容解决了我的问题:)
答案 2 :(得分:1)
我整天都在苦苦挣扎。我尝试了上面的解决方案,但没有快乐。最后,我将目标框架表格.Net 4.5更改为.Net 4,然后重新编译。然后我将目标框架改回了.Net 4.5。这对它进行了排序。
尼克
答案 3 :(得分:1)
经过几天的调查,我发现“损坏的”.NETFramework,Version=v4.0.AssemblyAttributes.cpp
文件是由一个配置如下的CPP项目引起的:
<ConfigurationType>StaticLibrary</ConfigurationType>
<CLRSupport>true</CLRSupport>
更改项目配置并删除%TEMP%
目录是一个明确的解决方案。
仅删除%TEMP%
并不能保证文件不会再次被破坏,因此不能被视为最终解决方案。
答案 4 :(得分:1)
要解决此问题,您需要删除%temp%,并将此行添加到所有混合的lib项目(或通过全局属性表)
<!-- Must be located after <ConfigurationType>StaticLibrary</ConfigurationType> -->
<GenerateTargetFrameworkAttribute Condition="'$(ConfigurationType)'=='StaticLibrary'">false</GenerateTargetFrameworkAttribute>
答案 5 :(得分:-2)
支持CLR的C ++应用程序。
未处理的异常:System.TypeInitializationException
''的类型初始值设定项引发异常。
修复C:\Users\YOURNAME\AppData\Local\Temp\.NETFramework,Version=v4.0.AssemblyAttributes.cpp
文件。