关于C# / Visual Basic在Windows 7和Windows 8/8.1/10中免库的解决方法,请参考
【.NET编写的程序在NT6.x中免装运行库的方法】,此帖的讨论对象是Visual C++和C++/CLI。
现在.NET Framework越来越普及,Windows XP也接近淘汰,C++开发者也不应该拘泥于使用MFC或者ATL,
现在全面改用C++/CLI已经变得可行。和C#或Visual Basic相比,C++/CLI可以更方便地访问WinAPI相关内容,而又不牺牲.NET Framework的便捷性。使用C++/CLI唯一的缺点可能就是不能使用Windows Presentation Foundation编写应用程序了。不过很奇怪,后来的C++/CX反而又支持使用XAML编写Modern应用程序了。
众所周知,Windows 7自带.NET Framework 3.5 SP1(基于2.0运行时),而Windows 8/8.1/10以上自带.NET Framework 4.5/4.5.1/4.6(基于4.0运行时)。4.0运行时一般来说是不能运行.NET Framework 2.0-3.5的程序的。如果在Windows 8/8.1/10中运行.NET Framework 2.0-3.5程序,而又没有安装.NET Framework 3.5运行库时,会出现如下提示,需要联网安装运行库:
要想同时让这两个系统不提示安装运行库,就需要将.NET版本降级至3.5,并填写XXXXXXnfig配置文件。C# / Visual Basic的免库方法我已经发过了,但是C++/CLI的要更麻烦一点,这里我讲一下在C++/CLI中必要的注意事项。
首先,要正常编译基于.NET Framework 3.5的C++/CLI程序,
必须已安装Visual Studio 2008。Visual Studio 2008可在置顶帖或者『MSDN我告诉你』下载。为了方便起见,
建议直接降级使用Visual Studio 2008。事实上,Visual Studio 2008这个版本是使用C++/CLI最佳的版本。VS2008对C++/CLI的IntelliSense支持要比MFC更好。后一个版本VS2010中不知道微软哪根筋搭错了,居然不支持C++/CLI的IntelliSense,好在VS2012终于加回来了,但是Windows窗体模板却消失了。
【第一步】
首先,打开Visual Studio 2008,选择『文件-》新建-》项目』,按照正常过程建立一个C++/CLI窗体工程『Visual C++ \ CLR \ Windows 窗体应用程序』:
【第二步】
然后单击『项目-》添加新项』,向程序中添『实用工具 \ 配置文件 (XXXXXXnfig)』:
在新建的文件中,输入以下XML文本:
<code class="lang-xml"><?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup uselegacyv2runtimeactivationpolicy="true">
<supportedruntime version="v2.0.50727">
<supportedruntime version="v4.0">
</supportedruntime></supportedruntime></startup>
</configuration></code>
其中<startup useLegacyV2RuntimeActivationPolicy="true">向4.0运行时表明该程序使用2.0的老式激活策略,对于某些混合应用程序是必要的。下面两条<supportedRuntime version="..."/>则表示这个程序在2.0和4.0运行时上都可以运行。
【重要的一步】
和C#和Visual Basic不同,
Visual C++不会主动将XXXXXXnfig复制到目标路径中,并命名为XXXXXXXXXXXXXXXnfig。因此需要配置一下自定义生成步骤。
右键单击『解决方案资源管理器』中的XXXXXXnfig,选择『属性』,在『自定义生成』步骤中,填写如下:
命令行:
copy /y "$(InputPath)" "$(TargetPath).config"
输出:
$(TargetPath).config
XXXXXXnfig配置详图:
【最后一步】
单击『生成-》生成解决方案』,在目标文件夹中,可以看到有两个文件生成:Program1.exe和XXXXXXXXXXXXXXXnfig,其中第二个文件的内容与我们所编写的XXXXXXnfig内容完全一样:
将这两个文件共同发布,即可在Windows 7和Windows 8/8.1/10中均免运行库:
200字以内,仅用于支线交流,主线讨论请采用回复功能。