反编译的程序集 - 异常代码

2023-12-05

我使用 ILSpy 反编译了一个程序集,其中一个类特别引起了我的注意:

public class CustomTextStream : NetworkStream
{
    private EventHandler<CustomEventArgs> someEvent;
    public event EventHandler<CustomEventArgs> SomePublicEvent
    {
        add
        {
            EventHandler<CustomEventArgs> eventHandler = this.someEvent;
            EventHandler<CustomEventArgs> eventHandler2;
            do
            {
                eventHandler2 = eventHandler;
                EventHandler<CustomEventArgs> value2 = 
                    (EventHandler<CustomEventArgs>)Delegate.Combine(eventHandler2, value);
                eventHandler = 
                    Interlocked.CompareExchange<EventHandler<CustomEventArgs>>(
                    ref this.someEvent, value2, eventHandler2);
            }
            while (eventHandler != eventHandler2);
        }
        remove
        {
            // similar stuff...
        }
    }
}

在代码中,似乎私有委托用于触发实际事件:

if (something != null && somethingElse != 0)
{
    this.someEvent(this, new CustomEventArgs(someArg));
}

问题:假设没有发生一些“编译/反编译魔法”,有人能猜出这个自定义访问器背后的想法是什么吗?我对IL不太熟悉,顺便说一句......

(旁注:显然,该应用程序是多线程的,并且利用网络。)


这是编译器生成的新事件处理程序代码。它是在C# 4中引入的(C# 3版本有所不同)

Interlocked.CompareExchange 将第一个参数与第三个参数进行比较,如果它们相等,则将第一个参数替换为第二个参数。这是一个线程安全的操作。循环用于分配变量 eventHandler2 之后且检查之前,另一个线程更改此委托的情况。在这种情况下,Interlocked.CompareExchange 不会执行交换,循环条件不会评估为 true,并且会进行下一次尝试。

C# 3 在事件处理程序中生成简单的代码:

add { lock(this) { changed = changed + value; } }

其性能较低并且可能会导致死锁。

关于这个主题有一系列很棒的文章:

C# 4 中的事件进行了一些修改

C# 4 第二部分中的事件得到了一些修改

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

反编译的程序集 - 异常代码 的相关文章

  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • 随着时间的推移,添加到 List 变得非常慢

    我正在解析一个大约有 1000 行的 html 表 我从一个字符串中添加 10 个字符串 td 每行到一个list td
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • 如何定义一个可结构化绑定的对象的概念?

    我想定义一个concept可以检测类型是否T can be 结构化绑定 or not template
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • 引用的程序集自动由 Visual Studio 替换

    我有 2 个项目 一个可移植类库和一个常规单元测试项目 在可移植类库中 我使用 NuGet 来引用 Microsoft BCL 可移植包 它附带 2 个程序集 System Threading Tasks dll and System Ru
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置

随机推荐

  • 在 Swift 中使用 String 的 enumerateLines 函数

    The enumerateLinesSwift 的函数String类型声明如下 enumerateLines body line String inout stop Bool gt 据我了解 这个声明的意思是 enumerateLines是
  • 如何使用 JSF 2.0 和 EL 2.2 为 Tomcat 7 配置 Maven pom?

    我想用EL 2 2 for JSF 2应用 和tomcat 7配备 EL 2 2 我对以下内容感到困惑 1 我应该提供servlet api jsp api和EL in my pom文件 使用 Maven 为provided或者根本不将它们
  • Java 到 Jackson JSON 序列化:货币字段

    目前 我正在使用 Jackson 从基于 Spring 的 Web 应用程序发送 JSON 结果 我遇到的问题是尝试让所有货币字段输出两位小数 我无法使用解决这个问题setScale 2 因为像 25 50 这样的数字被截断为 25 5 等
  • jquery 验证和 ajax.beginform

    使用 JQuery Validate 插件时提交 Ajax Beginform 不会停止提交 有没有好的方法来确保 Ajax Beginform 不被提交 我还尝试使用 JQuery Forms 插件来 ajaxify 我的表单 这真是一种
  • 如何更改flutter中的日期和时间格式?

    你好吗 我的后端只接受这种格式的日期和时间 2019 03 24 11 00 00 我在我的应用程序日历小部件中使用来获取日期 并以这种格式打印日期 2019 04 24 12 00 00 000Z 我使用此代码来获取时间 TimeOfDa
  • 如何在 Perl 或批处理中合并两个 Excel (xls) 文件?

    我有两个文件可以说a xls and b xls 第一个包含 2 张 第二个包含 3 张 有人可以告诉我是否可以使用 Perl 或批处理脚本合并它们吗 我想要一份包含 5 张纸的输出XLS file 对于 Perl 解决方案使用电子表格 P
  • CSS:突出显示文本效果

    我试图用一些填充来产生突出显示的文本效果 但填充仅应用于开头和结尾 而不应用于新行 highlight background rgba 255 230 0 0 5 padding 3px 5px margin 3px 5px line he
  • ProGuard 仍然显示完整的活动名称

    我正在使用 Proguard 并在我的应用程序中使用此代码 System out println ACTIVITY NAME IS activity getLocalClassName 它在发布模式下打印出活动名称 我认为它应该混淆所有类名
  • torch.optim 对于多维张量返回“ValueError:无法优化非叶张量”

    我正在尝试优化场景顶点的平移torch optim adam 这是来自redner教程系列 在初始设置下效果很好 它尝试通过将所有顶点移动相同的值来优化场景 称为translation 这是原始代码 vertices for obj in
  • 启用 GtkFileChooserDialog 选择文件或文件夹

    使用 GTK Gtk文件选择对话框 我如何允许用户选择文件或文件夹 两者在这里都有效 这可用的行动是互斥的 不幸的是我认为这是不可能的 我在 Transmission 的 创建 torrent 对话框中尝试了一下 最后使用radibox 启
  • FastAPI 中的依赖注入数据模型

    我对 FastAPI 很陌生 我有一个请求 看起来像这样 router post response model EducationInResp async def create Education account education in
  • 哪个库包含 _is_c_termination_complete

    我在将 C 代码与标准库 C 库链接时收到 LNK2019 错误 我需要知道哪些库包含以下功能 is c termination complete acrt initialize acrt uninitialize acrt uniniti
  • 有效查询包含子字符串的列

    给定一个字符串列 其值类似于 123 12 34 56 5 查询所有的最佳方式是什么包含给定编号的记录 12例如 我脑海中的解决方案是 SELECT id FROM things WHERE things path LIKE 12 但据我所
  • ASP.Net5 Startup.cs ConfigurationBuilder [重复]

    这个问题在这里已经有答案了 使用带有 MVC beta 8 的 VS 2015 我收到以下错误 Severity Code Description Project File Line Error CS1503 Argument 1 cann
  • JavaScript 判断动态命名函数是否存在

    我如何检查是否动态地命名对象或函数存在吗 在示例中 var str test var obj str Page str function Page test if typeof obj str function alert ok else
  • 可以为本机 iOS 应用程序指定的捆绑 ID 数量是否有限制?

    我一直尝试为我的本机 iOS 应用程序添加新的捆绑包 ID 尽管系统说它已保存 但当我 30 分钟后返回时 我添加的 ID 已不存在 目前我的应用程序中有 6 个捆绑包 谢谢各位 None
  • 我的对象的 ArrayList,indexOf 问题

    我对 Java 的 ArrayList 有问题 我创建了一个对象 它包含两个属性 x 和 y 现在我已经在 ArrayList 中加载了一些对象 问题是我不知道如何找到我正在搜索的具有 x 属性的某个对象的索引 有什么办法可以做到这一点吗
  • 优化查询

    我有以下功能 CREATE FUNCTION dbo SuiviRupture CodeArticle NVARCHAR 13 CodeSite NVARCHAR 5 CodeStructure NVARCHAR 13 RETURNS ca
  • 比较模型的同一性,但与变量?用减号构造?

    我的团队正在实施一个变体Ceusters 的参照物追踪 在我们的实现中 实体的原始 URI 可以更改 更改为包含 UUID 的内容 但始终保留原始 URI 的链接 例如 Joey rdf type person New York City
  • 反编译的程序集 - 异常代码

    我使用 ILSpy 反编译了一个程序集 其中一个类特别引起了我的注意 public class CustomTextStream NetworkStream private EventHandler