Взаимодействие с Excel: создание экземпляра с помощью Task.Run приводит к исключению System.EntryPointNotFoundException

Вот мой минимальный пример создания проблемы:

using System.Runtime.InteropServices;
using System.Threading.Tasks;
using Excel = Microsoft.Office.Interop.Excel;

class Program
{
    static void Main(string[] args)
    {
        Task.Run(() =>
        {
            Excel.Application app = new Excel.Application();

            if (app != null)
            {
                app.Quit();
                Marshal.FinalReleaseComObject(app);
                app = null;
            }
        });
    }
}

Это приводит к следующему исключению:

Последняя часть на японском говорит "EventSetInformation" of DLL advapi32.dll entry point cannot be found, Мне трудно понять, что происходит. В основном, почему выбрасывается это исключение и что оно пытается мне сказать?

1 ответ

Решение

Исключение в моем примере было с VS 2013 на Windows 7. В этом случае вызов EventSetInformation не может быть решена, так как функция не может быть найдена в advapi32.dll, Затем я протестировал тот же код с Visual Studio 2015 CTP, и он без каких-либо исключений выполнил до конца. Это привело меня к мысли, что это был конфликт версий.

Кроме того, согласно здесь и MSDN, EventSetInformation был добавлен в advapi32.dll в Windows 8. Вот почему его не удалось найти, когда я запустил код с VS 2013. Поэтому для запуска фрагмента кода мне потребовалась более новая версия advapi32.dll, которая включена в более позднюю версию Visual Студийные версии (или Windows 8).

ОБНОВИТЬ

Согласно https://github.com/dotnet/coreclr/issues/974

Обратите внимание, что группа ОС заверила нас, что Win7 будет исправлена ​​для включения этого API в ближайшее время (в течение нескольких месяцев), так что даже исключение не произойдет в этот момент.

Так что, скорее всего, advapi32.dll в Windows 7 будет обновлено, чтобы включить EventSetInformation некоторое время в будущем.

Другие вопросы по тегам