gpt4 book ai didi

c# - DesignerAttribute 用法

转载 作者:行者123 更新时间:2023-11-30 15:28:46 25 4
gpt4 key购买 nike

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

我有 3 个项目:

  1. 带有 TestUserControl 的 TestControls
  2. TestControls.Designers 与 PanelHodelerDesigner
  3. 测试 TestUserControl 的 TestApp

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
{
...
}

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

最佳答案

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

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

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

关于c# - DesignerAttribute 用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25055058/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com