Надстройка Visual Studio 2008 копирует и переименовывает файлы форм, получает повторяющиеся ошибки членов, несмотря на переименование - PullRequest
2 голосов
/ 14 июля 2011

У меня есть проект VB.NET в Visual Studio 2008, для которого я создал специализированное дополнение. Надстройка предлагает пользователю выбрать таблицу базы данных, берет файлы класса шаблона формы, копирует их в другой каталог в проекте и переименовывает класс формы в скопированных файлах. Затем он открывает новую форму и добавляет к ней элементы управления на основе полей в таблице базы данных.

Копирование формы шаблона приводит к тому, что фоновый компилятор выдает ошибки «дубликата элемента», например «Private Sub InitializeComponents (...) имеет несколько определений с одинаковыми сигнатурами», даже если я переименовал файлы новой формы и имя класса в них. Иногда эти ошибки исчезают до того, как открывается новая форма, но когда они остаются рядом, новая форма не открывается правильно, а вместо этого выдает ошибку.

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

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

Вот мой код, который копирует и переименовывает форму шаблона:

Private Sub CreateDataForm(ByVal tableName As String, ByVal displayName As String) ', ByVal subDataForms As IList(Of Object))
    Try
        Dim dataFormClassName As String = "frm" & MakeValidName(displayName)
        Dim dataFormFileName As String = dataFormClassName & cVBSuffix
        Dim templateFileName As String = DataFormTemplate.Name
        Dim templateClassName As String = Replace(templateFileName, cVBSuffix, String.Empty)

        'copy form template to data forms folder
        'copy files associated with main projectitem
        Dim newPItem As ProjectItem = Nothing

        For i As Integer = 1 To DataFormTemplate.FileCount
            newPItem = DataFormsFolder.ProjectItems.AddFromFileCopy(DataFormTemplate.FileNames(CShort(i)))
        Next

        'copy files associated with sub projectitems
        For Each item As ProjectItem In DataFormTemplate.ProjectItems
            For i As Integer = 1 To item.FileCount
                DataFormsFolder.ProjectItems.AddFromFileCopy(item.FileNames(CShort(i)))
            Next
        Next

        newPItem.Name = dataFormFileName

        newPItem.ContainingProject.Save()

        'fix class name for dataform template
        FixDataFormClassName(DataFormTemplate, dataFormClassName, templateClassName)

        newPItem.ContainingProject.Save()

        Application.DoEvents()

        'get table metadata
        Dim lGetColumnInfo As DataColumnCollection = GetColumnInfo(tableName)


        'add field controls
        ConvertColumnInfoToFormControls(newPItem, lGetColumnInfo, tableName, displayName)

    Catch ex As Exception
        DisplayExceptionMessage(ex)
    End Try
End Sub

Private Shared Sub FixDataFormClassName(ByVal pItem As ProjectItem, ByVal dataFormClassName As String, ByVal templateClassName As String)
    If pItem.Document IsNot Nothing Then
        pItem.Document.Close(vsSaveChanges.vsSaveChangesPrompt)
    End If
    For i As Integer = 1 To pItem.FileCount
        Dim dftFile As New IO.FileInfo(pItem.FileNames(CShort(i)))
        Dim tr As IO.TextReader = dftFile.OpenText() 'IO.FileMode.Open, IO.FileAccess.ReadWrite, IO.FileShare.None)
        Dim sb As New Text.StringBuilder
        Dim newData As String = tr.ReadToEnd().Replace(dataFormClassName, templateClassName)
        tr.Close()
        Dim sw As New IO.StreamWriter(dftFile.FullName)
        sw.Write(newData)
        sw.Close()
    Next

    If pItem.FileCodeModel IsNot Nothing Then CType(pItem.FileCodeModel, FileCodeModel2).Synchronize()

    For Each item As ProjectItem In pItem.ProjectItems
        FixDataFormClassName(item, dataFormClassName, templateClassName)
    Next
End Sub

1 Ответ

1 голос
/ 16 сентября 2011

После всех моих попыток исправить это с помощью API расширяемости Visual Studio я отказался от этого подхода и теперь выполняю всю грязную работу за кулисами. Я беру файлы формы шаблона, копирую их в новый каталог и изменяю их имена и содержимое за кулисами с помощью объектов FileInfo и так далее, прежде чем добавить новые файлы в проект. Таким образом, VS никогда не находится в состоянии, в котором есть ошибки «повторяющегося члена».

Если кто-нибудь захочет увидеть код, пишите, и я выложу его.

...