Сбой ссылки на объект автозагрузки при преобразовании приложения WinForms в библиотеку классов - PullRequest
0 голосов
/ 09 июля 2019

Я пытаюсь преобразовать приложение WinForms в библиотеку классов - короче говоря, производственная среда, в которой я работаю, позволит нашим пользователям вносить изменения в DLL-файлы, но не в EXE-файлы, поэтому я пытаюсь запихнуть весь существующий приложение в DLL, а затем просто создайте и покажите экземпляр объекта / формы запуска из второго приложения WinForms с целью создания какой-либо системы автоматического обновления.

Я изменил тип вывода проекта на Class Library, добавил приложение запуска и т. Д., Но попытка построить старое приложение как библиотеку классов выдает сотни ошибок, почти все из которых Reference to a non-shared member requires an object reference.

После проверки эти ошибки появляются повсюду в коде, на который ссылаются на объект / форму запуска или любые его свойства или методы. Поскольку в приложении WinForms очень много вещей, естественно, ссылаются на основную форму ... это проблематично.

Материал как:

If DbConn = n.DbConn_.Prod Then
    miParent = mainform.MiProdReq

выдает вышеупомянутую ошибку при попытке доступа к mainform.MiProdReq

Я пропускаю какой-то простой / очевидный шаг здесь?

1 Ответ

2 голосов
/ 09 июля 2019

Вы ссылаетесь на экземпляр по умолчанию типа mainform в этом коде.Экземпляры по умолчанию предоставляются чем-то автоматически генерируемым при создании проектов приложений Windows Forms.Проекты библиотеки классов не имеют такой вещи, как экземпляры по умолчанию, поэтому любой код, который пытается их использовать, будет пытаться получить доступ к членам экземпляра, как если бы они были Shared.

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

Примечаниечто экземпляры по умолчанию - это то, что большинство опытных разработчиков предложили бы избегать в любом случае.Их нет в C #, и я никогда не слышал жалоб на это, так что это вряд ли обременительно.Они были добавлены в VB для удобства начинающих и мигрирующих разработчиков VB6, которые не привыкли к правильному ООП.

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

Я не тестировал его, но вы можете использоватьApplication.OpenForms(0) чтобы получить ссылку на форму запуска в любом месте вашей библиотеки.Возможно, вы могли бы добавить такой модуль:

Module Module1

    Private _mainform As Form1

    Public ReadOnly Property mainform As mainform
        Get
            If _mainform Is Nothing Then
                _mainform = DirectCast(Application.OpenForms(0), mainform)
            End If

            Return _mainform
        End Get
    End Property

End Module

, и тогда ваш код может даже просто работать как есть.

...