Instalacja VSTO Add-in'a u klienta tak, by nie wyskakiwał monit zaufania

0

Tak jak napisałam w temacie, generalnie to chodzi o to, żeby zainstalować klientowi add-in vsto, ale tak, by nie wyskoczył mu żaden monit na ten temat. Add-in nie może znajdować się w Program Files (znajduje się w pewnym podfolderze %APPDATA%). Jest podpisany certyfikatem, wydawca wyświetla się jako znany.

VSTO Runtime jest instalowany poprzez Process.Start z parametrem "po cichu". Instaluję wersję 3.0.

A żeby przeszła "cicha" instalacja, musimy dodać naszego add-ina do inclusion list https://msdn.microsoft.com/library/bb398239(v=vs.100).aspx
Zrobiłam dokładnie tak jak podano, z tą różnicą, że w referencji mam Microsoft.VisualStudio.Tools.Office.Runtime.v9.0, a nie Microsoft.VisualStudio.Tools.Office.Runtime.v10.0 (ponieważ v10 nie wyświetla się na liście dostępnych referencji).

Mój kod (oczywiście klucz jes skrócony dla przejrzystości):

private void AddAddInToInclusionList()
{
MessageBox.Show("VSTO: " + IsVSTORuntimeVersionOk());

        const string publicKey = "<RSAKeyValue><Modulus>ioXYqI6vL1t9C8W7</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";
        var solutionLocation = new Uri(VstoAddInPath);

        var entry = new AddInSecurityEntry(solutionLocation, publicKey);
        UserInclusionList.Add(entry);
    }

Metoda IsVSTORuntimeOk jest dość banalnym sprawdzeniem, czy jest taki klucz, jak się spodziewam:
<code class="c#">
private bool IsVSTORuntimeVersionOk()
        {
            var key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Wow6432Node\Microsoft\VSTO Runtime Setup\v9.0.21022");
            return (key != null);
        }

Mam świadomość, że jest to sprawdzenie niepełne, jednak na razie chcę doprowadzić to do działania, a potem będę ewentualnie rozbudowywać, by działało też z innymi wersjami.

Teraz z czym mam problem - powyższy kod działa, ale dopiero za drugim (i każdym następnym) razem. Za drugim razem dostanę MessageBoxa z komunikatem "VSTO: True" i wszystko się normalnie instaluje.

Natomiast za pierwszym razem dostaję wyjątek:

Nie można załadować pliku lub zestawu 'Microsoft.VisualStudio.Tools.Office.Runtime.v9.0, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f711d50a3a' lub jednego z jego zależności. Nie można odnaleźć określonego pliku.

System.IO.FileNotFoundException: Nie można załadować pliku lub zestawu 'Microsoft.VisualStudio.Tools.Office.Runtime.v9.0, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' lub jednej z jego zależności. Nie można odnaleźć określonego pliku.
Nazwa pliku: 'Microsoft.VisualStudio.Tools.Office.Runtime.v9.0, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
w InstalatorSM.MainForm.AddAddInToInclusionList()
w InstalatorSM.MainForm.InstallAddIn()
w InstalatorSM.MainForm.RegisterLibs()
w InstalatorSM.MainForm.installBtn_Click(Object sender, EventArgs e)

(...)

DZIENNIK: użycie pliku konfiguracji komputera z C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
DZIENNIK: odwołanie po zastosowaniu zasad: Microsoft.VisualStudio.Tools.Office.Runtime.v9.0, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
DZIENNIK: to samo powiązanie było widoczne wcześniej i nie powiodło się z hr = 0x80070002.

No i wtedy mój message box się nie pojawia, chyba że wyciągnę go przed funkcję - wtedy pokazuje również true, jakby nigdy nic. Co więcej, jak zaraz po takim wywaleniu wyjątku zaglądam do rejestru, to tam mój add-in całkiem bezczelnie w inclusion list sobie jest! (w HKCU\Software\Microsoft\VSTO\Security\Inclusion).

Aby znów uzyskać błąd, trzeba odinstalować VSTO Runtime.

Zrobiłam również taki test, że zainstalowałam najpierw VSTO Runtime, a dopiero wtedy odpaliłam mój instalator - błąd się nie pojawił. Zaczęłam więc podejrzewać, że źle instaluję runtime... ale nie widzę niestety błędu w moim kodzie, a ExitCode procesu instalacji to 0:

InstallProgramFromServer(_serwer + Getfile + "Instalator/vstor30.exe", "vstor30.exe", "/q");

private void InstallProgramFromServer(string url, string programName, string attributes)
{
var http = new Http();
http.SetLogin(_login);
http.SetPassword(_password);
var path = Path.GetTempPath() + programName;
http.Download2FileIfModified(url, path);

        var installerProcess = Process.Start(path, attributes);
        while (installerProcess.HasExited == false)
        {
            Application.DoEvents();
            System.Threading.Thread.Sleep(250);
        }
        MessageBox.Show(installerProcess.ExitCode.ToString());
    }

No i po powyższym jakby nie było - pojawiają się pliki vsto runtime, klucze w rejestrze, wpis w "Dodaj usuń programy"... No i najważniejsze - samo runtime działa... Mogę odpalić wcześniej zainstalowane add-iny itd.

Wybaczcie chaos w opisie - starałam się opisać problem tak dokładnie, jak się da.
1

Czy dobrze rozumiem, że instalujesz VSTO, i w ramach tego samego procesu po zainstalowaniu próbujesz go użyć? Być może dotnet nie widzi bibliotek, które mu się w trakcie działania programu nagle pojawiły..
Spróbuj po zainstalowaniu VSTO zrestartować instalator, np. z jakimś parametrem mówiącym, że instalacja VSTO już się zakończyła.

var key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Wow6432Node\Microsoft\VSTO Runtime Setup\v9.0.21022");

Zakładasz na sztywno, że system jest 64-bitowy. Na 32-bitowym nie ma Wow6432Node.
Prościej wymusić by instalator był 32-bitowy (a nie AnyCPU) i wtedy bez Wow6432Node.

0

Czy dobrze rozumiem, że instalujesz VSTO, i w ramach tego samego procesu po zainstalowaniu próbujesz go użyć?

Matko jedyna, masz rację! Jutro przetestuję, dzięki.

Zakładasz na sztywno, że system jest 64-bitowy. Na 32-bitowym nie ma Wow6432Node.
Prościej wymusić by instalator był 32-bitowy (a nie AnyCPU) i wtedy bez Wow6432Node.

Akurat ten fragment to wiem, że wymaga poprawki, ale prawdopodobnie będę musiała w ogóle obsłużyć różne wersje VSTO Runtime, więc zostawiłam sobie tą przyjemność na później.
Jednak mój instalator już jest 32-bitowy (a nie AnyCPU), a węzeł "HKLM\SOFTWARE\Microsoft\VSTO Runtime Setup" nie istnieje na 64 bitowym systemie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1