【问题标题】:.NET Windows Forms Controls with Design support work on 4.0 Client Profile具有设计支持的 .NET Windows 窗体控件适用于 4.0 客户端配置文件
【发布时间】:2015-03-14 22:01:36
【问题描述】:

考虑场景:

您需要具有设计时支持的 Windows 窗体控件。这会创建对 System.Design 的依赖关系,而 4.0 客户端配置文件中不存在该依赖关系,因此您使用 4.0 完整框架来控制程序集。

然后在您想要使用该控件的项目中,它将需要 4.0 Full Framework,即使所需的功能仅用于设计时。

但是,您可以使用具有 VerbsTabControl 和可能扩展 ParentControlDesigner 的设计器,该设计器将控件的依赖项置于 4.0 完整框架上,但您的项目将使用 4.0 客户端配置文件正常编译.


例如,TabControl 有动词和设计器,但在 4.0 客户端配置文件上运行良好。

有什么方法可以告诉程序集在设计时只使用参考!?由于这是不可能的,简单的把 any 项目使用 any 控件(使用自定义设计器),对完整 4.0 框架的依赖,但来自 .净没有?!

这是真的吗?为什么?

使用仅作为完整框架的 4.5 超出此问题的范围

【问题讨论】:

  • 试图解决这个问题没有什么意义。控件设计器仅在 Visual Studio 中的设计时使用。在程序员的机器上,他总是安装完整版的 .NET。
  • @HansPassant 不,问题是控件具有 4.0 Full 框架没有问题,但是要在 用户计算机 上使用控件,它仍然需要 Full 框架。
  • 不,没有人会查看属性或实例化设计器类。所以抖动没有理由加载 System.Design.dll。永远不会加载的缺失 DLL 永远不会生成异常。
  • 我说的是编译时,你如何在没有System.Design.dll的情况下派生你的设计器类!?您需要以 4.0 Full 框架为目标,即使在用户机器上它也不会加载该程序集。无论如何,@PatrickHofman 的回答是客观的并解决了“问题”。谢谢。

标签: c# .net winforms


【解决方案1】:

好吧,当您拥有 Form 类时,它会使用客户端配置文件中提供的 DesignerAttribute 进行装饰。

它的定义:

[Designer( "System.Windows.Forms.Design.FormDocumentDesigner, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
         , typeof(IRootDesigner)
         )
]

IRootDesigner 接口在客户端配置文件中也可用,因此实际上并没有指代完整的框架,只有string 指代它,但在编译时不会对其进行评估。

因此,您不需要完整的框架来使用Form 类,但您确实需要它来访问设计器。这将读取string 并尝试加载包含设计器的程序集,这确实需要完整的框架,在安装了 Visual Studio 的系统上始终可用。

如果你想自己实现它,你必须将设计器和控件类拆分在不同的程序集中,引用另一个版本的框架。

【讨论】:

    猜你喜欢
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多