Visual Studio 2012 için Visual C ++ Yeniden Dağıtılabilir'in yüklü olup olmadığını algılama


109

Visual Studio 2012 için Visual C ++ Yeniden Dağıtılabilir'in yüklü olup olmadığı nasıl tespit edilir?

Google'ı denedim ve kimse bu soruyu sormadı, sürpriz!


1
Neden C ++> Kod oluşturmada Runtime kitaplığını Multi-threaded [debug] dll yerine Multi-threaded [debug] olarak ayarlayarak bu bağımlılığı kaldırmıyorsunuz? Sadece bağımlılığı kaldırarak bir çalışma zamanı redist yüklemesi sorununu çözdüm.
Cem Kalyoncu

Paketleri deneme yanılma yoluyla nasıl tespit edeceğimi öğrendim. Keşke sihirli bir mermi olsaydı, ama varsa, henüz bulamadım. Şu anda çoğuna yardımcı olmak için zamanın% 100'ünde işe yarıyor gibi görünen bazı özel redistler için aşağıda bir cevabım var .
kayleeFrye_onDeck

3
Lütfen kabul edilen yanıtı kayleeFrye_onDeck ile değiştirmeyi düşünün. Güvenilir bir yöntem aramak için uzun zamandır harcadım ve bu tek gibi görünüyor, diğer tüm güvenilmez cevaplarla birlikte birçok insanın doğru bilgiyi bulmasına yardımcı olacağını düşünüyorum
musefan

Visual Studio 2017 çalışma zamanları için bir güncelleme var gibi görünüyor: 14.10.V25017. Bağlantı: go.microsoft.com/fwlink/?LinkId=746572 Kayıt defteri değerlerini güncelleyebilir misiniz?
karel vergauwe

Yanıtlar:


172

Hangi sürümü kullandığınıza bağlıdır. Bu iki 2012 anahtarı, Güncelleme 4 için indirmek üzere karşılık gelen sürümleriyle benim için iyi çalıştı. Lütfen bu kayıt konumlarından bazılarının işletim sistemine bağlı olabileceğini unutmayın. Bu bilgileri bir Windows 10 x64 kutusundan topladım . Kurulumu algılamak için aradığım tüm bu redist sürümlerini ve reg anahtarlarını dökeceğim:


Visual C ++ 2005

Microsoft Visual C++ 2005 Redistributable (x64)
Registry Key: HKLM\SOFTWARE\Classes\Installer\Products\1af2a8da7e60d0b429d7e6453b3d0182
Configuration: x64
Version: 6.0.2900.2180

Doğrudan İndirme URL'si: https://download.microsoft.com/download/8/B/4/8B42259F-5D70-43F4-AC2E-4B208FD8D66A/vcredist_x64.EXE

Microsoft Visual C++ 2005 Redistributable (x86)
Registry Key: HKLM\SOFTWARE\Classes\Installer\Products\c1c4f01781cc94c4c8fb1542c0981a2a 
Configuration: x86
Version: 6.0.2900.2180

Doğrudan İndirme URL'si: https://download.microsoft.com/download/8/B/4/8B42259F-5D70-43F4-AC2E-4B208FD8D66A/vcredist_x86.EXE


Visual C ++ 2008

Microsoft Visual C++ 2008 Redistributable - x64 9.0.30729.6161 (SP1)
Registry Key: HKLM\SOFTWARE\Classes\Installer\Products\67D6ECF5CD5FBA732B8B22BAC8DE1B4D 
Configuration: x64
Version: 9.0.30729.6161 (Actual $Version data in registry: 0x9007809 [DWORD])

Doğrudan İndirme URL'si: https://download.microsoft.com/download/2/d/6/2d61c766-107b-409d-8fba-c39e61ca08e8/vcredist_x64.exe

Microsoft Visual C++ 2008 Redistributable - x86 9.0.30729.6161 (SP1)
Registry Key: HKLM\SOFTWARE\Classes\Installer\Products\6E815EB96CCE9A53884E7857C57002F0
Configuration: x86
Version: 9.0.30729.6161 (Actual $Version data in registry: 0x9007809 [DWORD])

Doğrudan İndirme URL'si: https://download.microsoft.com/download/d/d/9/dd9a82d0-52ef-40db-8dab-795376989c03/vcredist_x86.exe


Visual C ++ 2010

Microsoft Visual C++ 2010 Redistributable (x64)
Registry Key: HKLM\SOFTWARE\Classes\Installer\Products\1926E8D15D0BCE53481466615F760A7F 
Configuration: x64
Version: 10.0.40219.325

Doğrudan İndirme URL'si: https://download.microsoft.com/download/1/6/5/165255E7-1014-4D0A-B094-B6A430A6BFFC/vcredist_x64.exe

Microsoft Visual C++ 2010 Redistributable (x86)
Registry Key: HKLM\SOFTWARE\Classes\Installer\Products\1D5E3C0FEDA1E123187686FED06E995A 
Configuration: x86
Version: 10.0.40219.325

Doğrudan İndirme URL'si: https://download.microsoft.com/download/1/6/5/165255E7-1014-4D0A-B094-B6A430A6BFFC/vcredist_x86.exe


Görsel C ++ 2012

Microsoft Visual C++ 2012 Redistributable (x64)
Registry Key: HKLM\SOFTWARE\Classes\Installer\Dependencies\{ca67548a-5ebe-413a-b50c-4b9ceb6d66c6} 
Configuration: x64
Version: 11.0.61030.0

Doğrudan İndirme URL'si: https://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-B699-5E9B7962F9AE/VSU_4/vcredist_x64.exe

Microsoft Visual C++ 2012 Redistributable (x86)
Registry Key: HKLM\SOFTWARE\Classes\Installer\Dependencies\{33d1fd90-4274-48a1-9bc1-97e33d9c2d6f} 
Configuration: x86
Version: 11.0.61030.0

Doğrudan İndirme URL'si: https://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-B699-5E9B7962F9AE/VSU_4/vcredist_x86.exe

sürüm uyarısı : Kullanıcı başına Wai Ha Lee'nin bulguları, "... VC ++ 2012 güncelleme 4 ( 11.0.61030.0) ile birlikte gelen ikili dosyalar 11.0.60610.1ATL ve MFC ikili dosyaları 11.0.51106.1için ve diğer her şey için, örneğin msvcp110.dll ve msvcr110.dll sürümüne sahiptir . .."


Görsel C ++ 2013

Microsoft Visual C++ 2013 Redistributable (x64)
Registry Key: HKLM\SOFTWARE\Classes\Installer\Dependencies\{050d4fc8-5d48-4b8f-8972-47c82c46020f} 
Configuration: x64
Version: 12.0.30501.0

Doğrudan İndirme URL'si: https://download.microsoft.com/download/2/E/6/2E61CFA4-993B-4DD4-91DA-3737CD5CD6E3/vcredist_x64.exe

Microsoft Visual C++ 2013 Redistributable (x86)
Registry Key: HKLM\SOFTWARE\Classes\Installer\Dependencies\{f65db027-aff3-4070-886a-0d87064aabb1} 
Configuration: x86
Version: 12.0.30501.0

Doğrudan İndirme URL'si: https://download.microsoft.com/download/2/E/6/2E61CFA4-993B-4DD4-91DA-3737CD5CD6E3/vcredist_x86.exe


Görsel C ++ 2015

2015-2019 paketini alternatif olarak kullanmayı düşünün

Microsoft Visual C++ 2015 Redistributable (x64) - 14.0.24215
Registry Key: HKLM\SOFTWARE\Classes\Installer\Dependencies\{d992c12e-cab2-426f-bde3-fb8c53950b0d}
Configuration: x64
Version: 14.0.24215.1

Doğrudan İndirme URL'si: https://download.microsoft.com/download/6/A/A/6AA4EDFF-645B-48C5-81CC-ED5963AEAD48/vc_redist.x64.exe

Microsoft Visual C++ 2015 Redistributable (x86) - 14.0.24215
Registry Key: HKLM\SOFTWARE\Classes\Installer\Dependencies\{e2803110-78b3-4664-a479-3611a381656a}
Configuration: x86
Version: 14.0.24215.1

Doğrudan İndirme URL'si: https://download.microsoft.com/download/6/A/A/6AA4EDFF-645B-48C5-81CC-ED5963AEAD48/vc_redist.x86.exe


Görsel C ++ 2017

2015-2019 paketini alternatif olarak kullanmayı düşünün

Uyarı : Kullanılan yeni bir 2017 kayıt defteri kuralı var veya henüz sonuçlandırılmadı. Tahmin ettiğim gibi en üstteki anahtarlar: [HKEY_CLASSES_ROOT\Installer\Dependencies\,,amd64,14.0,bundle] ve [HKEY_CLASSES_ROOT\Installer\Dependencies\,,x86,14.0,bundle]

değişebilir veya en azından farklı iç içe geçmiş GUID'lere sahipse, GUID ile biten anahtarı listeyi kullanacağım.

Microsoft Visual C++ 2017 Redistributable (x64) - 14.16.27012
Registry Key: [HKEY_CLASSES_ROOT\Installer\Dependencies\VC,redist.x64,amd64,14.16,bundle\Dependents\{427ada59-85e7-4bc8-b8d5-ebf59db60423}]
Configuration: x64
Version: 14.16.27012.6

Doğrudan İndirme URL'si: https://download.visualstudio.microsoft.com/download/pr/9fbed7c7-7012-4cc0-a0a3-a541f51981b5/e7eec15278b4473e26d7e32cef53a34c/vc_redist.x64.exe

Microsoft Visual C++ 2017 Redistributable (x86) - 14.16.27012
Registry Key: [HKEY_CLASSES_ROOT\Installer\Dependencies\VC,redist.x86,x86,14.16,bundle\Dependents\{67f67547-9693-4937-aa13-56e296bd40f6}]
Configuration: x86
Version: 14.16.27012.6

Doğrudan İndirme URL'si: https://download.visualstudio.microsoft.com/download/pr/d0b808a8-aa78-4250-8e54-49b8c23f7328/9c5e6532055786367ee61aafb3313c95/vc_redist.x86.exe


Visual C ++ 2019 ( 2015-2019 paketi )

Uyarı : Visual C ++ 2019 için kullanılan başka bir yeni kayıt defteri kuralı var. Ayrıca Visual C ++ 2019 için bağımsız bir yükleyici görünmüyor, yalnızca Visual C ++ 2015'ten 2019'a kadar olan bu paket yükleyici.

14.21.27702

Microsoft Visual C++ 2015-2019 Redistributable (x64) - 14.21.27702
Registry Key: [HKEY_CLASSES_ROOT\Installer\Dependencies\VC,redist.x64,amd64,14.21,bundle\Dependents\{f4220b74-9edd-4ded-bc8b-0342c1e164d8}]
Configuration: x64
Version: 14.21.27702  

Doğrudan İndirme URL'si: https://download.visualstudio.microsoft.com/download/pr/9e04d214-5a9d-4515-9960-3d71398d98c3/1e1e62ab57bbb4bf5199e8ce88f040be/vc_redist.x64.exe

Microsoft Visual C++ 2015-2019 Redistributable (x86) - 14.21.27702
Registry Key: [HKEY_CLASSES_ROOT\Installer\Dependencies\VC,redist.x86,x86,14.21,bundle\Dependents\{49697869-be8e-427d-81a0-c334d1d14950}]
Configuration: x86
Version: 14.21.27702

Doğrudan İndirme URL'si: https://download.visualstudio.microsoft.com/download/pr/c8edbb87-c7ec-4500-a461-71e8912d25e9/99ba493d660597490cbb8b3211d2cae4/vc_redist.x86.exe

14.22.27821

Microsoft Visual C++ 2015-2019 Redistributable (x86) - 14.22.27821
Registry Key: [HKEY_CLASSES_ROOT\Installer\Dependencies\VC,redist.x86,x86,14.22,bundle\Dependents\{5bfc1380-fd35-4b85-9715-7351535d077e}]
Configuration: x86
Version: 14.22.27821

Doğrudan İndirme URL'si: https://download.visualstudio.microsoft.com/download/pr/0c1cfec3-e028-4996-8bb7-0c751ba41e32/1abed1573f36075bfdfc538a2af00d37/vc_redist.x86.exe

Microsoft Visual C++ 2015-2019 Redistributable (x86) - 14.22.27821
Registry Key: [HKEY_CLASSES_ROOT\Installer\Dependencies\VC,redist.x64,amd64,14.22,bundle\Dependents\{6361b579-2795-4886-b2a8-53d5239b6452}]
Configuration: x64
Version: 14.22.27821

Doğrudan İndirme URL'si: https://download.visualstudio.microsoft.com/download/pr/cc0046d4-e7b4-45a1-bd46-b1c079191224/9c4042a4c2e6d1f661f4c58cf4d129e9/vc_redist.x64.exe


Değişiklik günlüğü :
19 Ağustos 2019 - 2015-2019 paket sürümünün yeni bir sürümü eklendi
13 Haziran 2019 - 2015-2019 paket sürümü için yeni bir bölüm 14.21.27702eklendi ve 2015 ve 2017 bölümlerine kullanımın dikkate alınmasıyla ilgili küçük notlar eklendi alternatif olarak yeni paket.
14 Aralık 2018 - 9.0.30729.6161Jim Wolff'un bulgularına göre Servis Paketi 1'in güncellemesi
için MSVC2008 güncellendi - 27 Kasım 2018 - MSVC2017 - 14.16
12 Eylül 2018 için güncellendi - Wai Ha Lee'nin bulguları başına 2012 Güncellemesi 4'e sürüm uyarısı eklendi
, 24 Ağustos, 2018 - VS 2017 15.8.1 ile paketlenmiş güncellenmiş Visual C ++ bağımlılıkları olan 14.15.26706 için 2017 sürümü güncellendi
16 Mayıs 2018 - Yeni C ++ 2017 girişi
olarak 14.14.26405.0 için 2017'nin sürümü güncellendi 8 Eylül 2017 - Yeni Visual C ++ 2017 girişi olarak 2017'nin 14.11.25325.0 sürümü güncellendi
7 Nisan 2017 - 2017'nin 14.10 sürümü güncellendi .25008.0, yeni Visual C ++ 2017 girişi olarak
24 Ekim 2016 - 14.0.24215.1 için 2015'in sürüm bilgisi
güncellendi - 14.0.24212 için 2015'in sürüm bilgisi
güncellendi 27 Mayıs 2016 - MSVC2015 Güncellemesi 2 için güncellendi

Bunlardan herhangi biri güncelliğini yitirirse lütfen benimle buradan iletişime geçin.


4
Bu harika. Bu, Visual Studio yüklendiğinde veya çalışma zamanı kaldırıldığında yanlış pozitifler vermediğini bulduğum tek kişi.
AN

2
VS2015 Ön Güncelleme 1'in GUID'si {74d0e5db-b326-4dae-a6b2-445b9de1836e} olduğundan, bu mekanizmayı kullanarak zor duruma düşebilirsiniz. Gelecekteki her güncelleme için! 1. Güncelleme öncesi VCRedist'i Güncelleme 1 yüklü olarak başlatmak bana bir hata verdi - bu yüzden VC yükleyici kayıt anahtarını kullanacağım - VCRedist kullanıyorsanız bu iyi görünüyor?
GilesDMiddleton

4
maalesef bu VCREDIST 14.0 Güncelleme 2'yi içermiyor - ileriye dönük uyumlulukla nasıl başa çıkacağız (aynı çalışma zamanının daha yeni, sonraki sürümlerini tespit ederek)
Shaun Wilson

2
@ManjunathBabu, Visual C ++ yeniden dağıtılabilir yükleyicileri için kayıt defteri kurallarıyla ilgili herhangi bir harici belge olduğuna inanmıyorum. Sadece anlamlı bir ana anahtar adı olmayan bir yere başka bir GUID atmak yerine, 2017 için bu sefer bir şemaya benzeyen bir şeyi takip ettiklerini fark ettim. Şimdiye kadar, 2017 için piyasaya sürülen tüm yükleyiciler için bu konumları kullandılar: [HKEY_CLASSES_ROOT\Installer\Dependencies\,,x86,14.0,bundle\Dependents\{$GUID}ve[HKEY_CLASSES_ROOT\Installer\Dependencies\,,amd64,14.0,bundle\Dependents\{$GUID}
kayleeFrye_onDeck

2
Visual C ++ 2017'nin yeni paketi kayıt defteri yolunu değiştiriyor (Sürüm 14.16.27012.6)[HKEY_CLASSES_ROOT\Installer\Dependencies\VC,redist.x86,x86,14.16,bundle] [HKEY_CLASSES_ROOT\Installer\Dependencies\VC,redist.x64,amd64,14.16,bundle]
live2

31

Deneyin

HKLM\SOFTWARE\Microsoft\DevDiv\VC\Servicing\11.0

başlangıç ​​noktası olarak. Bunu, VC ++ 11 (VS 2012) çalışma zamanını yüklemek için bir kontrol olarak kullanacağım.


7
HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ DevDiv \ vc \ Servicing \ 11.0 \ RuntimeMinimum \ Install 1 olarak ayarlanmalıdır
Alex Spence

3
32 bit (x86 olarak da bilinir) için anahtar şu adreste bulunur:HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\DevDiv\VC\Servicing\11.0\RuntimeMinimum
CodeFox

@kayleeFrye_onDeck bunu nasıl yapacağınızı buldunuz mu? Yine de güvenilir bir yol arıyorum, ancak bu sayfadaki yanıtların hiçbiri benim için işe yaramadı
AN

UUID paketine dayanmadığı için kabul edilen yanıttan daha iyi yanıt, Microsoft'un sağladığı her yama için büyük olasılıkla değişecektir
jpo38

25

InstalledDeğerin 1bu kayıt defteri konumunda olup olmadığını kontrol edebilirsiniz : HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\11.0\VC\Runtimes\x8664 bit sistemlerde. Kayıt defteri anahtarına erişime neden olacak kodda HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\11.0\VC\Runtimes\x86. Yokluğuna dikkat edin Wow6432Node.

32 bitlik bir sistemde kayıt defteri aşağıdakiler olmadan aynıdır Wow6432Node:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\11.0\VC\Runtimes\x86


2012 VC ++ çalışma zamanı yüklü 32 bit Win7 makinem var ve bu reg anahtarım yok.
BryanJ

`HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ VisualStudio \ 11.0 \ VC`'ye sahip olmadığınızdan emin misiniz? Neye sahipsin?
Mike de Klerk

2
Bende var HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\11.0\VCama Runtimesanahtar bende değil . Dave'in cevabında anahtar bende var HKLM\SOFTWARE\Microsoft\DevDiv\VC\Servicing\11.0.
BryanJ

@BryanJ Her sistemin çok farklı olabileceği garip ... Bu faydalı bilgiyi eklediğiniz için teşekkürler
Mike de Klerk

3
Komik bir hikaye ve MS'ten gerçek bilgi yok. Sanırım şimdiye kadar bulduğum en iyi cevaba sahipsin. Vcredist'i relativley taze bir sanal makineye kurmak için test edildi ve daha sonra bulduğum tek anahtar bu. Öyleyse benim tarafımdan yukarı bak ...
anhoppe

12

Visual C ++ ile birlikte gönderilen önyükleyici paketi bildiriminde yükleme denetimi öğesi yoktur. Bir önkoşul olarak ayarlarsanız, Microsoft her zaman kurmak ister.

Elbette, VC redist paketinin MSI aracılığıyla kurulup kurulmadığını kontrol etmek için MsiQueryProductState'i yine de arayabilirsiniz, Paket kodu şu şekilde bulunabilir:

wmic product get

komut satırında veya zaten wmic: root \ cli adresindeyseniz, çalıştırın

product where "Caption like '%C++ 2012%'"

10

Bu basit soruların cevabı maalesef basit değil, tüm sistemlerin% 100'ünde çalışıyor ve hatta çok sayıda .net çerçevesine genişletilebilir.

Karmaşıklık, birçok VC çalışma zamanı revizyonunun mevcut olmasından (ve yapıldığından) kaynaklanmaktadır; bu durum, VC10 çalışma zamanlarının kurulu olmasına rağmen, yapı numaralarının yeterince yakın olmamasına ve bu nedenle, EXE'nizin, siz çok Tam olarak ihtiyaç duyduğunuz çalışma zamanları veya bu ve önceki sürümlerin aynı ana sürümün onunla çalışmasını sağlayan daha yeni çalışma zamanlarından biri (yan yana cehennem). Ayrıca, bir 64 bit EXE'niz varsa, her ikisini de, 32 VE 64 bit çalışma zamanlarını kontrol etmeniz gerekecektir.

Bununla birlikte, EXE'niz için çalışma zamanlarının yüklü olup olmadığını belirlemenin tek güvenilir yolu, EXE dosyasını çalıştırmayı denemektir. veya tek amacı yapmaktır aynı ana EXE olarak ayarlar ve ile inşa edilen bir başka EXE - - hiçbir şey. Sadece çalıştırın (bu, çalıştırma zamanlarının kurulu olduğu anlamına gelir) veya çalıştırılamaz (kurulmadığında).

VC10 32 ve 64 bit çalışma zamanlarının yüklü olmasını gerektiren bir yükleyici için aşağıdakileri yaptım: Yükleyici tüm sahte EXE'leri başlatmaya çalışır ve başarılı olursa, ilgili çalışma zamanının yüklü olduğu kabul edilir. Bu aynı zamanda 32/64 bit senaryosunu da çözer.

Bu arada, indirilebilir yerleşik .net 3.5 desteği de .net sürüm 3.0 ve 2.0'ı desteklediğinden, Windows 8 ve 10'da çok zor olan uygun .net çerçevesinin yüklü olup olmadığını belirlemek için de çalışır. bunlar için kayıt defteri girdisi yoktur. (Ve daha da kötüsü, hatta burada standart çerçeve montajcılar kullanamaz, sen gerekir yerleşik destek ve Windows üzerinden indirmek veya .net 4 ile uygulamanızı yeniden, ama bu başka bir hikaye kullanın).

C ++ kukla EXE, aşağıdaki koda sahip bir proje kullanılarak (ve gerekirse 64 bit yapılandırmada başka bir tane) oluşturulabilir:

int _tmain(int argc, _TCHAR* argv[])
{
    return 0;
}

MFC'yi paylaşılan bir DLL'de kullanmak için projenin özelliklerini ayarlamayı unutmayın. . Yürütülebilir dosyalar yaklaşık 4KB boyutunda olacak - kesin bir sonuç için ödenmesi gereken küçük bir bedel.

Kullanıcılarınıza güzel bir kurulum deneyimi sunmak için aşağıdakileri yapabilirsiniz (örnek kod NSIS içindir ):

Function TryLaunchApplication
  Pop $1 ; pathname
  nsExec::Exec $1
  Pop $0

  ${If} $0 == "error"
  ${OrIf} $0 != 0
    Push 0
  ${Else}
    Push 1
  ${EndIf}
FunctionEnd

ve bir işlevde çağırın, örneğin CheckRuntimes

Function CheckRuntimes
  ; Try to execute VC++ 10 application (32 bit)
  Push "Vc10RuntimeCheckerApp.exe"
  Call TryLaunchApplication
  Pop $Vc10RuntimesFound

  ; Add 64 bit check if required.
  ; Remember to try running the 64 bit EXE only on a 64 bit OS,
  ; which requires further checks.

  ; Try to execute .net application
  Push "DotNetRuntimeCheckerApp.exe"
  Call TryLaunchApplication
  Pop $DotNetFrameworkFound
FunctionEnd

Ardından, örneğin Karşılama sayfasından çıkarken çalışma zamanı kontrolünü başlatın ve sonucu önbelleğe alın, böylece kullanıcı "Geri" ve "İleri" düğmesini her tıkladığında yeniden kontrol etmeniz gerekmez.

Ardından, kurulum ağacında salt okunur bir bölüm oluşturun ve Bileşenler sayfası gösterilmeden önce çalıştırılan bir işlevde bunu önceden seçin veya seçimini kaldırın .

Bu, her eksik çalışma zamanı bileşeninin kurulumunun zorunlu olduğundan emin olmanızı sağlar ve zaten mevcutsa atlanır.


Yararlı ipucu için teşekkür ederim, ne tür bir projenin oluşturulması gerektiğini hatırlıyor musunuz? VS, aralarından seçim yapabileceğiniz bolluğa sahiptir :-).
greenoldman

9

Visual Studio 2010 ve sonraki sürümler WinSxS'i kullanmayı bıraktığından, yalnızca% windir% \ system32 \ msvcr110.dll dosyasını kontrol etmeniz yeterli olabilir. Yeterince yeni bir sürüme sahip olduğunuzu doğrulamak istiyorsanız, dosya sürümünün 11.0.50727.1 (VS2012 RTM) veya 11.0.51106.1 (VS2012 Güncelleme 1) olup olmadığını kontrol edebilirsiniz.


+1 Bu daha basit ve daha kusursuzdur. Kayıt defteri anahtarlarının hepsi iyi ve böyle, ancak kullanıcı sistemle uğraştıysa ve msvcr110.dll dosyasını sildiyse kayıt defteri kontrolü işe yaramaz. Yine de ihtiyacınız olan tüm bileşenleri kontrol etmeniz en iyisidir (msvcr110.dll, msvcp110.dll, mfc, ...). Güncelleme 3 için sürüm 11.0.60610.1'dir.
stijn

tamam son biti dikkate almayın: sadece yükleyici 11.0.60610.1 görünüyor, crt dll'lerin sürümü hala 11.0.51106.1
stijn

ya .dll 11.0.51106.1 vs2012 sp4 kurulu olmasına rağmen
Blub

Bu işe yaramayacak. 2005-2015'i kaldırdım ve hala 60, 100, 110, 120 ve 140 için msvc dosyalarım var.
kayleeFrye_onDeck

VC ++ 2012 güncelleme 4 ( 11.0.61030.0) ile birlikte gelen ikili dosyaların 11.0.60610.1ATL ve MFC ikili dosyaları için sürümüne sahip olduğunu ve11.0.51106.1 her şey için (ör. Msvcp110.dll ve msvcr110.dll) sürümüne sahip olduğunu unutmayın. Emin değilim neden. Sen giderek (I test ettik Windows 10 makinelerde) bu teyit edebilir C:\ProgramData\Package Cache\{BD95A8CD-1D9F-35AD-981A-3E7925026EBB}v11.0.61030\packages\vcRuntimeMinimum_x86ve C:\ProgramData\Package Cache\{B175520C-86A2-35A7-8619-86DC379688B9}v11.0.61030\packages\vcRuntimeAdditional_x86daha sonra .cab dosyaları dosyaları kontrol ediyor.
Wai Ha Lee

5

WiX tarafından oluşturulan bir MSI yükleyicisinin parçası olarak Visual C ++ yeniden dağıtılabilirliğini kontrol etme bağlamında bir cevap arayan bu soruya rastladım.

GUID'in sürüm ve işletim sistemiyle nasıl değiştiğini beğenmedim, bu yüzden Visual C ++ yeniden dağıtılabilir olup olmadığını kontrol etmek için C # ile yazılmış özel bir eylem oluşturdum.

Aşağıdaki her şey özellikle Visual C ++ 2015 Yeniden Dağıtılabilir (x64) içindir, ancak herhangi bir sürüm için kolayca değiştirilebilir.

using Microsoft.Deployment.WindowsInstaller;
using Microsoft.Win32;

namespace CustomActions
{
    public class DependencyChecks
    {
        [CustomAction]
        public static ActionResult IsVC2015RedistInstalled(Session session)
        {
            session.Log("Begin Visual C++ 2015 Redistributable installation check.");

            var dependenciesKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Classes\\Installer\\Dependencies");

            foreach(var subKey in dependenciesKey.GetSubKeyNames())
            {
                var dependency = dependenciesKey.OpenSubKey(subKey);
                var displayName = (string)dependency.GetValue("DisplayName");
                if(displayName != null)
                {
                    if (displayName.Contains("Microsoft Visual C++ 2015 Redistributable (x64)"))
                    {
                        session.Log("Visual C++ 2015 Redistributable is installed.");
                        return ActionResult.Success;
                    }
                }
            }

            session.Log("Visual C++ 2015 Redistributable is not installed.");
            session.Message(InstallMessage.Error, new Record(1, "This application requires Visual C++ 2015 Redistributable. Please install, then run this installer again. https://www.microsoft.com/en-us/download/details.aspx?id=53587"));
            return ActionResult.Failure;
        }
    }
}

Sonra wxs dosyasında

<Binary Id='VC2015RedistCheck' SourceFile='!(wix.ResourcesDir=resources)\CustomActions.CA.dll'/>
    <CustomAction
      Id='VC2015RedistCheckAction'
      Execute='immediate'
      BinaryKey='VC2015RedistCheck'
      DllEntry="IsVC2015RedistInstalled"
      Return='check'/>

<InstallExecuteSequence>
  <Custom Action='VC2015RedistCheckAction' After='InstallInitialize'/>
</InstallExecuteSequence>

Düzenle Bu yanıtı, özel bir eylem oluşturma ve kullanma hakkında bazı temel bilgilerle güncelliyorum.

WiX Toolset Visual Studio 2017 uzantısı yüklüyken Visual Studio 2017'de özel eylem oluşturmak için, proje şablonunu özel bir eylem oluşturmak için kullandım (WiX v3 için C # Özel Eylem Projesi).

Oluşturulan projeyi kontrol ettim ve bu makalenin başında listelenen değişikliklere sahip görünüyordu: https://www.codeproject.com/Articles/132918/Creating-Custom-Action-for-WIX-Written-in-Managed bu yüzden o makaleyi bölümden aldımAdding Custom Action to the Installer ve bazı ince ayarlarla onu takip ettim.

Yaptığım bir diğer şey de projenin oluşturduğu .NET çerçevesinin sürümünü 3.5'e değiştirmekti.

Gerçekten yararlı bulmadım, ancak http://wixtoolset.org/documentation/manual/v3/wixdev/extensions/authoring_custom_actions.html adresini de görebilirsiniz.


4

Benim için bu konum çalıştı: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ DevDiv \ vc \ Servicing \ 11.0 \ RuntimeMinimum \ Version

Paketi yükledikten sonra hangi sürüme sahip olduğunuzu kontrol edin ve bunu yükleyicinizde bir koşul olarak kullanın. (benimki VCred'i kurduktan sonra 11.0.50727 olarak ayarlandı).


Bu cevap tam olarak aradığımız şeydi (buradaki diğer cevaplara karşı, bunlar çalışma zamanı hakkında daha az ve maalesef Görsel stüdyo hakkında daha fazlası.)
Shaun Wilson

Yeniden listeleri kaldırdıktan sonra bu anahtar mevcut olduğundan, bu yanıt işe yaramaz.
kayleeFrye_onDeck

4

Denetim Masası> Programlar ve Özellikler'e gidin ve hepsi burada listelenir.

Uzman değilim ve bu cevap, insanların cevapladıklarıyla karşılaştırıldığında oldukça basit (kayıt defterini kontrol ediyor), bu yüzden doğru cevap olup olmadığından emin değilim ama benim için hile yaptı.

Programlar ve Özellikler


3
if RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\10.0\VC\VCRedist\x86","Installed") = 0 Then
  if RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\11.0\VC\Runtimes\x86","Installed") = 0 Then

3

Bunu InnoSetup ile yapmayı başardım.

Kayıt defteri anahtarının varlığını kontrol ettim:

HKLM\SOFTWARE\Microsoft\VisualStudio\11.0\VC\Runtimes

Kaldırılırsa, mevcut değildir. Yüklenmişse, var.

Bu arada, Wow6432Node'da da olabilir:

HKLM\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\11.0\VC\Runtimes


Bu doğru değil. Anahtarlar, kaldırıldıklarında her iki konumda da bulunur.
kayleeFrye_onDeck

1
@kayleeFrye_onDeck Evet ... Sana katılıyorum. Ama aslında ilk denediğimde başarılı oldu. Ama son zamanlarda söylediğin gibi. Neden böyle olduğunu bilmiyorum.
Fandi Susanto

3

Ürünün yükleme durumunu MsiQueryProductState aracılığıyla kontrol etmek, doğrudan kayıt defterini kontrol etmekle hemen hemen aynıdır , ancak yine de ProductCode için GUID'ye ihtiyacınız vardır .

Başka bir yerde belirtildiği gibi, bu yaklaşımların bir dezavantajı, her güncellemenin kendi ÜrünKoduna sahip olmasıdır!

Neyse ki MSI, bir ürün 'ailesini' tanımlayan bir Yükseltme Kodu sağlar . Bu bilgiyi çıkarmak için MSI'lardan birini açmak için orca'yı kullanabilirsiniz. Örneğin, VS2015'in yeniden dağıtılabilir için Yükseltme Kodu{65E5BD06-6392-3027-8C26-853107D3CF1A}

Söz konusu Yükseltme Kodu için tüm Ürün Kimliklerini almak için MsiEnumRelatedProducts'ı kullanabilirsiniz. Uygulamada, her yeniden güncelleme güncellemesi bir {B5FC62F5-A367-37A5-9FD2-A6E137C0096F}öncekinin yerini aldığı için, bu yalnızca bir Ürün Kodu verir - VS2015 Güncellemesi 2 x86 için olduğu gibi .

Ne olursa olsun, daha sonra MsiGetProductInfo (productCode, INSTALLPROPERTY_VERSIONSTRING, ...) veya benzer işlevler aracılığıyla sürümü kontrol ederek istediğiniz sürümle karşılaştırabilirsiniz, örneğin eşdeğer veya sonraki bir sürümü kontrol etmek için.

Not C ++ uygulaması içinde, ayrıca kullanabileceği _VC_CRT_MAJOR_VERSION, _VC_CRT_MINOR_VERSION, _VC_CRT_BUILD_VERSIONeğer #include <crtversion.h>- Eğer ikili ile inşa edildiğini hesapla CRT sürümünü belirlemek bu şekilde.


Bu bilgiyi nasıl elde ettiniz? Ve bu x86 sürümü için UpgradeCode mu yoksa x64 sürümü mü?
Ben Key

Orca'yı msi'yi açmak ve UpgradeCode'u çıkarmak için kullanabilirsiniz. Burada verilen en azından x86 içindir. Bilginin geri kalanını nereden aldığıma gelince, bu hemen hemen birincil kaynak; Bu yaklaşıma özel olarak yeniden listeyle ilgili başka referanslar bulamadım, ancak Yükseltme Kodu / aile kalıbı MSI yükleyicilerinde ortaktır.
adzm

Orca'nın farkındayım. Sorun, o MSI'ya ulaşmakla ilgili. Doğrudan erişmenin bir yolunu bilmiyorum. Bildiğim tek yol, onu bir şekilde c: \ Windows \ Installer dizininde bulmak. O dizinde 1000'den fazla dosyam var. Dosyalar rastgele adlandırılır. Hangi MSI'nın doğru olduğunu belirlemenin tek yolu açıklamaya bakmaktır. Bu, kaşifte 1.000 dosyada Alt + Enter tuşlarına basmayı veya 1.000 dosyanın açıklamalarını dökmek için bir araç kullanmayı içerir.
Ben Key

Ahh görüyorum. HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Installer \ UpgradeCodes içinde ürün kodunu biliyorsanız, yolu ve hatta yükseltme kodunu bulmak için kayıt defterinde de arama yapabilirsiniz. Ancak, geri kalanını anlamak için WMIC (veya msi db'ye başka bir programlı erişim) kullanmanız gerekebilir. wmic product get / format: csv arayabileceğiniz bir csv dökümü verecektir - döndürülen değerlerde msi yollarına sahiptir. Eminim daha iyi bir senaryo yazabilirsin ama bu seni yoluna sokmak için yeterli olmalı.
adzm

3

Bu PowerShell kodu hile yapmalı

Get-ItemProperty
HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | 
Select-Object DisplayName, DisplayVersion, Publisher, InstallDate |
Format-Table AutoSize

çünkü bir grup ürün kodunu gömmek işe yaramayacaktı, biz de her bir girişin "ürün adını" kontrol eden kayıt defterini bir normal ifadeyle sıralıyoruz, ardından VersionMajor / VersionMinor'u kontrol ediyoruz (gerçekten umursadığımız tek şey bu) bunun değeri var tek bir yapı üretmemize ve belirli bir vcredist sürümünün hizmet ömrü boyunca çalışmaya devam edeceğini bilmemize olanak sağladı. Buradaki amaç tamdır, ancak NSIS veya WinAPI tabanlı yükleyiciler gibi araç setlerinin harf çevirisini gerektirebilir.
Shaun Wilson

2

Aynı şeye ihtiyacım vardı ve AFAIK bu programlı olarak yapılamasa da benim için çalıştı.

Sadece Başlat -> Bir programı kaldır'a gittim ve bir sürüm numarası içeren yeniden dağıtılabilir VC ++ öğesini bulana kadar aşağı kaydırdım. Sürüm numarasını araştırırken, VS2012 SP1'e ait olduğunu söyledi.


2

Eski soru ama işte Visual Studio 2005'ten beri başarıyla kullandığımız yaklaşım. Ben de bunu Visual Studio 2012 Update 4 kullanarak test ettim (sonunda yazılımımızı 2010'dan 2012'ye güncellediğimiz için).

Visual C ++ Yeniden Dağıtılabilir paketleri, kaldırıcılarını pencerelere kaydettiğinden (bu nedenle Denetim Masası "Programlar ve Özellikler" listesinde görünür), kayıt defterinde kaldırıcı anahtarının Görünen Adını kontrol ederiz.

İşte ilgili NSIS kodu:

ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{33d1fd90-4274-48a1-9bc1-97e33d9c2d6f}\" "DisplayName"
StrCmp $0 "Microsoft Visual C++ 2012 Redistributable (x86) - 11.0.61030" vs2012redistInstalled
DetailPrint "Microsoft Visual C++ 2012 Update 4 Redistributable not found!"
DetailPrint "Downloading from www.mywebsite.com"
; insert applicable download code here
ExecWait '"<downloaded redist exe>" /promptrestart /passive'
vs2012redistInstalled:

Yükleyicimiz bir 32bit exe olduğundan, Windows kayıt defteri anahtarının yukarıdaki konum yerine sanallaştırılmış Wow6432Node'da olup olmadığını belirlemeyi ele alır, böylece yukarıdaki kod hem 64bit hem de 32bit Windows kurulumlarında her iki anahtarı da açıkça kontrol etmek zorunda kalmadan çalışır.

Ayrıca, yukarıdaki kodu VC ++ Redist'in farklı bir sürümüne güncellemek için, kayıt defteri anahtar yolundaki GUID'yi ve görünen adı ihtiyacınız olan şekilde değiştirmeniz yeterlidir.

Bu önerilen yöntem olmasa da, son 10 yılda XP / XP64'ten Windows 10'dan 2005, 2010, 2010sp1 ve şimdi 2012u4 için redistleri kullanarak her çeşit pencereyi çalıştıran 10.000'den fazla makinede çalıştı.


1

InstalledDeğerini kontrol ederdim

HKLM\SOFTWARE\[WOW6432Node]\Microsoft\Windows\CurrentVersion\Uninstall\{VCRedist_GUID} anahtar

  • nerede GUID VC++ 2012 (x86)DİR{33d1fd90-4274-48a1-9bc1-97e33d9c2d6f}
  • WOW6432NodeVC++ redistürüne bağlı olarak mevcut olacak veya olmayacak

0

Çoğu kişinin kaçırdığı şey, /reg:32Windows x64'te anahtarı kontrol etmek için gerekli olan şeydir.

Bu konuyla ilgili Microsoft Yardım makalesine bakın .

Burada, Visual Studio 2012 Güncelleştirme 4 için Visual C ++ Yeniden Dağıtılabilir'in nasıl doğru şekilde kontrol edileceğini gösteren bir komut dosyası verilmiştir.

@ECHO OFF

:Author
REM "CREATED BY WAR59312"
REM "FEB 7th 2017"

REM Clear Screen
CLS

TITLE Detect Visual C++ 2012 Redistributables

REM This Batch Script Detects If Visual C++ Redistributable for Visual Studio 2012 Update 4 Is Installed

:DetectWindowsOS
REM Are We Running On x86 Or x64
IF NOT DEFINED PROCESSOR_ARCHITEW6432 (
IF %PROCESSOR_ARCHITECTURE% EQU x86 (
REM Windows Is x86
GoTo Check32Bit
) ELSE (
REM Windows Is x64
SET NeededFor64BitOnly=/reg:32
GoTo Check64Bit
)) ELSE (
REM Windows Is Unknown But Assume x64 To Be Safe
SET NeededFor64BitOnly=/reg:32
GoTo Check64Bit
)

:Check64Bit
REM Checks If Visual C++ 64Bit Redistributable for Visual Studio 2012 Update 4 Is Installed
REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\11.0\VC\Runtimes\x64" /v "Version" %NeededFor64BitOnly% 2>NUL^ | (
  FIND "v11.0.61030.00" >NUL
) && (
  ECHO.
  ECHO 64bit Visual C++ Redistributable for Visual Studio 2012 Update 4 Is Installed
  ECHO.
  GoTo Check32Bit
) || (
   ECHO.
   ECHO 64bit Visual C++ Redistributable for Visual Studio 2012 Update 4 Is NOT Installed
   ECHO.
   GoTo Check32Bit
)

:Check32Bit
REM Checks If Visual C++ 32Bit Redistributable for Visual Studio 2012 Update 4 Is Installed
REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\11.0\VC\Runtimes\x86" /v "Version" %NeededFor64BitOnly% 2>NUL^ | (
  FIND "v11.0.61030.00" >NUL
) && (
   ECHO.
   ECHO 32bit Visual C++ Redistributable for Visual Studio 2012 Update 4 Is Installed
) || (
   ECHO.
   ECHO 32bit Visual C++ Redistributable for Visual Studio 2012 Update 4 Is NOT Installed
)

:END
ECHO.
PAUSE

EXIT

0

Powershell komut dosyası çözümü:

@KayleeFrye_onDeck yanıtındaki bilgilere göre

Kullanıcının belirttiği sürümleri kontrol eden ve yükleyen bir powershell betiği oluşturdum, onunla kapsamlı testler yapmadım, ancak kendi CI (Sürekli Entegrasyon) senaryom için mükemmel çalışıyor.

Tam komut dosyası ve github'daki bilgiler

Kullandığım yaklaşım, burada sağlanan bilgilere göre regkey'leri kontrol etmeye dayanıyordu. Aşağıdaki komut dosyasının ne yaptığının özüdür:

function Test-RegistryValue {
param (
 [parameter(Mandatory=$true)]
 [ValidateNotNullOrEmpty()]$Path,
 [parameter(Mandatory=$true)]
 [ValidateNotNullOrEmpty()]$Value
)
    try {
    Get-ItemProperty -Path "$($Path+$Value)" -ErrorAction Stop | Out-Null
        return $true
    }
    catch {
        return $false
    }
}

$redistInfoKayleeFrye_onDeck'in bilgilerinden derlenen bilgileri içeren kontrol / indirme / sessiz kurulum .

$redistInstalled = Test-RegistryValue -Path $redistInfo.RegPath -Value $redistInfo.RegValue
if($redistInstalled -eq $False) {
    Invoke-WebRequest -Uri $redistInfo.DownloadUrl -OutFile $downloadTargetPath
    Start-Process -FilePath $downloadTargetPath -ArgumentList "$($redistInfo.SilentInstallArgs)" -Wait -NoNewWindow | Wait-Process
}

Tam komut dosyası ve daha fazla bilgi şurada bulunabilir: github'da

Herkes katkıda bulunabilir, eğer zamanım olursa komut dosyası üzerinde daha kapsamlı testler yapacağım ve buraya bilgi eklendikçe yeni paketler eklemeye devam edeceğim.


0

VC 2012 için tüm kayıt defteri değerlerini almak zor, bu yüzden tüm bağımlılıkları geçecek ve belirtilen sürüme uyacak küçük bir işlev yazdım.

public static bool IsVC2012Installed()
{
    string dependenciesPath = @"SOFTWARE\Classes\Installer\Dependencies";

    using (RegistryKey dependencies = Registry.LocalMachine.OpenSubKey(dependenciesPath))
    {
        if (dependencies == null) return false;

        foreach (string subKeyName in dependencies.GetSubKeyNames().Where(n => !n.ToLower().Contains("dotnet") && !n.ToLower().Contains("microsoft")))
        {
            using (RegistryKey subDir = Registry.LocalMachine.OpenSubKey(dependenciesPath + "\\" + subKeyName))
            {
                var value = subDir.GetValue("DisplayName")?.ToString() ?? null;
                if (string.IsNullOrEmpty(value)) continue;

                if (Regex.IsMatch(value, @"C\+\+ 2012")) //here u can specify your version.
                {
                    return true;
                }
            }
        }
    }

    return false;
}

Bağımlılıklar:

using System.Text.RegularExpressions;
using Microsoft.Win32;
using System.Linq;

-5

Kayıt defterinde arama yapabilirsiniz. vs2012 yok ama benim vs2010 var.

3 platform paketinin her biri için 3 farklı (ancak çok benzer) kayıt defteri anahtarı vardır. Her anahtarın 1 değerinde "Yüklendi" adlı bir DWORD değeri vardır.

  • HKLM \ SOFTWARE \ Microsoft \ VisualStudio \ 10.0 \ VC \ Vcredist \ x86

  • HKLM \ SOFTWARE \ Microsoft \ VisualStudio \ 10.0 \ VC \ Vcredist \ x64

  • HKLM \ SOFTWARE \ Microsoft \ VisualStudio \ 10.0 \ VC \ Vcredist \ IA64

Bunun için kayıt fonksiyonunu kullanabilirsiniz ......


1
Bunu ilk satıra "VS2012'ye sahip olmadığımı" yazdım. Yani bunu yorumlamaya gerek yok ............. Ve bu sadece vs2010 içindi
vikky

1
Bunu not ettiniz, ancak çözümünüzün VS2012 için de işe yarayabileceğini öneriyor gibiydiniz, çünkü bu OP'nin sorusuydu (ancak VS2012'niz olmadığı için doğrulayamadınız). Ben sadece kontrol ettiğimden beri bu yaklaşımın aslında VS2012 ile çalışmadığını söylüyordum.
StellarEleven

Cevabımı neden aşağı oylayın ...... vs2012 için olduğunu açıkça yazdım ... ve bu kullanıcı tarafından cevap olarak kabul edildi .... öyleyse neden ???????????
vikky

1
Görünüşe göre x64 bit işletim sistemlerinde bu değerHKLM\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\10.0\VC\VCRedist\...
bas

1
VS 2012 anahtarları şunlardır: HKLM \ SOFTWARE \ Microsoft \ VisualStudio \ 11.0 \ VC \ RunTimes ____ HKLM \ SOFTWARE \ Wow6432Node \ Microsoft \ VisualStudio \ 11.0 \ VC \ RunTimes ___
Adam L
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.