访问类库中的 Mustoverride 属性时出现 AccessViolationException

2024-03-14

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

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

我最终得到的是:

The ConfigurationSectionBase类是通用的,采取TConfElementCollection As {ConfigurationElementCollection, New}作为类型约束。

This 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 类,并将其移至基类中?

事实证明这更复杂,但我最终在一个ConfigurationHandlerBaseDLL 中的类:

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 属性(MustOverride in the ConfigurationSectionBaseDLL 中的类,在使用的应用程序中被覆盖),然后尝试从类库访问它 - 再次出现同样的问题。

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

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

奇怪的是,如果我放入断点,Visual Studio 会很高兴地向我显示Collection属性,不抛出任何异常。

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

以前有人遇到过这个吗?或者我的下一步可以采取什么措施来解决此异常?


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

[IL]: 错误: [C:\temp\temp\TestClassLibrary\TestClassLibrary\bin\Debug\testclasslibrary.dll : TestClassLibrary.ConfigurationHandlerBase`1[TDerivedConfigHandler]::GetCollection[TCollection,TSection]][偏移 0x00000024] 'this ' 论点 受约束的调用必须具有 ByRef 类型。 1 验证 testclasslibrary.dll 时出错

然而,搜索错误消息会让您发现这个 github.com 问题 https://github.com/dotnet/roslyn/issues/23351。 3个月前标记为已修复,我认为是这个问题 https://stackoverflow.com/questions/47278596/null-operator-returns-incorrect-value-when-using-generic-type-constructor-v就这样修好了。此类修复何时出现在我们的机器上并不总是显而易见的。今天不行。

github问题中提出的解决方法似乎并不有效。我看到的最简单的解决方法是避免 elvis 运算符并回到基础知识,重写:

   Dim coll As TCollection = s?.Collection
   Return coll

To:

   If s Is Nothing Then return Nothing Else Return s.Collection
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

访问类库中的 Mustoverride 属性时出现 AccessViolationException 的相关文章

  • 在 Visual Basic 2010 的控件中显示 PDF

    我刚刚安装了 Visual Basic 2010 浏览了一些有关如何显示文件的教程 但找不到任何有关如何选择现有 PDF 文件并将其嵌入表单的材料 任何正确方向的建议或指示都会很棒 谢谢 只需在表单中嵌入浏览器控件并将其导航到 PDF 文件
  • 无法加载 DLL(找不到模块 HRESULT:0x8007007E)

    我有一个 dll 库 其中包含我需要在 NET 4 0 应用程序中使用的非托管 C API 代码 但我尝试加载 dll 的每种方法都会出现错误 无法加载 DLL MyOwn dll 找不到指定的模块 HRESULT 异常 0x8007007
  • 友谊和派生类

    假设我有以下类层次结构 class Base protected virtual void foo 0 friend class Other class Derived public Base protected void foo Some
  • 如何通过继承在Python中子类化请求

    我想专门化 子类化请求包以添加一些具有自定义功能的方法 我尝试这样做 concrete requests py import requests class concreteRequests requests def init self su
  • 忽略不区分大小写的字典键中的连字符

    我在 asp net vb net 中有一个不区分大小写的字典 如下所示 Dim caseInsensitiveDictionary New Dictionary Of String Single StringComparer Ordina
  • 如何从继承的方法中获取派生类的路径?

    如何从继承的方法中获取当前类的路径 我有以下内容 and
  • 中继器按钮命令参数为空字符串

    我对这个失去了理智 即使命令参数已设置 我的按钮也会获得空字符串的命令参数 我已经验证它在调试模式下设置为正确的 ID 但是当我稍后在中继器 ItemCommand 事件中访问此命令参数时 命令参数是空字符串 我不知道为什么 我最终得到了
  • 从 PDF 转换为 HTML [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • crt0 是否加载 msvcrt.dll?

    我想弄清楚标准 C 函数是什么样的printf 在 Windows 环境下加载到内存中 我知道crt0 obj准备堆栈 调用int main int argc char argv 然后使用 main 返回的退出代码退出进程 我还听说 C 标
  • Oracle DataAccess 相关:“动态程序集中不支持调用的成员。”

    据我了解 此类错误已在 SO 上讨论过多次 有些人认为这是 DLL 文件中的错误 有些人通过更改 DLL 版本来解决 其他人似乎没有任何线索 无论如何 我只是发帖试试运气 在 C GUI 上的网格中选择一行时 我的应用程序崩溃了 stack
  • VB.net 中 _ 下划线作为变量前缀的含义

    Visual Basic中下划线的含义是什么 我有这个代码 Private isAuthenticated As Boolean 这和这样做是一样的吗 Private isAuthenticated As Boolean 或者在名称前面添加
  • 将网格视图列的宽度设置为动态,而不影响控件的最小宽度

    我在用着
  • VB.NET DatetimePicker - 错误的周数

    我的 vb net 扩展日期时间选择器有问题 当元素传递到新年 2016 时 左侧显示的周数是错误的 我有一个 datetimepicker 它不是默认组件 它是在此处下载的 http www codeproject com Article
  • 仅检索子类的属性[重复]

    这个问题在这里已经有答案了 我有一个像这样的课程 class parent public foo class child extends parent public lol public function getFields return
  • 继承php中的属性

    我有一个超类 其中包含用于设置它们的属性和方法 class Super private property function construct set this gt property set 然后我有一个需要使用该属性的子类 class
  • “更新/取消”按钮不会出现在模板字段编辑按钮中

    当您使用 Gridview 的每一行创建编辑按钮时CommandField单击后它会显示更新 取消按钮 以便您可以接受 取消更改 但是 我想要一个带有工具提示文本的编辑按钮 因为CommandField没有工具提示属性 我用过Templat
  • 是否可以为 Visual Studio 2010 编写一个调试器可视化工具来显示 64 位 .NET 程序?

    是否可以为 Visual Studio 2010 编写一个调试器可视化工具来显示 64 位 NET 程序的数据 我已经为 32 位编程编写了它们 但我无法设法使用或编译它们以用于 64 位应用程序 有什么建议么 我刚刚经历过同样的问题 我使
  • 调试器忽略动态加载的 DLL 中的错误

    我有一个与自编码 DLL 的调试相关的非常奇怪的问题 我有一个 MFC 驱动的基于对话框的应用程序 几个静态链接的项目和几个在运行时加载的 DLL 项目 我在调试中构建解决方案 运行应用程序 然后我可以轻松调试这些 DLL 项目 现在问题来
  • Vb.net 捕获 Ctrl+C

    I want to capture when someone uses CtrlC even when off focus im using Visual Basic 2010 好的 我为您提供了一个经过验证有效的解决方案 不过 您将需要一
  • 如何判断一个类是否被某个特定属性修饰

    我试图确定接口是否用特定属性装饰 例如我有以下界面

随机推荐

  • `__CPROVER_fence()` 参数

    我看到类似的代码 CPROVER fence RRfence RWfence 正在像这样的项目中使用Linux RCU 测试 https git kernel org pub scm linux kernel git torvalds li
  • 内存中集成测试和环境变量——.net core

    我们可以执行一个测试服务器来进行集成测试 就像是 这个问题 https stackoverflow com questions 29968788 how do i run in memory integration tests using
  • Flutter返回首页

    我制作了一个应用程序 其中包含相当多的路由 可以相互推送多个全屏对话框 但我想从一个对话框中关闭所有对话框并返回主页 我怎样才能做到这一点 我不想再次推送主页 因为这样我的导航历史记录中仍然有所有这些对话框 是pushReplacement
  • 低级控制台输入和重定向

    我正在尝试将命令发送到a的输入cmd exe使用低级读 写控制台功能的应用程序 我使用以下命令阅读文本 抓取 没有任何问题ReadConsole and WriteConsole 连接到进程控制台后的功能 但我还没有弄清楚如何编写 dir
  • java google Drive api V3 分段和可断点上传

    我需要帮助编写大文件 gt 5MB 的分段和可恢复上传 到目前为止 我只能启动分段上传 但我不知道当用户暂停或网络故障时如何恢复它 我所说的 恢复 是指我不知道如何 1 获取已上传到驱动器的总字节数 2 如何在 Content Range
  • Chrome 和 Firefox 中的 CSS 网格行为不同[重复]

    这个问题在这里已经有答案了 我有一个 2 列 3 行的 CSS 网格 由于有角度的 ngif 子句 第三行内容并不总是存在 图像出现在跨越 3 行的第一列中 话虽如此 我在 Chrome 80 0 3987 87 这是我发布的最新稳定版本
  • 设置 DataGridView 单元格值并添加新行

    我有一个包含两列的 DataGridView 单击第一列中的单元格时 会显示一个 OpenFileDialog 当我选择一个文件时 第二列中的单元格值将设置为所选文件名 这是代码 private void dataGridView1 Cel
  • 如何实现 MVC 4 Web App 服务器端互斥体

    我不是 MVC 专家 但我相当确定这是可以实现的 但是 我不知道如何在 MVC 4 中做到这一点 为了进行测试 我使用了使用 VS 2012 创建网站时提供的默认 Web 应用程序 为简单起见 请考虑多个用户 例如 3 在同一时间点击 Ho
  • 如何使用 Azure CLI 按对象 ID 获取 Azure AD 对象

    在 Azure 门户中 可以根据对象 ID 查找 Azure AD 对象 如下所示 是否可以使用 Azure CLI 通过对象 ID 检索 Azure AD 对象 为了使用Azure CLI获取与对象ID相关的对象 看来我需要提前知道相关资
  • MVC 我的网址正在创建“?Length=4”

    我正在创建一个 MVC4 应用程序 我有一个小问题 我的代码是 li Html ActionLink Contract Contract Home new id lnk contract li 我正在获取网址 http localhost
  • Access SQL 查询:获取按日期查找的上一条记录的特定字段

    我对 Access 数据库非常陌生 我正在尝试为拥有多个加油站的天然气分销公司创建库存数据库 每个站都有更多产品 气体类型的库存 加油站报告其库存 包括 交易日期 售出加仑数 加仑交付 实际加仑库存 预订库存 ActualGallonsIn
  • 如何配置构建类型与产品风格?

    基于这个答案https stackoverflow com a 27908019 5156317 https stackoverflow com a 27908019 5156317我有一个后续问题 是什么让代表产品风味的应用程序与众不同
  • 我想用 C# 在堆栈上分配一个对象

    假设我有这个 C 类 public class HttpContextEx public HttpContext context null public HttpRequest req null public HttpResponse re
  • doesNotExist at /en-us/ 模板标记无法找到带有查找参数 `{'reverse_id': u'home', 'site': 1} ` 的页面

    我目前正在查看 django cms demo 我一直在使用这里找到的代码 https github com andrewschoen django cms demo tree master demo https github com an
  • Oracle 中的视图是什么?

    Oracle 中的视图是什么 A 在 Oracle 中查看在其他数据库系统中 它只是存储在内存中的 SQL 语句的表示形式 以便可以轻松地重复使用 例如 如果我们经常发出以下查询 SELECT customerid customername
  • Google App Engine TextProperty 和 UTF-8:何时编码/解码

    我使用的是带有 Django 模板和 Webapp 框架的 Google App Engine 2 5 db TextProperty UTF 8 Unicode 和解码 编码让我很困惑 我非常感谢一些专家可以提供一些建议 我用谷歌搜索了一
  • NvAPI NVAPI_INTERFACE 缺少显式类型

    我是 c cli 新手 想为 nvapi 编写一个小型托管包装器 现在 当尝试访问某些功能时 例如 NvAPI Initialize Visual Studio 告诉我该函数未定义 include nvapi h NvAPIStatus N
  • 是否可以使用 popcorn JS 导出带有视频叠加评论的视频?

    我正在使用 porpcorn JS 在视频上添加注释 我在视频上创建了叠加层 并且所有注释都在视频上呈现 有什么方法可以导出嵌入 html 内容的视频吗 mp4 文件 那么我可以在任何本机播放器 例如 VLC 中播放该视频吗 你最擅长处理它
  • c++ - 抽象类的迭代器

    我有一个抽象类 例如代表几何形状的类 我将有继承自的具体类Shape 例如矩形和三角形 我想迭代形状组成的点 另一个类 所以Shape必须为其提供一个接口 迭代应该是这样的 for Point p shapeObject some code
  • 访问类库中的 Mustoverride 属性时出现 AccessViolationException

    这有点复杂 但我会尽力解释清楚 我有一个通用代码组件的类库 我尝试做一些常见的ConfigurationHandler基类 以简化创建自定义配置部分 集合和元素 我最终得到的是 The ConfigurationSectionBase类是通