【发布时间】: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