【问题标题】:DesignerAttribute usageDesigner属性使用
【发布时间】:2014-07-31 09:13:40
【问题描述】:

我正在开发一个 winforms 应用程序,我想将设计人员放到一个单独的项目中,因为它需要引用 .Net 完整框架(System.Design),而应用程序本身只需要 .Net 框架客户端版本。

我有 3 个项目:

  1. TestControls 和 TestUserControl
  2. TestControls.Designers 与 PanelHodelerDesigner
  3. TestApp 测试 TestUserControl

TestControls 和 TestControlsDesigners 在 GAC 中签名和注册。

当我如下为用户控件定义设计器时,VS找不到设计器

[Designer("TestControls.Designers.PanelHolderDesigner, TestControls.Designers")]
public partial class TestUserControl : UserControl, IPanelHolder
{
    ...
}

当我将其更改为包括版本、文化和 publicKeyToken 的完全限定名称时,VS 会正确加载设计器。

[Designer("TestControls.Designers.PanelHolderDesigner, TestControls.Designers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=520302431ebc763b")]
public partial class TestUserControl : UserControl, IPanelHolder
{
    ...
}

我在网上找到的所有示例都告诉我应该使用缩短版本。为什么它对我不起作用?使用短版的设计师属性我还应该怎么做?

【问题讨论】:

    标签: c# .net winforms windows-forms-designer


    【解决方案1】:

    功能,而不是错误。 GAC 旨在能够并排存储程序集的多个版本。如果您不指定 [AsssemblyVersion],则 CLR 没有机会猜测正确的版本。所以它不会尝试,它只会在正在运行的应用程序的探测路径中查找显示名称。您找到的这些“样本”可能都假设您不使用 GAC。

    可能很难说服您摆脱这种情况,但是将设计器与控件分开并不是一个好主意。 Microsoft 会这样做,但他们非常不愿意更改 .NET Framework 程序集的 [AssemblyVersion]。并花费大量资源以确保他们永远不必这样做。这是非常难以复制的,版本控制程序集对于像我们这样的普通人来说相当重要,我们不会花费三年或更长时间来设计和测试程序集以确保使用的数十万程序员他们不会遇到麻烦。

    除了在您自己的机器上遇到问题之外,要让它在另一个程序员的机器上仍然正常工作本身就已经够难的了。我毫不犹豫地在 [Designer] 属性中使用typeof() 并将设计器包含在控件中。从来没有那样的惊喜。这是在运行时永远不会加载的 IL 的唾液,当它解决像这样的棘手问题时,很难放弃使用你不付钱给你不使用的东西 CLR behavior .

    【讨论】:

    • 我将其分开,因为设计师需要完整版本的 .Net 框架。我不想为客户要求完整的框架。
    • 如何避免使用 GAC ?我不想在GAC中注册库,但是VS如何找到设计者呢?
    • 如果你使用我给出的建议,找到它永远不会有任何问题,即“可能很难说服你摆脱这个”之后的建议。当你将它分开时,你会发现它必须部署在 CLR 可以找到它的位置。 GAC 或 VS 搜索程序集的目录之一,例如其 PublicAssemblies 子目录。如果设计器类从未被加载,您将不会遇到客户端配置文件中不存在的程序集的问题。仅在需要时才加载程序集。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-29
    • 2022-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多