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

Instalacja VSTO Add-in'a u klienta tak, by nie wyskakiwał monit zaufania
aurel
Moderator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 8 godzin
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);
    }
Kopiuj

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());
    }
Kopiuj

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.
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:mniej niż minuta
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.

Kopiuj
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.

edytowany 3x, ostatnio: Azarien
aurel
Moderator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 8 godzin
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.

Azarien
ale 32-bitowy proces powinien go tam widzieć - z przezroczystym przekierowaniem do wow6432node.
aurel
Ale magia! Super, szkoda, że jeszcze tak samo przezroczyście nie traktuje folderu c:\Windows\SysWow32 ;)
Azarien
yy... traktuje? to co 32-bitowy proces widzi jako system32, to 64-bitowy widzi jako syswow64. to co 64-bitowy widzi jako system32 nie jest bez kombinowania dostępne dla 32-bitowego.
aurel
To wspaniała wiadomość :)
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)