【问题标题】:C# DLL calls property "get" for no reasonC# DLL 无故调用属性“get”
【发布时间】:2020-01-17 04:14:24
【问题描述】:

我正在 Visual Studio 2019(专业版)中创建自定义 C# Windows 窗体控件库(DLL)。我的控件有一个采用以下形式的属性(此属性旨在供使用 DLL 的应用程序访问):

public double Hello
{
    get { throw new ApplicationException("Hi!"); }
}

(在我努力找出发生这种情况的原因时,我已经简化了该属性,只抛出一个异常而不做其他任何事情。)

由于某种原因,如果我运行我的用户控件(在调试模式下),则会引发异常 - 即使此代码中没有其他地方调用该属性! (IDE 确认了这一点 - 在其上方说“0 引用”)。为什么似乎无缘无故地调用了属性“get”访问器?堆栈跟踪显示“[外部代码]”调用了“get”...

如果您有 Visual Studio 2019,这应该很容易重现:在 C# 下创建一个新的“Windows 窗体控件库 (.NET Framework)”项目,然后在解决方案资源管理器中右键单击“UserControl1.cs”并单击“查看代码”,然后将上面的代码添加到类中。

【问题讨论】:

  • 我希望“属性”窗口使用它。如果是这样的话,也许是this is the answer
  • 啊啊啊。有趣的。问题是,即使在使用外部应用程序加载 Release DLL 时也会发生这种情况(在我的情况下,我将控件嵌入到 LabView 中)。我看不出 LabView 需要在加载 DLL 后立即知道所有属性值的任何原因,但这可能超出了我的控制范围。我在想这可能是我不知道的 C# 的一些奇怪的怪癖。
  • 如果属性定义是您正在显示的那个,它不应该抛出。任何状况之下。例如,如果您有一个访问/初始化 UC 的默认属性值的自定义设计器,它可能会抛出。或者通过反射评估属性。
  • 是的,奇怪的是,当我尝试将 .NET 小部件放入项目时,LabVIEW(您可能对此一无所知)似乎会查询该属性 - 甚至在我尝试之前运行。不知道LabVIEW在这里做什么,但我无法改变它(如果我有选择的话,我一开始就不会使用它......)。我刚刚选择将我的属性更改为 getter/setter 方法。

标签: c# visual-studio winforms dll properties


【解决方案1】:

我已经重现了您的问题。根据我的测试,我发现 winformscontrollibary 会

加载你在代码中设置的所有属性,因为它需要将它们加载到

表单的属性栏。 像下面这样,如果你写下面的代码。

 public partial class UserControl1: UserControl
    {
        public UserControl1()
        {
            InitializeComponent();
        }
        public double Hello
        {
            get { return 1.02; }

        }
        public int Number
        {
            get { return 1; }

        }

    }

您将在表单右侧看到正确的属性(Hello 和 Number)。

因此,如果您编写代码 throw new ApplicationException("Hi!");在get方法中,会抛出异常。

【讨论】:

  • 是的,对我来说主要问题是,当我在 LabVIEW 中使用 Visual Studio(即使没有运行它)时,即使在 Visual Studio 之外,这种情况仍然会发生——我只是选择使用 getter/setter 方法。老实说,在这种情况下,它比使用属性 (imo) 更有意义,因为 getter/setter 是通过 TCP/IP 套接字读取/写入的。
  • 我对labview不熟悉,所以不知道它如何与winformcontrol库一起使用。就像我之前提到的,它调用属性的原因是dll需要加载所有属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多