Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Visual C++ Redistributables without using VCRedist_x86.exe

I'm developing in an environment that is severely constrained, but the developers also have tight control over.

VCRedist_x86.exe - A 4Mb redistributable - is no fun (four hours to transfer). I'd really prefer to just redistribute MFC90.dll, msvcm90.dll, msvcp90.dll and msvcr90.dll - that's more like 2Mb. However, Redistributing Visual C++ Files says:

It is not supported to redistribute C/C++ applications that are built without a manifest. Visual C++ libraries cannot be used by C/C++ applications without a manifest binding the application to these libraries. For more information, see Choosing a Deployment Method.

My original plan of copying the DLLs into the program's working directory doesn't seem to work in this brave new world of manifests.

My next guess is to bodge up the registry entries required to populate the files into the WinSxS directory and populate it myself (rather than using the 4 meg program).

[edit] The software is frequently updated, so DLLs are strongly preferred to static linking. [/edit]

How can I sucessfully distribute the necessary files but keep the overhead down?

like image 814
Josh Avatar asked Oct 07 '08 02:10

Josh


People also ask

What is vcredist_x86 EXE used for?

What is vcredist_x86.exe? vcredist_x86.exe is a legitimate file. This process is known as Win32 Cabinet Self-Extractor. It belongs to Windows Operating System and was developed by Microsoft Corporation.

Do I need to install all Microsoft Visual C++ redistributable?

These libraries are required by many applications built by using Microsoft C and C++ tools. If your app uses those libraries, a Microsoft Visual C++ Redistributable package must be installed on the target system before you install your app.

Do I need Microsoft Visual C redistributable?

We don't recommend that you delete any Visual C++ redistributable, because doing so could make multiple applications on your computer stop working. Given how little space they take up and how broadly they are used, it doesn't seem worth the hassle to mess with your current ecosystem of standard library files.


2 Answers

[I'm the current SxS maintainer at Microsoft]

I would strongly suggest against removing the publicKeyToken attribute from manifests. Private deployment of the dlls will work just fine with this attribute left intact. However, removing it will prevent your app from benefiting from security updates should there be a newer version of the CRT installed centrally on the target machine, as the dependencies will no longer match up.

So, to summarize: it's safe to embed your manifest, with the default. Copy the CRT manifest + DLL files directly into your executable's directory, with no edits. That's it. Compatible Win2k+.

like image 120
Eugene Talagrand Avatar answered Oct 22 '22 06:10

Eugene Talagrand


We use this: Howto: Deploy VC2008 apps without installing vcredist_x86.exe

Essentially

  • Don't embed a manifest in your exe files.
  • Copy the C++ DLLs and their manifests to your app's directory.
  • Remove the "publicKeyToken" from all manifests (yours and Microsoft's).
  • If necessary, change the version info in your app's manifest files to match the Microsoft manifest files (or vice versa)
like image 21
Joe Avatar answered Oct 22 '22 05:10

Joe