【问题标题】:Why does my Visual Studio Win32 project require .NET 3.5 SP1 to install?为什么我的 Visual Studio Win32 项目需要安装 .NET 3.5 SP1?
【发布时间】:2010-10-20 14:16:31
【问题描述】:

使用 Visual Studio 2008,我创建了一个 C++ Win32 项目。为了发布该程序,我在同一个解决方案中创建了一个 Visual Studio 安装项目。

setup.exe 提示我的用户安装 .NET 3.5 SP1,这通常需要 15 分钟以上的安装时间,并且只允许管理员级别的帐户使用。如果他们不这样做,就会出现“错误框架”的错误。我对我的项目中需要 .NET 3.5 SP1 的内容感到困惑。我怀疑只是因为那是我的电脑所在的框架......有没有办法扩大它将运行的框架?

代码主要是 Win32 API 调用。以防万一,这是我的依赖项和#includes:

gdiplus.lib
comctl32.lib
Winmm.lib
d3d9.lib

(安装项目自动添加了comdlg32.dll,然后告诉我排除它。)

#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <string.h>

#include <commctrl.h>
#include <process.h>
#include <sstream>
#include <math.h>
#include <d3d9.h>
#include <time.h>
#include <gdiplus.h>

我的猜测是,在 windows.h 的某个地方,有一个 WIN_VER 或类似的版本设置设置为 .NET 3.5 SP1,这就是依赖项的来源。如果是这种情况,并且我需要定义一个不同的版本,我很想听听大家关于该做/不该做/如何做的建议,以及我可以回溯多远以实现最大程度的包容。

【问题讨论】:

标签: c++ visual-studio winapi installation


【解决方案1】:

在 VS 2008 中,默认目标框架是 .NET 3.5。

对于 C++,Common Properties 页面上有一个“Targeted Framework”下拉菜单,但在我创建的测试项目中它是灰色的,所以在项目创建后似乎无法更改。

我创建了第二个 C++ 项目,并从“新建项目”对话框中选择了 2.0 模板,该模板在“目标框架”中有 2.0。

因此,如果您想针对较低版本的框架,看起来您必须首先正确地创建项目。

编辑:至于您应该针对哪个版本的框架 - 这一切都取决于(!)

您需要使用 3.0 或 3.5 的任何功能吗?如果没有,那就去2.0。如果你这样做了,那么选择那个并接受下载。我不能说任何类别的用户安装特定版本的可能性有多大。随着时间的推移,他们将越来越有可能安装 3.5,因为其他应用程序将需要它。

【讨论】:

  • 好的,我现在看到了。谢谢。不幸的是它是灰色的,所以我想我会开始一个新项目并将所有内容复制进去。我所有的用户都将拥有 windows XP 专业版,有没有人知道我应该使用什么目标框架?
  • 关于哪个版本:我实际上不需要 .NET 功能(我知道 - 它是 win32 api 代码),但 Visual Studio 2008 限制我选择 .NET 2.0、3.0 或 3.5 .所以我会选择最旧的 2.0,希望 Windows XP Professional、Microsoft Office 2003 或 Internet Explorer 6(在所有目标用户的 PC 上)至少携带 2.0。如果没有,这些用户可以下载更新。再次感谢!
  • 是的,这是可以接受的。我越来越多地遇到这些问题,让我相信微软不希望我在 VS 2008 中使用 c++ ;) 示例: - 智能感知适用于 c#,但不适用于 c++ - 单击一次部署选项,适用于除 c++ 之外的所有内容。 . 我想这是有正当理由的 - ...但是为什么我不能在一个 c++ 项目开始后更改目标框架!?!?
  • 不,我的意思是接受它作为正确答案 ;) 至于为什么你不能更改目标框架 - 这是微软的一个。看起来他们已经计划好了(它是属性上的灰色下拉菜单)。
  • 令我困惑的是编译或链接器标志中没有提到任何框架,这就是为什么我仍然不相信这是原因......
【解决方案2】:

就我而言,我解决了 UI 允许我遇到的所有问题,先决条件、通用属性……没关系,仍然想要 .NET 3.5。

所以,我在slickedit中打开vdproj文件,直接修改。改变了

    "ExternalPersistence"
    {
        "LaunchCondition"
        {
            "{A06ECF26-33A3-4562-8140-9B0E340D4F24}:_38ABBBBC51344AFFA38F2922DFFFE5B5"
            {
            "Name" = "8:.NET Framework"
            "Message" = "8:[VSDNETMSG]"
            "Version" = "8:3.5.30729"
            "AllowLaterVersions" = "11:FALSE"
            "InstallUrl" = "8:http://go.microsoft.com/fwlink/?LinkId=76617"
            }
        }
    }

    "ExternalPersistence"
    {
    }

它不再要求 .NET 3.5

【讨论】:

    【解决方案3】:

    您是否检查过安装程序项目的先决条件? (右键单击 -> Properties;Prerequesites 按钮)。

    在我创建的测试项目中,默认选择了 .NET 框架(我假设它实际上并没有分析正在安装的项目,因为它默认也不包含 C++ 运行时库。)

    【讨论】:

    • 感谢您的回复。安装程序项目的先决条件确实包括 .Net Framework 3.5 SP1。但是,如果我删除它,那么当他们运行程序时我会得到“错误的框架”错误。 ChrisF 的回复我认为是我的问题,当我创建项目时,我默认将 .Net 3.5 作为目标框架。由于某种原因,这在创建后无法在 c++ 中更改。
    • 您将应用程序创建为哪个模板?它是否使用任何 /clr (或类似)开关?您是否尝试过使用 depnds.exe 来确定实际的依赖关系?
    • 我使用了“Win32 项目”模板,然后在项目设置向导中选择了“空项目”。编译器开关是 "/O2 /Oi /GL /D "_MBCS" /FD /EHsc /MD /Gy /Fo"Release\\" /Fd"Release\vc90.pdb" /W3 /nologo /c /Zi /TP /errorReport:prompt”,我认为与公共语言运行时无关。我现在正在设置depends.exe(猜测它不是默认安装,必须在visual studio的自定义安装下指定它)并将对其进行调查。谢谢 - 杰夫
    • 我不相信这需要框架,并且我仍然对部署项目持怀疑态度。我很高兴被证明是错误的
    【解决方案4】:

    好吧,对于 C# 项目,如果您在解决方案资源管理器中右键单击项目文件,然后转到属性,您可以在“应用程序”选项卡上更改目标框架。 C++ 项目属性中可能有类似的东西。

    【讨论】:

      猜你喜欢
      • 2011-04-18
      • 2011-02-15
      • 2011-02-23
      • 2011-01-30
      • 2010-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多