PInvoke、指针和数组复制

2024-02-07

我们正在 c#、.net 4.0、Win7 x64 上构建一个应用程序,目标为 x32。

我们在我们的应用程序中使用第三方库。我们知道这个库是用C++编写的。然而,为了让 c# 开发人员使用这个库,他们使用 P/Invoke 对其进行了包装,这就是我们调用 API 函数的方式。

其中一个 API 调用如下:

ReadFromDevice(int deviceAddress, int numBytes, Byte[] data);

该函数从外部设备读取 numBytes 数据并将其放入 data[] 中。正如您所看到的,它期望看到 C# 字节数组作为第三个参数。现在,我们的问题是,我们想将数据读取到预先声明的数组中的任意位置。例如:

Byte[] myData = new Byte[1024*1024*16];
ReadFromDevice(0x100, 20000, &myData[350]) // Obviously not possible in C#

如果我们使用 C/C++,这将是微不足道的。鉴于底层 API 是用 C++ 编写的,我觉得我们也应该能够在 C# 中做到这一点,但是,我不知道如何在 C# 中做到这一点。也许我们可以以某种方式不通过提供的 P/Invoke 接口来调用底层库并编写自定义接口?

任何想法,将不胜感激。

Regards,


虽然这里的其他答案很接近,但没有一个是完全完整的。

首先,您只需声明您自己的 p/invoke 声明。这就是 p/invoke 的美妙之处;从来没有只有一种方法可以做到这一点。

[DllImport("whatever.dll")]
unsafe extern static void ReadFromDevice(int deviceAddress, int numBytes, byte* data);

现在你可以用它来调用它

unsafe static void ReadFromDevice(int deviceAddress, byte[] data, int offset, int numBytes)
{
    fixed (byte* p = data)
    {
        ReadFromDevice(deviceAddress, numBytes, p + offset);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PInvoke、指针和数组复制 的相关文章

随机推荐

  • SSL 错误:无法获取本地颁发者证书

    我在 Debian 6 0 32 位服务器上配置 SSL 时遇到问题 我对 SSL 还比较陌生 所以请耐心等待 我将尽可能多地提供信息 注 真实域名已更改 以保护服务器的身份和完整性 配置 服务器正在使用 nginx 运行 它的配置如下 s
  • 如何衡量 Ionic 3 应用程序的性能?

    我使用 Ionic 3 框架开发了一个应用程序 我想测量我的应用程序的 CPU 和内存使用情况 这样做的最佳做法是什么 You must not use AndroidStudio and XCode来测量内存使用情况离子应用程序 Why
  • 包裹物品之间的 Flex Row 空间

    拥有任意数量的行和任意数量的项目并在所有项目之间设置边距的最动态方式是什么 现在唯一对我有用的就是将每个项目包装在包装器中 将弹性基础设置为包装器并将边距设置为子项 这样做的问题是我无法使每行与该行中最高内容的高度相同 Case 1 Onl
  • 为什么 Azure 资源组与特定区域关联?

    我是 Azure 架构的新手 我试图理解为什么 Azure 资源组 在 Azure 上构建的应用程序的逻辑部署存储桶 在定义时与区域相关联 起初我以为它是为了灾难恢复或地理冗余提供全球分布 但后来我意识到单个资源组可以包含不同区域的Web应
  • 如何在JW播放器中添加自定义提示点

    假设我有一系列以秒为单位的时间 var points 5 30 50 因此 当 jw 播放器初始化时 我想读取这个数组 然后在时间轴上放置提示点 标记 一旦搜索栏到达提示点 我想调用一个执行某些操作的自定义函数 Jw 的文档非常简单 但我发
  • 无法在 Emacs 中启动 `lein` REPL

    在 Emacs 中 使用时clojure mode 我应该能够启动 REPLC c C z 但每当我尝试时 我都会收到错误 Searching for program no such file or directory lein I hav
  • 删除Git lfs链接到文件并直接添加到git

    我需要删除 Git LFS 文件指针 并将文件直接添加到 Git 我在 gitattributes 中有一个过滤器来匹配某些文件 test py filter lfs diff lfs merge lfs text 如何修改它以从此模式中排
  • 如何将 Terser 与 webpack 结合使用

    我在用网页包 6 10 2 with Vue 3 9 3 此安装使用 Uglify js 当我运行时会引发错误npm run build因为它不能与 ES6 一起工作 为了解决这个问题 我删除了 Uglify 表单webpack confi
  • Mac/Cocoa:在我的应用程序中嵌入终端窗口

    有人发现是否可以将终端实例 嵌入 到应用程序中 如果它也继承了选项卡功能和拖放功能 那就太棒了 我在这里看到了几个类似的问题提到iTerm http iterm sourceforge net 但似乎应该有一个更简单的方法 就像 NSTer
  • RxJava:结合冷热观察来相互等待

    我的可观察量是这样定义的 val initLoading Observable fromCallable println System currentTimeMillis subscribeOn Schedulers computation
  • 等待 selenium 中的特定 URL

    我需要在 Chrome 浏览器中使用 Selenium 等待网站自动化中的特定 URL 用户将在我们的网站上进行在线支付 从我们的网站 用户被重定向到支付网关 当用户完成支付后 网关将重定向到我们的网站 我想收到从网关到我们网站的重定向通知
  • CMS编辑方案

    我只是想知道是否有一些方案是编辑 CMS 如 Wordpress Joomla 等 的正确方法 正确步骤 我所说的编辑是指 css javascript 到目前为止 我所做的方法是创建 custom css 和 custom js 等文件
  • 我可以在 React 应用程序中但在 React 组件之外安全地执行 DOM 操作吗?

    我正准备做我的第一个 React 项目 我的阅读已经很清楚地表明我需要让 React 处理所有使用虚拟 DOM 的渲染 并且我不应该执行任何会干扰虚拟 DOM 计算 然而 我无法弄清楚的是 假设我在包含其他 HTML 的页面中的 div a
  • 如何在R中组合多个数据框列

    我有一个 csv 文件 其中包含参与者的人口统计数据 数据是从我的研究数据库 REDCap 中编码和下载的 每个种族都有自己单独的列 也就是说 每个参与者在每一列中都有一个值 如果认可则为 1 如果未认可则为 0 它看起来像这样 SubjI
  • 如何使用自定义消息 git stash 存储未跟踪的文件?

    我该如何表现git stash include untracked带有自定义消息 我试过了 git stash include untracked message Foo and git stash Foo include untracke
  • Python 的 url 请求超出了最大重试次数

    我正在尝试抓取此页面 我使用的代码是这样的 page get https www uobgroup com online rates gold and silver prices page 当我运行此代码时出现此错误 Traceback m
  • Sharpssh 目录列表

    我正在编写一个应用程序 允许我从远程服务器上传和下载文件 我使用 sftp 作为传输协议 我需要将所有文件和目录列出到列表视图中 我使用 Sharpssh 作为 sftp 有人能指出我正确的方向吗 感谢转发 巴斯 范 乌延 Sftp sft
  • Android:前台服务与wakeLock

    我对 Android 比较陌生 所以我问的问题可能看起来很明显 尽管我已经阅读了所有类似标题的问题 并且进行了广泛的搜索 我需要长时间连续监控加速度计 建议采用两种方法 1 获取在加速器被监控的整个过程中保持的部分唤醒锁 和 2 在前台服务
  • 在 Apache 和 WSGI 上部署 Django

    虽然我找到了很多使用 WSGI 在 Apache 上部署 Django 的技术支持 但不幸的是 事实上它们都让我感到困惑 我无法让 Django 运行 我希望这真的是一件容易的工作 但作为一个新人 我面临着困难 我的里面有两个 Django
  • PInvoke、指针和数组复制

    我们正在 c net 4 0 Win7 x64 上构建一个应用程序 目标为 x32 我们在我们的应用程序中使用第三方库 我们知道这个库是用C 编写的 然而 为了让 c 开发人员使用这个库 他们使用 P Invoke 对其进行了包装 这就是我