gpt4 book ai didi

vb.net - 访问类库中的 mustoverride 属性时出现 AccessViolationException

转载 作者:行者123 更新时间:2023-12-04 02:11:28 26 4
gpt4 key购买 nike

这有点复杂,但我会尽量解释清楚。

我有一个通用代码组件的类库;我试着做一些常见的 ConfigurationHandler基类,以简化创建自定义配置部分、集合和元素。

我最终得到的是:
ConfigurationSectionBase类是通用的,取 TConfElementCollection As {ConfigurationElementCollection, New}作为类型约束。

ConfigurationSectionBase类包含一个 Public MustOverride Property Collection As TConfElementCollection .

这个想法是,在使用类库的项目中,他们只需覆盖集合并用 <ConfigurationProperty("CollectionName")> 装饰它。属性,例如:

<ConfigurationProperty("CollectionName")>
Public Overrides Property Collection As DerivedConfigurationElementCollection
Get
Return TryCast(Me("CollectionName"), DerivedConfigurationElementCollection)
End Get
Set(value As DerivedConfigurationElementCollection)
Me("CollectionName") = value
End Set
End Property

这工作正常 - 在使用应用程序中我可以创建该部分,然后在我的配置处理程序类中我可以调用
Dim section As DerivedSection = (TryCast(Config.GetSection("DerivedSection"), DerivedSection))
Dim coll as DerivedConfigurationElementCollection = section?.Collection

那么,我的下一个想法是,为什么不也抽象 Config Handler 类,并将其移动到基类中?

事实证明这更复杂,但我最终在 ConfigurationHandlerBase 中得到了以下代码DLL 中的类:
Protected Function GetCollection(Of TCollection As ConfigurationElementCollection, TSection As {ConfigurationSectionBase(Of TCollection), New})(sectionName as String) As TCollection
Dim s As TSection = (TryCast(Config.GetSection(sectionName), TSection))
Return s?.Collection ' AccessViolationException is thrown on this line

为了尝试诊断问题,我以与 Collection 相同的方式创建了一个 String 属性(DLL 中的 MustOverride 类中的 ConfigurationSectionBase,在使用应用程序中被覆盖),然后尝试从类库访问它 - 和再次,同样的问题。

所以我认为这个问题与 MustOverride有关。并且 DLL 代码无法识别派生类已覆盖该属性。

如果我返回 TSection从 DLL 方法改为,然后访问 Collection使用 DLL 的应用程序中的属性;我可以很好地访问集合。

奇怪的是,如果我在其中放置一个断点,Visual Studio 会很高兴地向我显示 Collection 的内容。属性,不抛出任何异常。

另外,如果我替换 (TryCast(Config.GetSection(sectionName), TSection))new TSection() ,我仍然收到 AccessViolationException - 所以据我所知,这与我正在访问配置文件的事实无关。

有没有人遇到过这个;或者我接下来的步骤是什么来解决这个异常?

最佳答案

您是 vb.net 编译器代码生成错误的受害者,它破坏了 ConfigurationHandlerBase.GetCollection() 方法的代码。它使用受约束的调用不适本地优化了 Collection 属性的属性 getter 调用。查看它的最简单方法是在 TestCollection.dll 程序集上运行 PEVerify.exe,尽管错误消息看起来对我有误导:

[IL]: Error: [C:\temp\temp\TestClassLibrary\TestClassLibrary\bin\Debug\testclasslibrary.dll : TestClassLibrary.ConfigurationHandlerBase`1[TDerivedConfigHandler]::GetCollection[TCollection,TSection]][offset 0x00000024] The 'this' argument to a constrained call must have ByRef type. 1 Error(s) Verifying testclasslibrary.dll



然而,搜索错误消息会让您进入 this github.com issue . 3个月前标记为fixed,我认为是 this SO question它得到了修复。当此类修复应用到我们的机器上时,并不总是很明显。今天不行。

github问题中提出的解决方法似乎没有效果。我看到的最简单的解决方法是避免使用 elvis 运算符并回到基础,重写:
   Dim coll As TCollection = s?.Collection
Return coll

到:
   If s Is Nothing Then return Nothing Else Return s.Collection

关于vb.net - 访问类库中的 mustoverride 属性时出现 AccessViolationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48824474/

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