VSTO: дизайнер Visual Studio повторно использует запущенный экземпляр Excel вместо запуска собственного - PullRequest
1 голос
/ 06 апреля 2011

Когда вы создаете проект рабочей книги VSTO в Visual Studio, VS создает новый файл Excel (xlsx) и позволяет редактировать его непосредственно из Visual Studio. Книга Excel отображается на новой вкладке вместе с любым кодом или формами:

Example of editing an excel workbook from within Visual Studio

Для поддержки этого Visual Studio необходимо запустить экземпляр EXCEL.EXE в время разработки .

Проблема в том, что, к сожалению, вместо того, чтобы всегда запускать свой собственный экземпляр, если он находит тот, который уже запущен, он будет использовать его. Так что если по какой-то причине у меня уже был открыт Excel на моем компьютере, Visual Studio будет использовать этот экземпляр повторно.

Это вызывает несколько проблем: если Excel выполнял длительные вычисления, он зависнет Visual Studio; если в VS я открываю модальное окно Excel (например, свойства ячейки или шрифта), оно замораживает мое существующее окно Excel (которое находится вне VS). Если VS дает сбой, Excel.exe по-прежнему имеет дескриптор файла Excel проекта, но я не могу убить его из-за других моих открытых файлов в Excel. И, наконец, если мне удалось открыть Excel 2003 на ПК, а мой проект использует Excel 2007, VS все еще попытается использовать экземпляр 2003, запущенный в данный момент, что затем будет сбит с толку, когда его попросят откройте файл 2007, попробуйте преобразовать его и т. д., что приведет к полному беспорядку.

Единственное решение, которое я нашел, - это закрыть ВСЕ EXCEL.EXE экземпляры, только после запуска VS, открыть проект VSTO, VS не найдет запущенных экземпляров Excel и запустить его самостоятельно, а затем я могу снова открыть свой ранее открытые файлы в новых экземплярах, которые я открываю сам. Хотя это не всегда возможно и может быть настоящей болью, поэтому я хотел бы найти способ заставить VS открывать каждый раз свой собственный, личный новый экземпляр.

Ответы [ 2 ]

0 голосов
/ 07 августа 2014

Это простое консольное приложение C # может открыть пустой, невидимый процесс EXCEL.EXE.Вы можете запланировать запуск этой программы при входе в систему до запуска любого другого экземпляра Excel.

using System;
using System.Runtime.InteropServices;

//C:\Program Files (x86)\Microsoft Visual Studio 11.0\Visual Studio Tools for
//Office\PIA\Office14\Microsoft.Office.Interop.Excel.dll
using Excel = Microsoft.Office.Interop.Excel; 

class Program
{
    [DllImport("kernel32.dll")]
    static extern IntPtr GetConsoleWindow();

    [DllImport("user32.dll")]
    static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

    const int SW_HIDE = 0;
    const int SW_SHOW = 5;

    static void Main(string[] args)
    {
        Console.WriteLine("Opening new excel process...");
        var handle = GetConsoleWindow();
        ShowWindow(handle, SW_HIDE);
        try
        {
            Excel.Application Ea = new Excel.Application();
            Ea.Workbooks.Add();
            Ea.Visible = false;
        }
        catch (Exception exep)
        {
            Console.WriteLine(exep.Message);
            Console.ReadKey();
        }
    }
}
0 голосов
/ 08 апреля 2011

Вы пытались изменить параметры DEBUG для проекта в VS, чтобы указать явно на Excel.exe и назвать файл XLSX проекта в командной строке Excel?

это единственное, о чем я могу думать, чтобы всегда пытаться получить второй экземпляр Excel.

Офисные приложения, как правило, хотят использовать существующие экземпляры, поэтому такое поведение меня не удивляет. Слово также может быть хитрым.

И когда вы начинаете говорить о загрузке нескольких версий Office на одном компьютере разработчика (что, кстати, я тоже), все может стать очень странным быстро.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...