com исключение excel InteropServices.COMException - С#

Я получаю System.Runtime.InteropServices.COMException при запуске метода ниже от main()

Я хочу получить true и позже получить доступ к листу, если Excel открыт в системе. Я удостоверяюсь, что Excel открыт и sheet1 есть, но я получаю false и ошибку выше.

using Excel = Microsoft.Office.Interop.Excel;

         public static bool IsExcelOpened(string sheet1)
    {
        bool isOpened = true;
        Excel.Application exApp;
        exApp = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
        try
        {
            Excel.Worksheet xlWorksheet;
            xlWorksheet = (Excel.Worksheet)exApp.Workbooks.get_Item(sheet1);
        }
        catch (Exception)
        {
            isOpened = false;
        }
        return isOpened;
    }

EDIT: когда я запускаю VS2019 от имени администратора, я получаю больше информации об ошибке

Operation unavailable (Exception from HRESULT: 0x800401E3 (MK_E_UNAVAILABLE))


person user1207289    schedule 28.06.2019    source источник


Ответы (1)


Я думаю, что ваша проблема заключается в том, что Visual Studio работает в контексте, отличном от Excel.

Я попробовал слегка измененную версию вашего кода, и она отлично работает при запуске Visual Studio НЕ от имени администратора (тот же пользователь, с которым был открыт Excel).

Возможно, стоит также проверить, используете ли вы правильную версию dll interop.

public bool IsExcelOpened()
        {
            bool isOpened = false;

            try
            {
                Excel.Application exApp;
                Excel.Worksheet xlWorksheet;
                exApp = System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application") as Excel.Application;
                if(exApp != null)
                {
                    xlWorksheet = (Excel.Worksheet)exApp.ActiveSheet;
                    isOpened = true;
                }
            }
            catch { }
            return isOpened;
        }
person HockeyJ    schedule 28.06.2019
comment
Это работает. Единственное, мне нужно закрыть excel процесс из диспетчера задач, чтобы получить false. Когда я запустил excel от имени администратора и запустил свою версию кода, исходная ошибка исчезла, но я получил 'System.InvalidCastException' . Ты хоть представляешь, почему я получил это? xlWorksheet = (Excel.Worksheet)exApp.Workbooks.get_Item(sheet1); неправильный путь? - person user1207289; 28.06.2019
comment
Я не думаю, что ты сделал что-то неправильное. Я предпочитаю использовать «как» вместо прямого приведения, что дает вам возможность проверки нуля. Прямой кастинг выдаст ошибку, если он не будет удовлетворен. Мне не удалось заставить работать get_Item, поэтому я выбрал ActiveSheet. Все приложения Microsoft могут некоторое время зависать в фоновом режиме после закрытия, что немного раздражает. У нас не было работы вокруг. Мы только что добавили функцию «Убить всех Excel», которая, насколько я знаю, использовалась не так часто. - person HockeyJ; 28.06.2019