Form.Show() не работает для 1 конкретного компьютера

Я разрабатываю надстройку Excel в C#. Это дополнение содержит панели с некоторыми кнопками для открытия парящих форм.

Мне сообщили, что эта функция больше не работает с одним компьютером в моей компании. Он использует Excel Office 2016 до последней версии.
Вот что происходит:

Форма выпуска

Серая рамка - это то, что должно быть формой Windows, но по некоторым причинам она не загружается. Пользователь нажимает кнопку, чтобы открыть ее, и она просто остается серой, без элементов управления, без событий, без какого-либо ответа.

Теперь вот код, который должен открыть форму:

private void _Form_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{   
    // ActiveForm() returns basically a UserForm with some methods to fit my specific needs
    ActiveForm().ShowMyForm(_columnButton); // --> ClickEvent
}

public void ShowMyForm(object parent = null)
{
    ActiveForm().StartPosition = FormStartPosition.CenterScreen;

    if (parent != null)
        ComputeLocation(parent);

    IntPtr handle = new IntPtr(Excel.Hwnd);
    ActiveForm().Show(new WindowWrapper(handle)); // --> Shows a grey box
}

public class WindowWrapper : IWin32Window
{
    private IntPtr _hwnd;
    public WindowWrapper(IntPtr handle)
    {
        _hwnd = handle;
    }

    public IntPtr Handle
    {
        get { return _hwnd; }
    }
}

Я даю этот код на всякий случай, но я не совсем уверен, что он неисправен.

Точно такой же код прекрасно работает на любой другой машине, и проблема возникает с любой версией моего дополнения.
Я проверил это с несколькими (стабильными) версиями, и даже с бета-версией проблема все еще возникает.

Тем не менее, он появился после переустановки надстройки на предыдущую версию на компьютере. Это не должно связываться с чем-то внешним, но я считаю, что важно указать на это.
Я использую установщик MSI, созданный с помощью Wix 3.11 для установки.

Я не изменил код, но вот что я попробовал. Я надеюсь, что это не смешно, я неопытен с этим:
- удаление и переустановка надстройки,
- Восстановление Office 2016, а затем удаление / переустановка, когда это ничего не изменит,
- Обновлена ​​версия.NET с 4.6 до 4.7.2 (для надстройки требуется 4.6)
- Обновлены драйверы графической карты на компьютере.

Кроме того, я попытался проверить журналы, чтобы увидеть, возникла ли какая-либо ошибка:
- Мой аддин не показывает ошибки в журналах
- Я настроил проект Visual Studio и запустил надстройку в режиме отладки, с точками останова и всем -> без ошибок любого рода
- Я проверил события журналов Windows и не нашел ничего связанного. Возможно, я что-то пропустил, потому что у меня нет опыта читать их.

Я наконец-то нашел ссылку, которая "что-то сделала":
Как вернуться к более ранней версии офиса 2016

Я вернул версию Office до 16.0.9330.2118, и формы начали работать, как и ожидалось, около 30 минут. Затем мне сообщили, что проблема вернулась, хотя на компьютере ничего не обновлялось. Это просто "снова пошло не так". Я обновил Office до последней версии, и он снова начал работать до следующего утра.

Как видите, ошибка не генерируется, но замена версии Office на другую "делает что-то". Похоже, что это какой-то конфликт с некоторыми библиотеками Office, но я понятия не имею, что делать или как с этим бороться.
Хотя я заметил несколько тем, которые выглядели как моя проблема, все они были связаны с управлением кодами и формами. Я действительно считаю, что это не имеет ничего общего с кодом, хотя я не могу доказать это наверняка.

Кто-нибудь может мне помочь с этим? Буду признателен даже за некоторые мысли о том, как справиться с этой проблемой, так как я действительно не доволен этим.

РЕДАКТИРОВАТЬ:

Так что я вроде понял, что случилось, но не совсем.
Я сделал то, что сказал мне @HansPassant, шаг за шагом запустил отладчик VS на компьютере моего коллеги и снова и снова запускал его. Оказалось, что причиной проблемы был метод ComputeLocation (см. Оригинальное содержание).
В основном ComputeLocation работал так (я немного упростил это):

private void ComputeLocation(object parent)
{
    Control parentControl = (Control) parent;
    Point location = parentControl .PointToScreen(new Point(0,0));

    //Process location's coordinates here

    location = parentControl.PointToClient(location);

    ActiveForm().StartPosition = FormStartPosition.Manual;
    ActiveForm().Location = location;
}

Я наконец заметил, что проблема возникнет при использовании PointToClient. Форма изменит свое местоположение, но ее содержание не будет.
Я получил ожидаемое поведение при удалении вызова PointToClient.

Я хотел бы отметить, что этот код на самом деле неисправен (в отличие от того, что я говорил в оригинальной части), потому что ActiveForm() является формой topMost и не имеет родителя. Использование PointToClient в этом контексте является ошибкой, поскольку его местоположение всегда выражается в экранных координатах, хотя это не является причиной моей проблемы: в этом контексте PointToClient всегда возвращает местоположение, практически совпадающее с координатами экрана.

Я закончил тем, что навсегда удалил вызов PointToClient, решив проблему. Содержимое формы снова следовало за своим контейнером.

Я до сих пор не понимаю, почему PointToClient вызывает такое поведение.
Несколько дней спустя другой коллега получил точно такую ​​же проблему, тогда как на его компьютере ничего не обновлялось. Надстройка перешла от обычного запуска в книге Excel к отображению серых прямоугольников на следующей.

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

1 ответ

Решение

Я считаю, что нашел причину проблемы здесь. Проблема "распространилась" еще на 2 компьютера в моей компании, и я смог исправить их с помощью исправления, которое я сделал, хотя я и не знал реальной причины.
Со временем появилась еще одна проблема: элементы управления ToolStrips больше не отображались в формах надстроек.

В конце концов, одному из моих коллег пришлось обновить свою версию для Windows, и это полностью уничтожило все проблемы.
Я проверил, все 3 компьютера работают под управлением Windows 10 версии 1709.
Я нашел ссылку о проблемах с этой версией, но я не совсем уверен, что именно это вызвало неправильное поведение:
https://support.microsoft.com/en-us/help/4340917/windows-10-update-kb4340917

Остальные машины были быстро обновлены до обновления Windows 10 апреля 2018 года, и все снова работает нормально на всех версиях надстройки.

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