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.