2012-02-27 4 views
0

Excel 추가 기능이 있습니다. C#, Add-In Express로 작성되었습니다. 설치 프로그램은 VS의 설치 프로젝트에서 빌드됩니다. 이제 더 큰 다른 추가 기능 응용 프로그램 (예 : )을 A의 설치 중에 제거 할 수있게하려고합니다. B는 C#으로도 작성되었지만 설치 프로그램은 고급 설치 프로그램에서 작성됩니다.프로그래밍 방식으로 응용 프로그램 제거

나는 아래와 같이 VBA를 시도했지만, AddIns는 "A XLL Add In"만 포함하고 "COM Add In"은 포함하지 않습니다. 그래서 그것은 작동하지 않습니다. 그래서 나는 A가 설치되어 있는지 감지하고 만약 그렇다면 그것을 제거하기 위해 exe를 쓰려고 생각하고있다. 그리고 B의 설치 프로그램에서 exe를 호출하십시오.
"C#에서 프로그램을 제거하는 방법"을 아는 사람이 있습니까? 또는 더 나은 해결책이 있습니까? 덕분에 일단 A를 감지하고 exe에서 제거하면 B의 설치 프로그램에서이 파일을 후크 할 수 있습니다. .NET의 설치 프로그램/제거 프로그램 클래스는 B 설치 프로그램에서 사용하지 않기 때문에 옵션이 아닙니다.

Dim item As AddIn 
Set item = Application.AddIns("A COM Add In") 

If Not item Is Nothing Then 
    item.Installed = False 
    'item = Nothing 'Not sure if this does anything 
End If 

    Dim item As AddIn 
Set item = Application.AddIns("A XLL Add In") 

If Not item Is Nothing Then 
    item.Installed = False 
    'item = Nothing 'Not sure if this does anything 
End If 

답변

1

동안 MSI에 의해 제거됩니다 직접 MSI를 호출하여 이전 버전을 제거 할 수 있습니다

msiexec /x YOUR-PRODUCT-CODE 

는 추가 기능 A.

당신은 완전히 UI를 억제하는 /qn 옵션을 추가 할 수 있습니다

를 설치하여 MSI 패키지에 사용 된 실제 제품 ID와 YOUR-PRODUCT-CODE를 교체합니다.

MSI는 제품이 설치되었는지 확인하고 제거하는 데 사용할 수있는 API도 제공합니다.

0

귀하의 접근 방식은 정확 - 특히 당신이 전제 조건을 충족하는지 확인합니다 Setup.exe를해야한다 만들고있는 EXE. 즉, A를 제거합니다.

setup.exe를 만드는 방법은 매우 손쉽게해야하는 도구에 달려 있습니다.이 특별한 측면에서 보면 wix3.0을 사용하기 때문에 많은 도움을받을 수 있습니다.

+0

고마워요. 미안하지만 분명하지 않습니다. 이미 설치 프로그램 B를 만들었고 정상적으로 작동합니다. 내 질문은 C에서 프로그램을 제거하는 방법입니다 #? 해결되면 B의 설치 프로그램에서 exe를 연결할 수 있습니다. – toosensitive

+1

ok - 다른 msi가 이미 실행되는 동안 실행하지 않으려면 Process.Start() 호출이 가장 좋습니다. msiexec.exe – dice

+0

감사합니다 @dice. 예, msiexec.exe @ http://social.msdn.microsoft.com/forums/en-us/netfxbcl/thread/CA866421-1D38-459E-822F-622E57046A04를 사용하여 제거 할 샘플 코드를 발견했습니다. 그것은 작동합니다. 감사! – toosensitive

0

WMI-ManagementObject을 사용하여이를 수행 할 수 있습니다.

ManagementObjectSearcher search = new ManagementObjectSearcher("SELECT * FROM Win32_Product"); 

ManagementObject product = search.Get().Cast<ManagementObject>().ToList().Where(obj 
=> obj["Name"].ToString().StartsWith([Name of product to Uninstall])).FirstOrDefault(); 

if (uninstallObject != null) 
    object result = product.InvokeMethod("Uninstall", null); 
+0

Win32_Product는 매우 느리며 버그가 있습니다. WiX의 DTF 라이브러리에있는 Microsoft.Deployment.WindowsInstaller interop을 사용하는 것이 좋습니다. Win32_Product가 구현하기에는 좋지 않은 기본 MSI Win32 API 호출을 직접 캡슐화하는 클래스를 관리합니다. –

+0

@ChristopherPainter'Microsoft.Deployment.WindowsInstaller' interop을 사용하는 예제를 어디서 찾을 것인가? – Kyle

+1

내 블로그에는 많은 예제가 있습니다. 라이브러리에는 샘플이 포함 된 SDK 도움말 파일이 제공됩니다. –

1

두 설치 프로그램에 동일한 업그레이드 코드를 사용할 수 있습니다. 업그레이드 코드는 동일하며 설치 B는보다 높은 버전이있는 경우, 패키지는 B.

의 설치
관련 문제