I this post I will talk about the deployment changes in VC++ 2010. When you deploy an application to another machine you have to install not only the application but all the libraries that it depends on. When you build with VC++, you have dependencies on CRT (C/C++ runtime) and possible on MFC and/or ATL.
Visual Studio 2005 introduced a new deployment model for Windows client applications based onisolated applications and side-by-side assemblies. Assemblies can be eithershared (globally registered in the system, installed in the Global Assembly Cache – GAC folder in Windows – and available to all applications) orside-by-side (described with a manifest, distributed with the application and available only to that application).
In Visual C++ 2005, library assemblies (such as MFC, ATL, CRT) have been rebuilt asshared side-by-side assemblies and installed in the native assembly cache, WinSxS folder in Windows. That means they are not globally registered in the system, but are globally available to the applications that specify a dependency with a manifest file.
With VC++ 2005 or 2008 there are several options for deployment:
- static linking: when you link your application statically against VC++ libraries (CRT, MFC or ATL) the application doesn’t have any dependencies so you don’t have to deploy any other VC++ DLLs to the target machine
- shared side-by-side assemblies: the VC++ DLLs are deployed in the WinSxS folder; this can be done either with the Visual C++ Redistributable Merge Modules or the Visual C++ Redistributable Package; the application requires a manifest file that describes the dependent DLLs and their version
- private assemblies: the VC++ DLLs are all installed in the same folder with the application; the application requires a manifest file
When you deploy an application built with Visual Studio 2005 or 2008 a manifest file that describes the dependencies, whether you deployed these VC++ DLLs in the local folder or they where installed in the WinSxS folder. If the manifest is missing you get an error. The next image shows the error received when running an MFC application (called Wordpad2008) build with VC++ 2008 on another machine without a manifest.
Though the purpose of this change was to simplify deployment, the result was probably the opposite. As a result Microsoft changed deployment requirements in Visual C++ 2010. You can now deploy applications without a Fusion or satellite manifest. All you need to do is copy the VC++ dependent DLLs to the application folder and run. The next image shows an MFC application (called Wordpad2010) built with VC++ 2010 running on another machine, without a satellite assembly. No error occurs any more when trying to start the application, because local deployment no longer require a satellite manifest.
With VC++ 2010 there are several options for deployment:
- static linking: same as earlier
- central deployment: the VC++ DLLs are deployed in the system32 folder; this is useful for updates, because Windows automatically identifies and updates the DLLs that are deployed here
- local deployment: the application executable and its dependent DLLs are all installed in the same folder; no manifest file is required.
To find more information about deployment and manifest files I suggest these links:
- Visual C++ Application: How to use manifests and re-distributable assemblies?
- Choosing a Deployment Method (VC++ 2008)
- Deployment in Visual C++ 2010
- Troubleshooting C/C++ Isolated Applications and Side-by-side Assemblies
- .NET Fusion