Sprawdzenie przed załadowaniem biblioteki

0

Tworzę w aplikacji dataGrida, którego przepisuję potem do Excela. Jeśli na komputerze jest zainstalowany Excel to wszystko gra, gorzej gdy nie ma Office, wtedy wyskakuje mi komunikat:

user image

wprowadziłem sprawdzanie w rejestrze systemu, czy jest zainstalowany office i tu zaczyna się niespodzianka:

private static bool IsOfficeInstalled()
        {
            RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\excel.exe");
            if (key != null)
            {
                key.Close();
            }
            return key != null;
        }

        private void button4_Click(object sender, EventArgs e)
        {
           
            if (IsOfficeInstalled())
            {
                    Microsoft.Office.Interop.Excel._Application app = new Microsoft.Office.Interop.Excel.Application();
                    Microsoft.Office.Interop.Excel._Workbook workbook = app.Workbooks.Add(Type.Missing);
                    Microsoft.Office.Interop.Excel._Worksheet worksheet = null;
                    (...) //tutaj przepisuję sobie do excela datagrida i ogólnie bawię się w formatowanie dokumentu
            }else{
                   MessageBox.Show("Wykryto brak pakietu Office");
            }
        }

przy uruchamianiu kodu powyżej na maszynie, na która nie ma zainstalowanego Office dostaję komunikat z początku wiadomości.
Jeśli zakomentuję 3 linijki zaczynające się od Microsoft.Office.Iterop bez problemu button4 działa i wykonuje się "else", czyli dostaję komunikat o braku pakietu Office. "IsOfficeInstalled()" zwraca false, co już sprawdziłem, także nie ma mowy o pomyłce na tym etapie. Dlaczego aplikacja wywala się na maszynie bez office, mimo że teoretycznie nie wchodzi do IF?

Dodam jeszcze, że nie mogę szybko zdebugować tego i przelecieć kodu linijka po linijce, bo na maszynie, gdzie mam VisualStudio jest Office, a testuję już sam plik exe na maszynie, gdzie Office nie mam.

0

Aplikacja w ogóle nie dochodzi do tego miejsca. Referencje są sprawdzane dużo wcześniej.

0

Ja myślę, że zamiast tego twojego niepewnego IsOfficeInstalled (*), lepiej od razu zrobić app = new Microsoft.Office.Interop.Excel.Application(); i po prostu sprawdzać czy nie jest null (albo łapać wyjątek, jeśli jakiś wyskakuje).

(*) którego nazwa kłamie, bo funkcja wcale nie sprawdza czy zainstalowano Office'a, tylko czy Excel jest wpisany w konkretnym kluczu rejestru...

0
Azarien napisał(a):

Ja myślę, że zamiast tego twojego niepewnego IsOfficeInstalled (*), lepiej od razu zrobić app = new Microsoft.Office.Interop.Excel.Application(); i po prostu sprawdzać czy nie jest null (albo łapać wyjątek, jeśli jakiś wyskakuje).

(*) którego nazwa kłamie, bo funkcja wcale nie sprawdza czy zainstalowano Office'a, tylko czy Excel jest wpisany w konkretnym kluczu rejestru...

tak wiem, masz rację, ale klucz do Excela zawsze jest taki sam, a o Excela mi chodziło, zastosowałem tylko szybki skrót myślowy. Co do app = new Microsoft(...) to też od razu błąd dostawałem i zamiast pakować to do try/catch przy włączaniu aplikacji od razu sprawdzam, czy jest Excel i jeśli nie to ukrywam button4. Działa i o to chodziło.

Dzięki za (p)odpowiedzi!

0

i zamiast pakować to do try/catch przy włączaniu aplikacji od razu sprawdzam, czy jest Excel
I źle, bo jest zapewne mnóstwo innych powodów dla których może się utworzenie obiektu nie udać, niż brak tego konkretnego wpisu w rejestrze...

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