Вопрос : Как мы можем использовать 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);
}
}
............
........