Как мы можем вызвать метод Invoke (Delegate) из надстройки Microsoft Office? - PullRequest
0 голосов
/ 06 апреля 2020

Вопрос : Как мы можем использовать Invoke (...) метод в Microsoft Office 2010-2016 VSTO . Или есть какие-то обходные пути, альтернативы и т. Д. c для проекта VSTO?

Справочная информация : Я пытаюсь реализовать исходный код стороннего разработчика Windows Формирует приложение в моем проекте Microsoft Office VSTO . Сторонний поставщик предоставил своим пользователям пример / пример в виде Windows проекта формы с исходным кодом и попросил своих пользователей имитировать c этот код для своих других проектов (WPF, Office Solutions et c.).

Мне удалось реализовать все части примера приложения Windows Forms, кроме следующей строки кода, которая не распознается VS2019 в моем проекте VSTO:

    Invoke(new IsActivatedDelegate(CheckIfActivated));

Примечание : delegate void IsActivatedDelegate(); - делегат, объявленный в файле Form1.cs их образца, а CheckIfActivation () - метод, объявленный в том же файле Form1.cs.

Теперь мы знать, что метод Invoke (...) относится к классу Control класса System. Windows .Forms. И, следовательно, не может использоваться в VSTO проекте. Но может быть альтернатива для проекта VSTO.

UPDATE :

Ниже приводится выдержка из файла Form1.cs примера кода третьей стороны, который вызывает Invoke (...) метод:

...........
...........
void mnuActDeact_Click(object sender, EventArgs e)
{
    if (isGenuine)
    {
        // deactivate product without deleting the product key allows the user to easily reactivate
        try
        {
            ta.Deactivate(false);
        }
        catch (ThirdPartyObjectException ex)
        {
            MessageBox.Show("Failed to deactivate: " + ex.Message);
            return;
        }

        isGenuine = false;
        ShowTrial(true);
    }
    else
    {
        // Note: you can launch the ThirdPartyObject wizard or you can create you own interface

        // launch ThirdPartyObject.exe to get the product key from the user, and activate.
        Process TAProcess = new Process
        {
            StartInfo =
            {
                FileName = Path.Combine(
                    Path.GetDirectoryName(Application.ExecutablePath),"ThirdPartyObject.exe")
            },
            EnableRaisingEvents = true
        };

        TAProcess.Exited += p_Exited;
        TAProcess.Start();
    }
}

void p_Exited(object sender, EventArgs e)
{
    // remove the event
    ((Process) sender).Exited -= p_Exited;

    // the UI thread is running asynchronous to ThirdPartyObject closing that's why we can't call CheckIfActivated(); directly
    Invoke(new IsActivatedDelegate(CheckIfActivated));
}

delegate void IsActivatedDelegate();

void CheckIfActivated()
{
    bool isNowActivated = false;

    try
    {
        isNowActivated = ta.IsActivated();
    }
    catch (ThirdPartyObjectException ex)
    {
        MessageBox.Show("Failed to check if activated: " + ex.Message);
        return;
    }

    // recheck if activated
    if (isNowActivated)
    {
        isGenuine = true;
        ReEnableAppFeatures();
        ShowTrial(false);
    }
}
............
........

1 Ответ

0 голосов
/ 06 апреля 2020

Я sh вы показали код для контекста ... по крайней мере, несколько строк ... но я знаю это. если вы говорите

YourDelegate yd = new YourDelegate(YourMethod);

, вы можете заменить:

yd.Invoke(new IsActivatedDelegate(CheckIfActivated));

на

yd(new IsActivatedDelegate(CheckIfActivated));
...