我有一个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
希望我知道我的赏金是不退还的... – Ski