App的.exe文件缺少.NET TargetFramework,但仅限于干净版本

时间:2012-11-09 20:59:41

标签: c++ .net visual-studio-2012

我有一个应用程序,我正在从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文件。

有没有办法解决这个问题?

6 个答案:

答案 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)

  1. 此信息从文件%TEMP%\。NETFramework注入,版本=%。NET_VERSION%.AssemblyAttributes.cpp
  2. 仅当您的临时目录中不存在该文件时才会生成该文件
  3. 编译“混合”lib时,它会生成带有空.NET版本的损坏文件,之后编译的所有混合DLL都会被破坏!
  4. 要解决此问题,您需要删除%temp%,并将此行添加到所有混合的lib项目(或通过全局属性表)

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

  5. 它将在混合lib编译期间关闭损坏的文件生成
  6. 这是msbuild脚本中的一个错误,存在于所有最新的Visual Studios(包括VS2013 Update 5和VS2015 Update 3)中

答案 5 :(得分:-2)

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

  

未处理的异常:System.TypeInitializationException

''的类型初始值设定项引发异常。

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