背景
我正在将SourceForge上的TreeViewAdv(TVA)项目转换为vb.net。到目前为止,我已成功转换代码,成功构建它,将dll的引用添加到新项目,将控件添加到工具箱,将控件添加到窗体,以及修改控件属性。我还在构建之前将功能编码到表单中,接受了Aga.Controls命名空间。
问题
当我去调试我放置TVA控件的应用程序时,我收到错误:''Aga'未声明。由于其保护级别,它可能无法访问。'对该命名空间的所有调用。所以,我在SourceForge上研究了这个问题,这里有一个帖子:https://sourceforge.net/p/treeviewadv/discussion/568369/thread/005e61ef/讨论这个问题。据说当你看到这样的行为时,有人会弄清楚问题是什么,但未能分享他们智慧的任何细节。一般的问题是,当引用2008年在2010年项目中编译的dll时,'是VS 2010要求设计师与主程序集分开。“我试图联系那里的人,但似乎有在论坛中的任何线程都没有真正的活动。这引出了我的第一个问题......
问题
1。)希望超越希望,StackOverflow上有没有人专门为treeviewadv项目做过这个?如果是这样,我将非常感谢对所做的事情的详细描述,或对最终结果代码/修复的简短描述。虽然我明白这是不太可能的,但我想在询问关于“如何”的更多一般性问题之前我会问?
2。)除非符合第1号法案的人,否则是否有人知道这个一般过程,并且至少对TVA项目有足够的了解并希望与我一起努力?
2。)除了1和2之外,是否有人对任何项目都这样做了,可以相对详细地描述一般过程,和/或指向示例代码?
3.。)除了1,2和3之外,是否有一个特别好的资源可以访问,概述了如何以上述方式更新VS2008项目?
声明
我知道这个过程可能过于复杂,无法在此讨论,所以如果需要,我愿意在其他地方进行讨论/努力。如果第1类或第2类的人可以(回答我的问题/与我一起工作)并且您认为应该在其他地方进行讨论,请告知我们我们如何能够相互联系,因为似乎没有正式的SO机制。我仍然有兴趣在这里发布(或链接)结果,以便在找到答案时分享所有内容。
答案 0 :(得分:1)
以下是针对不同程序集中Designer的常规问题的更多信息。有一些警告:首先我(我们?)不确定核心问题与 UI 设计器有关。鉴于该项目似乎是一个自定义的TreeView,似乎可能是这种情况,但术语“Designer”可以更通用的方式用于此控件。第二个警告是,我必须继续进行的是上面的描述,并没有看到控件的代码。
那就是说,我刚刚完成UnDo Manager组件的下降(即它继承自Component并位于表单托盘中)。它需要的部分原因是开发人员可以选择表单上的控件来接受UnDo。布局/构造是这样的:
Imports Plutonix.UIDesigners
Namespace Plutonix.UnDoMgr
Public Class UndoManager
Inherits Component
Implements ISupportInitialize
Private _TgtControls As New Collection(Of Control)
<EditorAttribute(GetType(UnDoControlCollectionUIEditor), _
GetType(System.Drawing.Design.UITypeEditor))> _
<DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _
Public Property UnDoTargets() As Collection(Of Control)
Get
Return _TgtControls
End Get
Set(ByVal value As Collection(Of Control))
If value IsNot Nothing Then
_TgtControls = value
Else
_TgtControls.Clear()
End If
End Set
End Property
'...
<EditorAttribute...
装饰指定此组件使用名为UnDoControlCollectionUIEditor
的特殊设计器。如果您要转换的项目在一个或多个属性上没有此项,则该问题可能与 UI 设计者无关。
稍后,有一个用于COntrols集合编辑器的UI编辑器。这是一个单独的类,虽然它在同一个文件中:
<System.Security.Permissions.PermissionSetAttribute( _
System.Security.Permissions.SecurityAction.Demand, Name:="FullTrust")> _
Public Class UnDoControlCollectionUIEditor
Inherits ControlCollectionUIEditor
Public Sub New()
MyBase.bExcludeForm = True
MyBase.bExcludeSelf = True
' create a list of supported control TYPES
typeList.Add(GetType(TextBox))
'... 9 more lines adding control types to List(of System.Type)
End Sub
End Class
几乎所有代码都驻留在基类ControlCollectionUIEditor
中,该基类位于不同的程序集(DLL)中。我的组件实际上是使用本地定义的,所以作为测试,我将编辑器更改为ControlCollectionUIEditor
,这是我的设计器DLL中的基类。标签,面板,GroupBox等没有/需要UnDo功能,因此我的设计师不会在Designer中显示它们 - 当我使用基类时,它们都会按预期显示在设计器列表中。
所有标准UI编辑器(String Collection Editor等)都在.NET程序集中,因此在一个程序集中定义并在另一个程序集中使用(您的/我们/开发人员)。几年前,我决定将我写的几个不同的UIDesigner放到UIDesigner.DLL(即他们自己的程序集)中,并且它们运行良好。
除此之外,我对某些细节感到困惑。听起来你正试图在你的转换中使用这个2008程序集(一个DLL?)。那是设计师的所在吗?如果是这样,它已经在你的VS 2010项目的另一个程序集中了,那么为什么会出现问题呢?通过转换2008年大会中的任何内容(仍然不清楚其中的内容),可以避免整件事。
HTH
修改
我快速浏览了一下,它至少使用了1个UIDesigner。 TreeViewAdv.Properties.cs
将NodeControlCollectionEditor
定义为NodeControls
属性的自定义控件集合编辑器。编辑器位于NodeControlsCollection.cs
。巧合的是,它正在做我的UnDoManager所做的事情:定义哪些控件类型对于CollectionEditor有效。然后你的东西调用标准的.NET CollectionEditor,我调用CodeProject DialogForm版本。还有一个StringCollectionEditor.cs
文件,但我不知道这是UI Designer还是用户在运行时的东西。
由于你有这些代码,你应该能够像我上面所做的那样模仿。我还要验证VS 2010确实有提到的怪癖。但我也对2008年大会的内容感到困惑。是否有一些你没有来源的作品?您也可以尝试将安全属性添加到项目中的任何UI设计器,因为CS版本没有它们,并且引用的msg指示有关“保护级别”的信息。它似乎不太可能有所帮助,但既然你正在处理一个怪癖,谁知道......?
此外,这是一个非常雄心勃勃的转换项目!
答案 1 :(得分:0)
问题验证原因
首先,我想指出的是,实际上,在引用的dll中丢失跟踪命名空间的问题是因为该dll中存在自定义UI编辑器/设计器。
修复
1。)查找项目中的所有自定义编辑器/设计器。如果您对项目有点熟悉,那么最好的方法是找到(Ctrl + F)&#39; UITypeEditor&#39;在整个解决方案中。如果你是那个设计它的人,那么你应该没有问题。
2.)删除或注释掉整个自定义编辑器/设计器类。我更喜欢评论简单的文档(以防万一你需要回去)。
3。)在解决方案中创建新项目。如果您看不到解决方案(即您只能看到项目),请转到工具 - &gt;选项 - &gt;项目和解决方案。在那里,您会看到一个复选框,上面写着“始终显示解决方案&#39;”。在显示解决方案后,右键单击并选择add - &gt; New Project ...可以命名为what,这对代码几乎没有影响。
4。)在新项目中将Class1重命名为方便的任何内容。全部转移&#39;使用&#39;最初持有自定义编辑器/设计器类的文件顶部的语句。 编辑:为任何名称空间添加using语句,以允许您访问主项目所需的类型。为每个类声明相应的名称空间。将自定义类复制并粘贴到正确的命名空间中(如果需要,可以将所有自定义编辑器/设计器放在这个文件中)。更改任何声明为&#39; internal&#39;的类。公共&#39; (内部只是装配的范围)。
5。)如果新项目需要任何引用,请立即添加。如果您的自定义编辑器正在编辑自定义类型,则可能需要引用定义这些类型的项目。如果这些类型是在您的主要&#39;中定义的。汇编这可能会有点棘手,因为它可能会导致循环引用问题。解决这个问题的方法之一,也许是正确的方法,是从主程序集中删除这些类型的声明,并为它们的声明创建一个新的项目/程序集。如果由于某种原因,它们与您的主要程序集不可分离,请预留一个以前由主程序集组成的成功构建(dll)并引用它。这可以减少代码的未来可持续性,因为这些类型可能有机会,但如果这是您想要的,那么现在就完成工作。
6。)在调试自定义编辑器/设计器项目之后,构建它并在主项目/程序集中添加该项目的构建(dll)作为参考。
7。)在内部调试 ,在解决方案中创建一个新项目,并将 BOTH dll(主要和自定义编辑器)添加到引用。验证控件/属性在设计时和运行时的行为应该如此。
8。)最后,从外部调试 。创建新解决方案,引用两个dll,验证功能。在本机解决方案和外部解决方案中进行调试似乎有点过分,但我发现环境之间的行为存在很多差异。要彻底。
重要说明:我花了 LONG 时间来确定是否需要添加两个dll。您可以看到,在将主dll添加到测试项目时,它会像添加BOTH一样。我认为这是合理的(并且非常花花公子),因为主要程序集引用了另一个程序集。但是,关闭并打开Visual Studio并不起作用。长话短说加两个dll。
TreeViewAdv细节
1。)有两个自定义UIEditor。第一个是NodeControlsCollection.cs,名为NodeControlCollectionEditor,它继承了标准的.NET CollectionEditor。添加的唯一功能是显式分配允许编辑器使用的控件类型。似乎这主要是作为一种解决方法完成的,允许将所有NodeControl类型添加到集合中(这需要传递类型NodeControl),但是绕过传递NodeControl类型导致错误的事实,因为您无法实例化抽象类型。第二个是StringCollectionEditor.cs中的StringCollectionEditor。这也支持标准的.NET CollectionEditor,并增加了一些功能(不确定目的)。
2 - 4.)与一般过程相同。
5。)我目前不得不使用后一种方法(为我的自定义UIEditor提供一个dll的Aga.Controls来引用)。后来我希望将一些对象声明与主程序集分开,以使解决方案更可靠。
6 - 8.。在同一解决方案中运行测试应用程序时,即使是不同的项目,也不会发生原始错误(丢失aga命名空间)。此外,一些外部工作的修复程序无法在内部正确运行,反之亦然。因此,我建议在两种环境中进行测试。
最终请求 虽然我的问题的一般和细节都在这里得到解答,但Plutonix的帮助对于我的解决方案至关重要。虽然我将此标记为答案。我想如果人们也提出了Plutonix的回答,他已经提出了帮助我找到答案的努力(除了他的答案如果不那么具体,他的答案也是正确的。)
编辑:当我修改原始TVA C#代码时,上述过程有效。我甚至能够在VB.net项目中引用并成功使用生成的DLL。当我尝试将相同的过程应用到我转换为VB.net的TVA代码行时,它导致了与我开始时相同的问题。一切正常,直到我去运行应用程序,然后它看不到aga命名空间。
编辑解决方案:转到属性(失去参考的项目) - &gt;编译标签 - &gt;高级编译选项按钮。在目标框架下,更改为&#34; .NET Framework 4&#34;如果不是这样的话。如果已经选择了该值,您可能会查看其他原因。