.net Visual Studio 2008加载项复制和重命名表单文件,即使重命名,也会获得重复的成员错误

.net Visual Studio 2008加载项复制和重命名表单文件,即使重命名,也会获得重复的成员错误,.net,vb.net,add-in,visual-studio-addins,.net,Vb.net,Add In,Visual Studio Addins,我在VisualStudio2008中有一个VB.NET项目,我为它创建了一个专门的加载项。加载项提示用户选择数据库表,获取模板表单类的文件,将其复制到项目中的另一个目录,并在复制的文件中重命名表单类。然后,它打开新表单,并根据数据库表中的字段向其添加控件 复制模板表单会导致后台编译器出现“重复成员”错误,例如“Private Sub InitializeComponents(…)具有多个具有相同签名的定义”,即使我重命名了新表单的文件以及其中的类名。有时,这些错误在新表单打开之前就消失了,但是

我在VisualStudio2008中有一个VB.NET项目,我为它创建了一个专门的加载项。加载项提示用户选择数据库表,获取模板表单类的文件,将其复制到项目中的另一个目录,并在复制的文件中重命名表单类。然后,它打开新表单,并根据数据库表中的字段向其添加控件

复制模板表单会导致后台编译器出现“重复成员”错误,例如“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

在我尝试通过VisualStudio的可扩展性API纠正这一点之后,我放弃了这种方法,现在在幕后做了所有肮脏的工作。我获取模板表单的文件,将其复制到新目录,并在将新文件添加到项目之前,通过FileInfo对象等在幕后更改其文件名和内容。这样,VS永远不会处于存在“重复成员”错误的状态

如果有人想看代码,我会把它贴上去