Click here to Skip to main content
Click here to Skip to main content

Modular InnoSetup Dependency Installer

By , 23 Sep 2011
 
Screenshot - dotnetfx_installer1.jpg

Screenshot - dotnetfx_installer3.jpg

Introduction

This article contains a modular InnoSetup install script that downloads (if setup files don't exist already) and installs various dependencies like .NET Framework 1.1/2.0/3.5/4.0 and others on 32-bit or 64-bit Windows.

Background

Once upon a time, I needed an installer for my .NET applications. I knew that I could use the "genius" ClickOnce installer, but in my opinion it has a bad interface and is not very handy. Then I came across a script for InnoSetup that had everything I wanted, but unfortunately it was only for .NET 1.1. So, I spent a few hours (became more over time) in InnoSetup and modified it to my needs.

Details

The source code is written modular. The folder structure looks like this:

Screenshot - dotnetfx_content.jpg

  • setup.iss - contains the basic setup where you include the modules (products) you need. They need to be included at the top like #include "scripts\products\dotnetfx11.iss" and then you only have to call their main function inside the [Code] part like dotnetfx11();
  • bin - contains the final output of the installer
  • src - contains the application files of your program
  • scripts
    • products.iss - contains the shared code for the product scripts. You only have to change the [CustomMessages] part and [Files] part (inclusion of isxdl language files)
    • isxdl - contains the downloader DLL for the setup (if there is something to download) and its language files (e.g. german.ini). This is the place where you can put your language files for the isxdl downloader in.
    • products - contains the scripts for products which are required by the application (e.g. .NET Framework 2.0)
      • dotnetfx11.iss - .NET Framework 1.1
      • dotnetfx11lp.iss - .NET Framework 1.1 Language Pack
      • dotnetfx11sp1.iss - .NET Framework 1.1 + Service Pack 1
      • dotnetfx20.iss - .NET Framework 2.0
      • dotnetfx20lp.iss - .NET Framework 2.0 Language Pack
      • dotnetfx20sp1.iss - .NET Framework 2.0 + Service Pack 1
      • dotnetfx20sp1lp.iss - .NET Framework 2.0 Service Pack 1 Language Pack
      • dotnetfx20sp2.iss - .NET Framework 2.0 + Service Pack 2
      • dotnetfx20sp2lp.iss - .NET Framework 2.0 Service Pack 2 Language Pack
      • dotnetfx35.iss - .NET Framework 3.5
      • dotnetfx35lp.iss - .NET Framework 3.5 Language Pack
      • dotnetfx35sp1.iss - .NET Framework 3.5 + Service Pack 1
      • dotnetfx35sp1lp.iss - .NET Framework 3.5 Service Pack 1 Language Pack
      • dotnetfx40client.iss - .NET Framework 4.0 Client Profile
      • dotnetfx40full.iss - .NET Framework 4.0 Full
      • ie6.iss - Internet Explorer 6
      • iis.iss - Internet Information Services (just a check if it is installed)
      • jet4sp8.iss - Jet 4 + Service Pack 8
      • kb835732.iss - Security Update (KB835732) which is required by .NET Framework 2.0 Service Pack 1 on Windows 2000 Service Pack 4
      • mdac28.iss - Microsoft Data Access Components (MDAC) 2.8
      • msi20.iss - Windows Installer 2.0
      • msi31.iss - Windows Installer 3.1
      • msi45.iss - Windows Installer 4.5
      • sql2005express.iss - SQL Server 2005 Express + Service Pack 3
      • sql2008express.iss - SQL Server 2008 Express R2
      • sqlcompact35sp2.iss - SQL Server Compact 3.5 + Service Pack 2
      • vcredist2010.iss - Visual C++ 2010 Redistributable
      • wic.iss - Windows Imaging Component
      • winversion.iss - helper functions to determine the installed Windows version including service packs
      • fileversion.iss - helper functions to determine the version of a file
      • stringversion.iss - helper functions to correctly parse a version string
      • dotnetfxversion.iss - helper functions to determine the installed .NET Framework version including service packs

Mostly you may have to tweak the setup.iss because of different Windows version / service pack version check depending on the version of .NET Framework you need.

If a dependency (product) is not installed, the script checks if the product's setup exists inside the dependencies directory which is configurable in products.iss. By default it is: .\MyProgramDependencies. If they don't exist there, it tries to download them (except for Windows Service Packs). This means a support for offline installing via CD or DVD is also possible. In the recent versions, there was also support for 32-bit (x86) and 64-bit (x64) OS including Itanium (ia64) added.

Screenshot - dotnetfx_installer2.jpg

Screenshot - dotnetfx_installer4.jpg

The installation routine of the dependencies is automatic, and they run in quiet or semi quiet mode. Therefore no user interaction is needed, except for Internet Explorer 6. This setup script uses [CostumMessages] so that you can easily add multi-language support to your setup and are easily able to configure settings (like the dependencies directory) without looking at the [Code] part.

Applications used for the script are:

  • Inno Setup - setup engine (version 5.4.2)
  • ISTool - extends Inno Setup but I just needed the isxdl.dll downloader (version 5.3.0)

Known Problems

If dependencies are needed, the required free hard drive size is incorrect.

Points of Interest

Special thanks go to Ted Ehrich who created the .NET Framework 1.1 script. Well, I am sure that this script will serve me in the future very well and I hope you may like it too.

History

  • 14 Oct, 2007
    • Initial version
  • 19 Oct, 2007
    • Minor update to code
  • 27 Oct, 2007
    • Minor update to code
  • 25 Jan, 2008
    • Minor update to code
  • 15 Aug, 2008
    • Now uses dotnetchk.exe to determine which version of .NET Framework and its language pack is installed
    • Added .NET Framework language pack(s) to script
    • Added translation for download page
    • Separated script code into multiple files to make it easier to update the script for different versions of the .NET Framework
  • 1 Jan, 2009
    • Wrote source code modular (each dependency now has one file)
    • Added code for Windows security updates, .NET Framework 1.1, 2.0sp1, 3.5, 3.5sp1 and their language packs
    • No more dotnetchk.exe
  • 1 Sep, 2009
    • Code for dependencies installation routine was completely rewritten and is now executed before the actual installation of the application. Setup also checks if all dependencies are installed successfully and if not, displays an error page
    • Added support for 32-bit (x86) and 64-bit (x64) OS including Itanium (ia64)
    • Added code for .NET Framework 2.0 SP2 and its language pack
    • Fixed windows version check bug and language pack check bug
  • 23 Sep, 2011
    • Added support for .NET Framework 4.0, Windows Installer 4.5, Visual C++ 2010 Redistributable, SQL 2008 Express and SQL 3.5 Compact Edition (community)
    • Added helper functions to determine the installed .NET Framework version which removed redundant code
    • Added version strings parser to fix wrong detection for version numbers above 9
    • Added delayed and forced mid-install restart support
    • Added usage of #define in setup.iss (community)
    • Added unicode version of Inno Setup as default for better multilanguage support
    • Fixed restart on 3010 resultcode from installers
    • Fixed missing check in Windows 2000 Security Update (KB835732)
    • Added support for offline files on x64 and IA64 OS

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

stfx
Austria Austria
Member
No Biography provided

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
QuestionSample is not working, windows installer and sql server is not installed in my PC.memberMember 870685915 May '13 - 18:02 
Hi,
i tried to install the MyProgram setup.
in last step of installation its showing, "Download Dependencies Windows installer and SQL Server r2"
then i click next button. the progress bar running and showing file downloading then its shows successfully installed. but the windows installer and sql server is not installed in my PC.
 

Can any one help me ?is any where i need to change the code.
 
Thanks
karthik
QuestionAbout define use_dotnetfx35memberterra.jr8 May '13 - 4:02 
Hello man. Thank you for this script so good!
I have a doubt about the terms

 
#define use_dotnetfx11
#define use_dotnetfx11lp
.....
 
In the examples of define term we used, see
#define MyAppName "My Program"
#define MyAppVer GetFileVersion("MyProg.exe")

 
But the use_dotnetfx11 there is not a value setted...
as:
#define use_dotnetfx11lp = "??????"
 
And my pascal code I have:
#ifdef use_dotnetfx11
dotnetfx11();
#ifdef use_dotnetfx11lp
dotnetfx11lp();
#endif
dotnetfx11sp1();
#endif

 
How does it know that use_dotnetfx11 is true or false?
Is the right way?

GeneralWhat are the steps to use this tool?memberChaim Tovim7 May '13 - 10:47 
I finished my project in vb.net.
What do I need to have in order to run this tool properly (beside my exe and database)?
Do I need all the Dlls & Ocxs?
Do I need to specify which framework I'm using?
 
Is it possible to get into details of how to use it with an example?
 
Thank you
Ami
Israel
QuestionDependencies file namememberfandisus28 Feb '13 - 0:25 
Hi... First of all, I want to thank you very much because this post help me a lot. But somehow i still confused about the dependencies file. I need to include microsoft installer 3.1. I delved into the msi31.iss file and find out that if the file is not found, the setup will download the msi31 from the internet.
 
I've got the msi31 installer from visual studio. The name was "WindowsInstaller-KB893803-v2-x86.exe". And in the msi31.iss file, there was "AddProduct('msi31.exe', " line. should i modify the line or the file name, or perhaps i should not?
 
Thanks
AnswerRe: Dependencies file namememberstfx6 May '13 - 21:59 
Modify the file name. Info for this can be found in the text file located at bin\MyProgramDependencies\readme.txt. This was done because there are some windows installer which have duplicate names for x64/x86.
GeneralMy vote of 5memberNicolas Cornet6 Feb '13 - 22:35 
Very useful and clear. Thanks a lot!
QuestionWin 2008 R2 installation using the role managermembertorno22 Jan '13 - 4:47 
Hi
 
Is there a way to use your scripts to install the .Net Framework on e.g. a Win Server 2008 R2/2012? As you must use the Role Manager, the current scripts don't work for me.
 
Thank you and thanks for your great project!
AnswerRe: Win 2008 R2 installation using the role managermembertorno24 Jan '13 - 2:13 
this powershell script does the job (you need to specifiy the Dotnet-Setup Url):
 
Param($computer = "localhost") 
 
Function Get-OSVersion($computer,[ref]$feature) 
{ 
 $os = Get-WmiObject -class Win32_OperatingSystem -computerName $computer 
 Switch ($os.Version) 
  {     
    "6.1.7600" 
                { 
                 If($os.ProductType -ne 1) #only 2008R2
                   { 
                    $feature.value = "NET-FRAMEWORK"
                   } #end if
               } #end 7600 
    "6.2.9200"{
                If($os.ProductType -ne 1) #only 2012
                { 
                    $feature.value = "NET-FRAMEWORK-Core" 
                } #end if
              } 
     DEFAULT { $feature.value = ""} 
  } #end switch 
} #end Get-OSVersion 
 
# *** entry point to script *** 
 
$feature = $null 
Get-OSVersion -computer $computer -feature ([ref]$feature) 
 
$x = Read-Host 'Installing .Net Framework. Do you want to continue? (y/n)'
 
if ($x -like 'y')
{ 
	if ($feature.value -ne "")
	{
		$wc = New-Object System.Net.WebClient
		$fullPathIncFileName = $MyInvocation.MyCommand.Definition
		$currentScriptName = $MyInvocation.MyCommand.Name
		$currentExecutingPath = $fullPathIncFileName.Replace($currentScriptName, "")
		$wc.DownloadFile(<DOTNETDOWNLOADURL>, "$currentExecutingPath\dotnetfx35setup.exe")
		Install-WindowsFeature -name $feature -source dotnetfx35setup.exe
	}
}
else
{
	exit 1;
}

GeneralRe: Win 2008 R2 installation using the role managermemberHarald Binkle4 Apr '13 - 2:49 
Hi,
sorry, can't ge this to work.
We are using "dism" instead:
edit products.iss:
[Code]
const sFeatureInstall='featureinstall';
//[...]
procedure AddProduct(FileName, Parameters, Title, Size, URL: string; InstallClean : boolean; MustRebootAfter : boolean);
var
	path: string;
  i: Integer;
begin
	installMemo := installMemo + '%1' + Title + #13;
 
  path := ExpandConstant('{src}{\}') + CustomMessage('DependenciesDir') + '\' + FileName;
    
  if (not FileExists(path)) and not (URL = '') then 
  begin
    path := ExpandConstant('{tmp}{\}') + FileName;
  
  	isxdl_AddFile(URL, path);
  
  	downloadMemo := downloadMemo + '%1' + Title + #13;
  	downloadMessage := downloadMessage + '	' + Title + ' (' + Size + ')' + #13;    
  end;    
 
	i := GetArrayLength(products);
	SetArrayLength(products, i + 1);
  // special treatment for bug #11483
  if (LowerCase(FileName) = sFeatureInstall) then
    products[i].File := sFeatureInstall
  else
	  products[i].File := path;
	products[i].Title := Title;
	products[i].Parameters := Parameters;
	products[i].InstallClean := InstallClean;
	products[i].MustRebootAfter := MustRebootAfter;
end;
 
function SmartExec(prod : TProduct; var ResultCode : Integer) : boolean;
var
  showFlag: Integer;
  OldState: Boolean;
begin
  showFlag := SW_SHOWNORMAL;
 
  //install OS feature (like on server 2008R2 and server 2012, e.g. NetFx3)
  if (LowerCase(prod.File) = sFeatureInstall) then
  begin
    
    OldState := EnableFsRedirection(False);
    try
      showFlag := SW_HIDE; //SW_HIDE  command line window 
      Result := Exec(ExpandConstant('{cmd}'),'/C dism /NoRestart /Online /Enable-Feature:'+prod.Parameters+' /all', '',showFlag, ewWaitUntilTerminated, ResultCode);
    finally
      EnableFsRedirection(OldState);
    end;  
  end
  else
  begin//no feature install
    if (LowerCase(Copy(prod.File,Length(prod.File)-2,3)) = 'exe') then 
    begin            
      Result := Exec(prod.File, prod.Parameters, '', showFlag, ewWaitUntilTerminated, ResultCode);
    end 
    else 
    begin
      Result := ShellExec('', prod.File, prod.Parameters, '', showFlag, ewWaitUntilTerminated, ResultCode);
    end;    
  end;//no feature install
end;
edit dotnetfx35sp1.iss
procedure dotnetfx35sp1();
var
  params: string;
begin
	if (netfxspversion(NetFx35, '') < 1) then
  begin
    // special treatment for bug #11483
    if (IsWin2012) or (IsWin2008R2) then
    begin
      params := 'NetFx3';
      AddProduct(sFeatureInstall,
        params, 
			  CustomMessage('dotnetfx35sp1_title'),
			  CustomMessage('dotnetfx35sp1_size'),
        dotnetfx35sp1_url,
        false, false);      
    end
    else
		  AddProduct('dotnetfx35sp1' + GetArchitectureString() + '.exe',
			  '/lang:enu /passive /norestart',
			  CustomMessage('dotnetfx35sp1_title'),
			  CustomMessage('dotnetfx35sp1_size'),
			  dotnetfx35sp1_url,
			  false, false);    
  end;
end;

QuestionI dont know this code "OutputBaseFilename={#MyAppSetupName}-{#MyAppVersion}"membersun mi Kang15 Jan '13 - 14:12 
Hi! I have a question on your iss file on inno setup.
 
#define MyAppSetupName 'MyProgram'
#define MyAppVersion '4.0'
OutputBaseFilename={#MyAppSetupName}-{#MyAppVersion}
 
Can you explain this code?
GeneralMy vote of 5membersun mi Kang15 Jan '13 - 14:01 
Thanks your article..
I can get useful tips of Inno Setup. Great Job!(:
GeneralMy vote of 5memberFelicia Santoro-Petti2 Jan '13 - 5:01 
Amazing, helped me loads and saved me so much time.
QuestionGoogle Chrome Installation Checkmemberkalpesh28041 Jan '13 - 19:14 
How can i Check chrome is installed or not.
 
if not i want to download and install.
QuestionJava Installation Checkmemberkalpesh28041 Jan '13 - 19:04 
I want to Install Java if not installed.
GeneralMy Vote Of 5+memberZac Greve18 Dec '12 - 17:19 
This is an awesome system. I know I will use this quite a bit.
 
If I could give a 10 I would!

Bob Dole
The internet is a great way to get on the net.

D'Oh! | :doh: 2.0.82.7292 SP6a

Question.net Framework 4.5memberairscape18 Dec '12 - 13:00 
Here are the changes to detect 4.5
 

dotnetfxversion.iss
 
[Code]
type
	NetFXType = (NetFx10, NetFx11, NetFx20, NetFx30, NetFx35, NetFx40Client, NetFx40Full, NetFx45Full);
 
const
	netfx11plus_reg = 'Software\Microsoft\NET Framework Setup\NDP\';
 
function netfxinstalled(version: NetFXType; lcid: string): boolean;
var
	regVersion: cardinal;
	regVersionString: string;
begin
	if (lcid <> '') then
		lcid := '\' + lcid;
 
	if (version = NetFx10) then begin
		RegQueryStringValue(HKLM, 'Software\Microsoft\.NETFramework\Policy\v1.0\3705', 'Install', regVersionString);
		Result := regVersionString <> '';
	end else begin
		case version of
			NetFx11:
				RegQueryDWordValue(HKLM, netfx11plus_reg + 'v1.1.4322' + lcid, 'Install', regVersion);
			NetFx20:
				RegQueryDWordValue(HKLM, netfx11plus_reg + 'v2.0.50727' + lcid, 'Install', regVersion);
			NetFx30:
				RegQueryDWordValue(HKLM, netfx11plus_reg + 'v3.0\Setup' + lcid, 'InstallSuccess', regVersion);
			NetFx35:
				RegQueryDWordValue(HKLM, netfx11plus_reg + 'v3.5' + lcid, 'Install', regVersion);
			NetFx40Client:
				RegQueryDWordValue(HKLM, netfx11plus_reg + 'v4\Client' + lcid, 'Install', regVersion);
			NetFx40Full:
				RegQueryDWordValue(HKLM, netfx11plus_reg + 'v4\Full' + lcid, 'Install', regVersion);
			NetFx45Full:
				RegQueryDWordValue(HKLM, netfx11plus_reg + 'v4\Full', 'Release', regVersion);
		end;
		Result := (regVersion <> 0);
	end;
end;
 
function netfxspversion(version: NetFXType; lcid: string): integer;
var
	regVersion: cardinal;
begin
	if (lcid <> '') then
		lcid := '\' + lcid;
 
	case version of
		NetFx10:
			//not supported
			regVersion := -1;
		NetFx11:
			if (not RegQueryDWordValue(HKLM, netfx11plus_reg + 'v1.1.4322' + lcid, 'SP', regVersion)) then
				regVersion := -1;
		NetFx20:
			if (not RegQueryDWordValue(HKLM, netfx11plus_reg + 'v2.0.50727' + lcid, 'SP', regVersion)) then
				regVersion := -1;
		NetFx30:
			if (not RegQueryDWordValue(HKLM, netfx11plus_reg + 'v3.0' + lcid, 'SP', regVersion)) then
				regVersion := -1;
		NetFx35:
			if (not RegQueryDWordValue(HKLM, netfx11plus_reg + 'v3.5' + lcid, 'SP', regVersion)) then
				regVersion := -1;
		NetFx40Client:
			if (not RegQueryDWordValue(HKLM, netfx11plus_reg + 'v4\Client' + lcid, 'Servicing', regVersion)) then
				regVersion := -1;
		NetFx40Full:
			if (not RegQueryDWordValue(HKLM, netfx11plus_reg + 'v4\Full' + lcid, 'Servicing', regVersion)) then
				regVersion := -1;
		NetFx45Full:
			if (not RegQueryDWordValue(HKLM, netfx11plus_reg + 'v4\Full' + lcid, 'Servicing', regVersion)) then
				regVersion := -1;
	end;
	Result := regVersion;
end;
 
dotnetfx45full.iss
 

// requires Windows Vista SP2 (x86 and x64), Windows 7 SP1 (x86 and x64), Windows Server 2008 R2 SP1 (x64), Windows Server 2008 SP2 (x86 and x64)
// requires Windows Installer 3.1
// requires Internet Explorer 5.01
// WARNING: express setup (downloads and installs the components depending on your OS) if you want to deploy it on cd or network download the full bootsrapper on website below
// http://www.microsoft.com/downloads/en/details.aspx?FamilyID=9cfb2d51-5ff4-4491-b0e5-b386f32c0992
 
[CustomMessages]
dotnetfx45full_title=.NET Framework 4.5 Full
 
dotnetfx45full_size=3 MB - 197 MB
 
;http://www.microsoft.com/globaldev/reference/lcid-all.mspx
en.dotnetfx45full_lcid=''
de.dotnetfx45full_lcid='/lcid 1031 '
 

[Code]
const
	dotnetfx45full_url = 'http://download.microsoft.com/download/B/A/4/BA4A7E71-2906-4B2D-A0E1-80CF16844F5F/dotNetFx45_Full_setup.exe';
 
procedure dotnetfx45full();
begin
	if (not netfxinstalled(NetFx45Full, '')) then
		AddProduct('dotNetFx45_Full_setup.exe',
			CustomMessage('dotnetfx45full_lcid') + '/q /passive /norestart',
			CustomMessage('dotnetfx45full_title'),
			CustomMessage('dotnetfx45full_size'),
			dotnetfx45full_url,
			false, false);
end;

SuggestionRe: .net Framework 4.5memberMember 967595128 Jan '13 - 0:01 
You also need to add the following lines to your setup.iss file:
 
#define use_dotnetfx45full
in the head
 
#ifdef use_dotnetfx45full
#include "scripts\products\dotnetfx45full.iss"
#endif
below the block starting with #ifdef use_dotnetfx40
 
and finally
#ifdef use_dotnetfx45full
   dotnetfx45full();
#endif
before the section #ifdef use_wic
GeneralMy vote 5memberDato001119 Nov '12 - 2:54 
Thank you very much for this excellent piece of work. Saved lot's of hours if not days.
QuestionKB835732 doesn't work in Windows 2000 setupmemberVinny Lawlor12 Nov '12 - 6:15 
You need to replace the following parameters (to "/passive /norestart") in the procedure below in kb835732.iss script - the installer switches were incorrect:
 
procedure kb835732();
begin
    if (exactwinversion(5, 0) and (minwinspversion(5, 0, 2) and maxwinspversion(5, 0, 4))) then begin
        if (not RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Updates\Windows 2000\SP5\KB835732\Filelist')) then
            AddProduct('kb835732.exe',
                '/passive /norestart',
                CustomMessage('kb835732_title'),
                CustomMessage('kb835732_size'),
                kb835732_url,
                false, false);
    end;
end;

QuestionDirectX InstallationmemberTheRacerMaster26 Oct '12 - 17:47 
Is it possible for a DirectX version of this script? I am making an installer for a game, and need to install DirectX as a dependency.
Thanks!
AnswerRe: DirectX Installationmemberdaveaton9 Mar '13 - 16:40 
I was having the same issue.. there was nobody who had a working model that I could see.. so I just wrote my own...
 
http://stackoverflow.com/questions/15317563/inno-setup-trying-to-create-a-new-install-directx-template-product-for-modular-i
 
Please let me know if it helped you.
 
Thanks,
David Eaton
GeneralRe: DirectX Installationmemberstfx9 Mar '13 - 23:28 
Any reason why you did not use compareversion function of stringversion.iss file (need to be included in setup.iss)? Also MinVersion should be a parameter to allow having a different minimum required directX version
procedure directX(MinVersion: string);
begin
    if (compareversion(version, MinVersion) < 0) then

GeneralRe: DirectX Installationmemberdaveaton10 Mar '13 - 7:36 
Not really, that could explain alot.
 
I was using code based from this.. http://www.vincenzo.net/isxkb/index.php?title=DirectX_-_How_to_detect_DirectX_version[^]
 
I kept getting a conflict, so I renamed i to CompareDirectXVersion
 
Smile | :)
 
Does it work better with the min code.. if so post it.. I love making it better.
 
-David Eaton
Questiondependency file not added to output setup.exememberMember 80634354 Oct '12 - 13:23 
great tool btw. it is working fine other than i only require .net 4 framework client, so i disabled all others in setup.iss except
 
#define use_dotnetfx40
 
i then placed dotNetFx40_Client_setup.exe in the following folder
 
bin\MyProgramDependencies
 
but when i compile the setup.exe it is still only 5 mb in size which is all my app files it is not including the 40mb dotNetFx40_Client_setup.exe within the setup.exe??
AnswerRe: dependency file not added to output setup.exememberMember 80634355 Oct '12 - 1:38 
i even took you initial example program and just used it and did the same thing with the same results? i even copied the
 
MyProgram-4.0.exe
MyProgramDependencies
 
with the dotNetFx40_Client_setup.exe in the MyProgramDependencies folder, to the host witout .net client 4.0 and still it wanted to go download .net 4 client from msft??

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web02 | 2.6.130516.1 | Last Updated 23 Sep 2011
Article Copyright 2007 by stfx
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid