Взаимодействие с 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
некоторое время в будущем.