如何P/Invoke“__arglist”函数?

2024-01-29

背景:
我用 C++ 编写了以下函数:

extern "C" __declspec(dllexport) int test(const char*, ...);

我使用 P/Invoke 从 C# 调用它:

[DllImport("foo/bar.dll", EntryPoint = "test")]
public static unsafe extern int __unmanaged__test(byte* buffer, __arglist);

Problem:
I need to initialize the __arglist dynamically, meaning that I have an Array<object>, which I have to convert into the __arglist before calling the C++-function.

我已尝试以下操作,但它返回编译器错误:

unsafe {
    byte[] buffer = ....
    object[] args = ....

    // ....

    fixed (byte* ptr = buffer)
        return __unmanaged__test(ptr, __arglist(args)); // <--ERROR
}

有谁知道解决这个问题的方法吗?


for those who do not know what __arlist is: http://bartdesmet.net/blogs/bart/archive/2006/09/28/4473.aspx http://bartdesmet.net/blogs/bart/archive/2006/09/28/4473.aspx

您需要使用 C 风格的调用约定 - 其他调用约定(包括默认的 Stdecl)不支持可变参数:

[DllImport("foo/bar.dll", EntryPoint = "test", 
           CallingConvention = CallingConvention.Cdecl)]
public static unsafe extern int __unmanaged__test(byte* buffer, __arglist);

另一个棘手的部分是__arglist(...)是一个编译时功能 - 它只是为其每个“参数”生成一个(虚拟)堆栈推送。这意味着您不能将它与编译时未知的参数一起使用 - 在示例代码中,您只是尝试创建单个参数,键入object[].

构建辅助反射方法并不太难 - 请参阅通过 DynamicMethod 调用 varargs 方法 https://stackoverflow.com/questions/29458616/calling-varargs-method-via-dynamicmethod举个例子。我无法测试这个,但我猜Expression可以用来轻松构建此代码 - 如果您不必通过它byte*,也就是说(你really必须?通过byte[]也可以工作)。

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

如何P/Invoke“__arglist”函数? 的相关文章

  • 编译时运算符

    有人可以列出 C 中可用的所有编译时运算符吗 C 中有两个运算符 无论操作数如何 它们的结果始终可以在编译时确定 它们是sizeof 1 and 2 当然 其他运算符的许多特殊用途可以在编译时解决 例如标准中列出的那些整数常量表达式 1 与
  • 以文化中立的方式将字符串拆分为单词

    我提出了下面的方法 旨在将可变长度的文本拆分为单词数组 以进行进一步的全文索引处理 删除停止词 然后进行词干分析 结果似乎不错 但我想听听关于这种实现对于不同语言的文本的可靠性的意见 您会建议使用正则表达式来代替吗 请注意 我选择不使用 S
  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • 不支持将数据直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery)

    正在编码视觉工作室2012并使用实体模型作为我的数据层 但是 当页面尝试加载时 上面提到的标题 我使用 Linq 语句的下拉控件往往会引发未处理的异常 下面是我的代码 using AdventureWorksEntities dw new
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • 类模板参数推导 - clang 和 gcc 不同

    下面的代码使用 gcc 编译 但不使用 clang 编译 https godbolt org z ttqGuL template
  • 从Web API同步调用外部api

    我需要从我的 Web API 2 控制器调用外部 api 类似于此处的要求 使用 HttpClient 从 Web API 操作调用外部 HTTP 服务 https stackoverflow com questions 13222998
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • 使用 WebClient 时出现 System.Net.WebException:无法创建 SSL/TLS 安全通道

    当我执行以下代码时 System Net ServicePointManager ServerCertificateValidationCallback sender certificate chain errors gt return t
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况

随机推荐

  • PHP/GD 高斯模糊效果

    我需要使用 PHP 和 GD 混淆图像的某个区域 目前我使用以下代码 for x GET x1 x lt GET x2 x pixel for y GET y1 y lt GET y2 y pixel ImageFilledRectangl
  • Java 通用构建器

    假设我需要一些DerivedBuilder延长一些BaseBuilder 基础构建器有一些方法 例如foo 返回BaseBuilder 派生构建器有方法bar 方法bar应该在方法之后调用foo 为了做到这一点我可以覆盖foo中的方法Der
  • Chrome 的开发工具或 Firebug 中是否存在“设置下一条语句”功能?

    IE 的开发工具 更具体地说是其 JavaScript 调试器 提供 设置下一条语句 命令 使您能够指定接下来应执行哪条语句 这样 您可以有效地跳过函数的某些部分 甚至 再次有效地 提前从函数返回 那么 对于这个函数 function te
  • 如何在iReport中设置整个页面的背景颜色?

    我使用的是 iReport 3 7 4 我想为整个页面设置背景颜色 我没有找到任何背景颜色的报表属性 有人能帮我吗 您可以在以下帮助下解决问题Background Band 我已经把staticText元素上Background Band并
  • 在 Django 管理中,有没有办法显示模型的一对多对象的实际链接列表?

    如果这太复杂或不是正确的做事方式 请随时将我链接到其他内容 或者只是告诉我应该以另一种方式做 基本上 我正在开发一个有客户的项目 每个客户都附加了任意数量的网站 因此 网站模型有一个到客户端模型的外键 网站管理页面非常深入 每个客户端可能有
  • 升级到Xcode4.5 iOS6 Base SDK后运行时异常

    我最近升级了我的代码库以使用 iOS6 Base SDK 我正在使用 XCode 4 5 我只需要将 dylibxml2 2 3 7 更改为 dylibxml2 2 在6 0模拟器上运行良好 我正在使用像 GoogleAnalytics T
  • Celery 无法启动 EOFError('Ran out of input')

    一切都工作得很好 直到 celery beat v3 1 18 Cipater is starting Configuration gt broker gt amqp user staging api user app com 5672 l
  • 将纬度和经度转换为公里

    我正在构建应用程序 我可以在其中获取用户的latitude and longitude使用下面的代码 p Click the button to get your coordinates p
  • 在 Javascript/jQuery 中克隆事件对象[重复]

    这个问题在这里已经有答案了 如何创建一个完全独立的新事件对象 其中包含与给定事件对象完全相同的所有属性e 到目前为止 我已经尝试过以下方法 但没有运气 function myHandler e e e originalEvent metho
  • React+Flux:通知视图/组件操作失败?

    我正在编写一个注册表组件 当表单提交时 它会触发创建用户操作 createUser 操作通过 ajax api 调用创建一个新用户 如果用户已存在 则触发的用户操作将失败 我们知道我们无法从 ajax 调用返回响应 我们需要一个回调 我如何
  • 使用 Flexbox 填充剩余空间

    我希望中间行像其他网站一样填满整个浏览器 所以即使内容很少 我也希望中间的行填满整个空间 这是CSS import compass css3 wrapper display webkit box display moz box displa
  • 如何在 Tkinter 中将小部件放置在 Canvas 小部件中?

    我基本上希望能够使用Canvas作为其他小部件的元容器 我想将我的 GUI 分为左侧 中间和中间部分 在每个部分中我希望能够place小部件如 Checkbutton Button Label etc 如何将小部件放置在 Canvas 小部
  • 什么是大 O 表示法? [复制]

    这个问题在这里已经有答案了 可能的重复 大O的简单英语解释 https stackoverflow com questions 487258 plain english explanation of big o 我知道 Big O 表示法用
  • Nancy 未能在自定义约定中找到静态内容

    我已经设置了一个 Nancy 引导程序来从非默认目录路径 它是自托管的 Nancy 提供静态内容 奇怪的是 以下内容适用于自定义视图位置约定 但不适用于 js 或 css 静态内容约定 是的 文件和文件夹都存在于这些位置 我尝试解决此问题的
  • 使用 SBT 进行多版本构建

    我想在 SBT 中实现以下构建 拥有多个 scala 版本 具有多个目标版本 由于库依赖性 让我们以一个外部库为例 它存在于版本1 0 2 0 3 0和Scala 2 92 2 10 2中 我想编译 汇编和发布 MyProject exte
  • DerivedData 中缺少 TestSummeries.plist 文件

    我正在使用 xcode 11 beta 在 iOS 13 0 设备上运行单元测试 测试执行后 它应该在里面生成一个 testummeries plist 文件 Users YourUsername Library Developer Xco
  • 使用 NSURLConnection 进行 POST - 无 JSON

    我正在尝试用 Objective C 编写一个 iPhone 应用程序 我需要使用 NSURLConnection 发布数据 我能找到的每个例子都涉及 JSON 我不需要使用 JSON 我需要做的就是 POST 数据并从 PHP 脚本获取简
  • Java 编译速度 vs Scala 编译速度

    我已经用 Scala 编程有一段时间了 我喜欢它 但令我恼火的一件事是编译程序所需的时间 这似乎是一件小事 但使用 Java 我可以对我的程序进行一些小更改 单击 netbeans 中的运行按钮 然后 BOOM 它正在运行 随着时间的推移
  • 什么是运行时环境?

    有人可以用简单的术语解释一下这意味着什么吗 是指应用程序代码运行的环境 DOS Windows Linux 等 吗 将其与开发环境和构建环境区分开来 您往往会在这里找到层次结构 运行时环境 执行程序所需的一切 但没有工具可以更改它 构建环境
  • 如何P/Invoke“__arglist”函数?

    背景 我用 C 编写了以下函数 extern C declspec dllexport int test const char 我使用 P Invoke 从 C 调用它 DllImport foo bar dll EntryPoint te