2011-07-14 48 views
2

我有一个Visual Studio 2008中的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

我在通过Visual Studio的可扩展API纠正这一切的尝试后,我放弃了这种做法,现在做后面的所有的脏活场面。我将模板表单的文件复制到新目录,并通过FileInfo对象在后台更改文件名和内容,以及在将新文件添加到项目之前进行更改。这样,VS永远不会处于有'重复成员'错误的状态。

如果有人想看代码,我会把它贴出来。

+0

希望我知道我的赏金是不退还的... – Ski