Naja, der Ansatz ist nicht das wahre.
Korrekterweise müsste dein Programm eine Installation haben und während der Installation würde es nach dem .NET Framework prüfen (das wäre definitiv die saubere und bessere Lösung).
Als Beispiel wie das mit
"NSIS" aussehen könnte (ohne direkten Download, aber das wäre sicher im Netz auch auffindbar)
Code:
Function AbortIfBadFramework
;Save the variables in case something else is using them
Push $0
Push $1
Push $2
Push $3
Push $4
Push $R1
Push $R2
Push $R3
Push $R4
Push $R5
Push $R6
Push $R7
Push $R8
StrCpy $R5 "0"
StrCpy $R6 "0"
StrCpy $R7 "0"
StrCpy $R8 "0.0.0"
StrCpy $0 0
loop:
;Get each sub key under "SOFTWARE\Microsoft\NET Framework Setup\NDP"
EnumRegKey $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP" $0
StrCmp $1 "" done ;jump to end if no more registry keys
IntOp $0 $0 + 1
StrCpy $2 $1 1 ;Cut off the first character
StrCpy $3 $1 "" 1 ;Remainder of string
;Loop if first character is not a 'v'
StrCmpS $2 "v" start_parse loop
;Parse the string
start_parse:
StrCpy $R1 ""
StrCpy $R2 ""
StrCpy $R3 ""
StrCpy $R4 $3
StrCpy $4 1
parse:
StrCmp $3 "" parse_done ;If string is empty, we are finished
StrCpy $2 $3 1 ;Cut off the first character
StrCpy $3 $3 "" 1 ;Remainder of string
StrCmp $2 "." is_dot not_dot ;Move to next part if it's a dot
is_dot:
IntOp $4 $4 + 1 ; Move to the next section
goto parse ;Carry on parsing
not_dot:
IntCmp $4 1 major_ver
IntCmp $4 2 minor_ver
IntCmp $4 3 build_ver
IntCmp $4 4 parse_done
major_ver:
StrCpy $R1 $R1$2
goto parse ;Carry on parsing
minor_ver:
StrCpy $R2 $R2$2
goto parse ;Carry on parsing
build_ver:
StrCpy $R3 $R3$2
goto parse ;Carry on parsing
parse_done:
IntCmp $R1 $R5 this_major_same loop this_major_more
this_major_more:
StrCpy $R5 $R1
StrCpy $R6 $R2
StrCpy $R7 $R3
StrCpy $R8 $R4
goto loop
this_major_same:
IntCmp $R2 $R6 this_minor_same loop this_minor_more
this_minor_more:
StrCpy $R6 $R2
StrCpy $R7 R3
StrCpy $R8 $R4
goto loop
this_minor_same:
IntCmp R3 $R7 loop loop this_build_more
this_build_more:
StrCpy $R7 $R3
StrCpy $R8 $R4
goto loop
done:
;Have we got the framework we need?
IntCmp $R5 ${MIN_FRA_MAJOR} max_major_same fail end
max_major_same:
IntCmp $R6 ${MIN_FRA_MINOR} max_minor_same fail end
max_minor_same:
IntCmp $R7 ${MIN_FRA_BUILD} end fail end
fail:
StrCmp $R8 "0.0.0" no_framework
goto wrong_framework
no_framework:
MessageBox MB_OK|MB_ICONSTOP "Installation failed.$\n$\n\
This software requires Windows Framework version \
${MIN_FRA_MAJOR}.${MIN_FRA_MINOR}.${MIN_FRA_BUILD} or higher.$\n$\n\
No version of Windows Framework is installed.$\n$\n\
Please update your computer at http://windowsupdate.microsoft.com/."
abort
wrong_framework:
MessageBox MB_OK|MB_ICONSTOP "Installation failed!$\n$\n\
This software requires Windows Framework version \
${MIN_FRA_MAJOR}.${MIN_FRA_MINOR}.${MIN_FRA_BUILD} or higher.$\n$\n\
The highest version on this computer is $R8.$\n$\n\
Please update your computer at http://windowsupdate.microsoft.com/."
abort
end:
;Pop the variables we pushed earlier
Pop $R8
Pop $R7
Pop $R6
Pop $R5
Pop $R4
Pop $R3
Pop $R2
Pop $R1
Pop $4
Pop $3
Pop $2
Pop $1
Pop $0
FunctionEnd
Alternativ müsste meines wissens, auch im Visual Studio ein Installationsgenerator existieren (bin aber nicht sicher, ob dies auf Standard/Pro beschränkt ist, oder auch im Express gibt).
Ich weiss es wirkt doof, wegen 2-3 Dateien (Exe, DLL, evtl Config) eine Installationsroutine zu machen... aber das andere würde mich als "unbeholfenen Benutzer" noch mehr abschrecken ;)