在 C# 中使用 P/Invoke 注册 _set_purecall_handler 函数

2023-12-07

我使用时遇到问题_set_purecall_handler使用 C# 中的 P/Invoke。

基本上,这有效:

(C++)

_set_purecall_handler(MyPureCallHandler);

void MyPureCallHandler(void)
{
    // gets called
}

但这并没有:

(C#)

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate void PureCallHandler();

[DllImport("msvcr100.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern IntPtr _set_purecall_handler([MarshalAs(UnmanagedType.FunctionPtr)] PureCallHandler handler);

_set_purecall_handler(MyPureCallHandler);

private void MyPureCallHandler()
{
    // *** doesn’t get called ***
}

我不确定我的 P/Invoke 方法签名是否正确,但当我调用该函数时它不会抛出任何错误(它只是不会在纯虚拟调用错误时触发回调)。

背景

我们有许多应用程序(C++、C++/CLI 和 C#)使用单个 C# 库来捕获异常。这会注册各种处理程序(AppDomain.CurrentDomain.UnhandledException、SetUnhandledExceptionFilter 等)并捕获大多数异常。

但是,它不能捕获纯虚拟调用错误,因此我们需要注册上述函数。


经过反复试验,我发现引用msvcr100d.dll(d = debug) 而不是 msvcr100.dll 工作,因为我在调试器下工作。

这是我的源代码(我不知道这是否是好的做法,但我已经在调试/发布模式下成功测试):

private const string DllName =
    #if DEBUG
        "msvcr100d.dll";
    #else
        "msvcr100.dll"; 
    #endif

public delegate void PureCallHandler();

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

在 C# 中使用 P/Invoke 注册 _set_purecall_handler 函数 的相关文章

  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

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

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile

随机推荐

  • Angular + ng-bootstrap - 模态:窗口未打开

    我是 Angular 新手 在尝试使用 ng bootstrap 模式的简单示例时遇到问题 我只是尝试打开一个窗口 但它出现在我的应用程序中 我想打开一个新窗口 如 ng bootstrap 示例中所述 我在用 角度 4 0 0 Boots
  • Interop COM(-isch) 接口封送处理会导致简单调用时出现 AccessViotlationException

    我正在尝试为本机 C 插件标准编写托管互操作库 这个本机 C 库使用 COM 兼容的接口设计 然而 它不做任何类注册的事情 与 COM 一样 所有接口都派生自 IUnknown 称为 FUnknown 但无论如何都是相同的 3 个方法 我编
  • 如何从根域访问子域的html5 localStorage?

    当我有 www mydomain com 和 mydomain com 时 它们每个都有一个单独的 localStorage 我读过这里http msdn microsoft com en us library cc197062 VS 85
  • 尝试创建链表但指针分配错误

    我正在尝试制作一个链接列表并创建一些方法 但是 我收到错误 赋值使指针来自整数 无需强制转换 这是我的代码 include
  • 环境检测:node.js或浏览器

    我正在开发一个 JS 应用程序 需要在客户端和服务器端 在浏览器上的 Javascript 和 Node js 中 工作 并且我希望能够重用以下代码部分 用于两侧 我发现window是一个只能在浏览器上访问的变量 并且global在节点中
  • 创建具有多列的数据框,这些列都是不同窗口的滚​​动平均值

    我有一个 mydata 数据框 有 2 列 日期列和值列 我想将列附加到数据框中 这些列是各个窗口中 值 列的移动平均值 目前 mydata 有 2 列 Column 1 date Column 2 value 我希望第 3 列是值列的 2
  • 抑制 libsvm 中的输出 (python)

    我正在使用 python 中的 libsvm svmutils 来执行分类任务 分类器是准确的 但是 我得到这样的输出 optimization finished iter 75 nu 0 000021 obj 0 024330 rho 0
  • Sqlalchemy 将 WHERE 子句复制到 FROM

    我向 psql 编写了原始查询 它工作正常 但是当我在 sqlalchemy 中编写此查询时 我的 WHERE 子句复制到 FROM 子句 select id from T1 where arr array select l id from
  • 条件c++中对象的实例化

    假设我想根据某些情况实例化不同类型的对象 因此我会在 if 语句体内实例化它们 问题是如果您想稍后使用该对象 则需要在实例化之前声明它 如何声明一个通用对象 Java中有类似对象类的东西吗 我已经进行了一些谷歌搜索 例如 通用对象c 和 对
  • 从 Android HTML 资源创建 SQLite 表

    我尝试在 android 中使用 HTML 在 sqlite 中创建一个表 但它不起作用 示例 HTML 在这里
  • C# 函数和可选参数

    我知道在 C 中可以定义可选参数 我的问题是这有多灵活 令 f 为如下函数 其中a强制性和b c选修的 class Test public void f int a int b 2 int c 3 现在 我知道我可以通过以下方式调用该函数
  • 如何使用 Swift 3 为按钮制作摇动动画 [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我有一个每 3 秒调用一次的函数 我怎样才能制作一个晃动的动画button左右摇晃 func shakeButton if opened false Shake Animatio
  • VSCode 在片段中链接正则表达式转换

    我正在尝试通过两种方式在 VSCode 中自动转换文件名 假设我有test file name md 我想结束Test File Name在我的文档中 现在我可以分别完成转换的两个部分 但我正在努力寻找如何将它们组合起来 要删除所有 并将它
  • 当类型是映射的任何成员时提高 Typescript 速度?

    例如 我有这些类型 class User extends Entity class Post extends Entity type Entities user User post Post potentially hundreds mor
  • 如何将数据文件作为矩阵导入并从 python 脚本运行 .m 文件?

    我有一个 m 文件 用于在 matlab 中运行神经网络 该文件已本地安装在我的计算机上 我正在尝试编写一个 python 脚本 它将多次循环遍历神经网络可能的传输和训练 函数列表 我编写了一个函数来打开和编辑 m 文件 但我不知道如何操作
  • 从 .NET Windows 服务调用 COM 组件

    我有一个用 NET C 编写的 Windows 服务 它调用 COM 组件 我还有一个 NET Windows 窗体测试应用程序 用于测试 COM 组件 从测试应用程序来看它运行良好 但是 当我在 Windows 服务中使用相同的代码时 什
  • 检测 Bash“导出”值的失败

    在 Bash 中 我执行命令并将结果放入变量中 如下所示 export var svn ls 但是 如果 SVN 由于某种原因失败 例如它返回非零错误代码 则导出仍会返回状态代码 0 如何检测执行的命令是否失败 var svn ls if
  • 在 Ruby 中使用多个进程

    Ruby 是否有一个模块可以轻松地在多个进程之间共享对象 我正在寻找类似于Python的东西多重处理 它支持可以在进程之间共享的进程安全队列和管道 我认为您可以使用 Ruby IO 的功能做很多您想做的事情 你在进程之间共享 而不是线程之间
  • 在进行 Web 自动化时,如何使用空手道 DSL 与 Chrome 中的网络选项卡进行交互

    我正在使用空手道 DSL 编写 UI 自动化脚本 在这一点上 我需要从 Chrome 中的网络调用中获取价值 我想与 chrome devtools 网络选项卡中的 Web 服务调用之一进行交互 并获取该 Web 服务的 json 响应 我
  • 在 C# 中使用 P/Invoke 注册 _set_purecall_handler 函数

    我使用时遇到问题 set purecall handler使用 C 中的 P Invoke 基本上 这有效 C set purecall handler MyPureCallHandler void MyPureCallHandler vo