访问类库中的 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 的相关文章

  • 最佳 DLL 符号转储实用程序

    我有数百个 DLL 属于一个巨大的意大利面条代码项目 需要查看它们导出或导入哪些调用 如果我能够获得 DLL 之间的依赖关系图 那就太好了 有人可以推荐我免费且可靠的实用程序吗 编辑 依赖遍历器似乎还不够 我不仅需要获取所需 DLL 的列表
  • 为什么 VB.NET 和 C# 中针对值检查 null 存在差异?

    In VB NET http en wikipedia org wiki Visual Basic NET有时候是这样的 Dim x As System Nullable Of Decimal Nothing Dim y As System
  • C# 中的继承树和受保护的构造函数

    给定以下继承树 以有效的方式实现它的最佳方法是什么 abstract class Foo
  • 方法不必要地被调用?

    我有一个 BaseActivity 它可以通过其他所有活动进行扩展 问题是 每当用户离开 暂停 活动时 我都会将音乐静音 我也不再接听电话 问题是 onPause每当用户在活动之间切换时就会被调用 这意味着应用程序不必要地静音和停止tele
  • 为什么 foo.hasOwnProperty('__proto__') 等于 false?

    var foo bar 5 Why is foo hasOwnProperty proto 等于false 它不能来自原型链中更高层的任何对象 因为它是特定于这个对象的 EDIT 有些答案说它已开启Object prototype 但我不明
  • VB.NET 是否优化字符串文字的串联?

    如同this https stackoverflow com questions 288794 does c optimize the concatenation of string literals问题 但对于 VB NET 来说 因为我
  • 我如何在 Visual Studio 2012 中同时构建项目(dll 和 lib)

    我设法在 dll 模式和库模式下设置构建项目 但不能同时设置 对于构建在 dll 中 项目 gt 属性 gt 配置类型 动态库 dll 项目 gt 属性 gt 目标扩展名 dll 对于内置库 项目 gt 属性 gt 配置类型 静态库 lib
  • 如何在VB.NET中画一条线

    我正在尝试用 VB NET 画一条简单的线 我的代码如下 但是当我运行代码时 只显示表单 没有线 我在这里做错了什么 Public Class Form1 Dim pen As System Drawing Graphics Private
  • 在VB.NET中获取文件修改日期

    我的文件夹中有许多文件 我需要获取最后修改日期 所以我用了 FDate IO File GetLastWriteTime FName 对于某些文件 它工作正常 但对于其他文件 我得到的日期为 1 1 1601 但是当我在 Windows 资
  • 您可以传递“类型”作为参数吗?

    我想在 VB NET 中做类似以下的事情 可以吗 Function task value as Object toType as Type Return DirectCast value toType End Function 是的 有系统
  • 将参数传递给基类构造函数

    如果基类和派生类都有带参数的构造函数 那么我们在哪里将参数传递给基类构造函数 像这样 public class DerivedClass BaseClass public DerivedClass int derivedParam Stri
  • 如何在.NET 中编写安全/正确的多线程代码?

    今天我必须修复一些使用线程的旧 VB NET 1 0 代码 问题在于从工作线程而不是 UI 线程更新 UI 元素 我花了一些时间才发现可以使用 InvokeRequired 断言来查找问题 除了上面提到的并发修改问题之外 还可能遇到死锁 竞
  • 参考接口创建对象

    引用变量可以声明为类类型或接口类型 如果变量声明为接口类型 则它可以引用实现该接口的任何类的任何对象 根据上面的说法我做了一个理解上的代码 正如上面所说声明为接口类型 它可以引用实现该接口的任何类的任何对象 但在我的代码中显示display
  • 什么是多重重继承?

    我将以下称为 多重重新继承 直接继承一个类一次 并通过继承其一个或多个后代来间接继承一次或多次 通过继承一个类的两个或多个后代来间接继承一个类两次或多次 我想知道它是否存在以及如何明确访问嵌入的子对象 1 Professional C 2n
  • 枚举的子类化

    有没有一种简单的方法来子类化Javaenum 我问这个问题是因为我有大约 10 个实现相同接口的对象 但它们对某些方法也有相同的实现 因此我想通过将所有相同的实现放置在扩展的中间对象中来重用代码Enum它也是我需要的所有其他类的超类 或许事
  • 为什么 *(int*)0=0 不会导致访问冲突?

    出于教育目的 我正在编写一组导致 C 中运行时异常的方法 以了解所有异常是什么以及导致它们的原因 现在 我正在修改程序 导致AccessViolationException 对我来说 最明显的方法是写入受保护的内存位置 如下所示 Syste
  • 在java程序中使用c++ Dll

    我正在尝试使用System LoadLibrary 使用我用 C 编写的一个简单的 dll UseDllInJava java import com sun jna Library import com sun jna Native imp
  • 防止 Ada DLL 中的名称损坏

    有没有一种简单的方法可以防止在创建 Ada DLL 时 Ada 名称被破坏 这是我的 adb 代码 with Ada Text IO package body testDLL is procedure Print Call is begin
  • Java - java.lang.NoSuchMethodException

    我尝试使用这段代码 Updatem set 在 for 循环内部使用 它会执行几种使用不同类型参数的方法 如果我添加例如 int classgetMethod 在一次迭代后我会得到错误 因为下一个方法需要 String class 是否可以
  • 使用正则表达式验证器上传文件不适用于仅 Firefox IE

    我有一个带有 RegularExpressionValidator 的 FileUpload 和以下验证表达式 a zA Z 2 w w w gif jpg JPG JPEG GIF jpeg png bmp 3dm 3dmf ai drw

随机推荐

  • `__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类是通