在 C# 中将结构体指针作为参数传递

2024-01-18

我有一个 C++ 函数,已导出到 DLL。 I 包含一个结构体指针作为参数之一。我需要在 C# 中使用此函数,因此我使用 DLLImport 作为该函数,并使用 StructLayout 在 C# 中重新创建了该结构。我尝试使用 ref 传入参数,并尝试使用 MarshalAs(UnmangedType.Struct) 和 Marshal.PtrToStructure 对其进行封送。参数仍然没有正确传递。

Example:

[DllImport("testdll.dll")]
public static extern int getProduct(int num1, int num2, [MarshalAs(UnmanagedType.Struct)] ref test_packet tester);

还有一点信息,该结构包含一个 byte* var,我认为这可能会导致将参数作为引用传递时出现问题。有任何想法吗?我走在正确的轨道上吗?谢谢您的帮助。

感谢 nobugz 的回复。这是结构体 def 的示例:

//C# DEFINITION 

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] 

public struct test_packet 
{ 

     public UInt32 var_alloc_size; 

    public byte* var; 

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = MAX_TAG_LENGTH)] 
    public byte[] tag; 

} 

//ORIGINAL UNMANAGED STRUCT

typedef struct test_packet_tag 
{

    unsigned int var_alloc_size;

    unsigned char *var;

    unsigned char tag[MAX_TAG_LENGTH];
} test_packet;

使用“ref”是正确的方法,摆脱 [MarshalAs] 属性。真正的问题几乎肯定是结构声明。您没有发布任何可以帮助我们帮助您的内容。


DllImportAttribute.CharSet 属性错误,请将其设为 CharSet.Ansi。 “var”成员声明错误,将其设为byte[]。请务必在调用之前对其进行初始化:

 var product = new test_packet();
 product.var_alloc_size = 666;    // Adjust as needed
 product.var = new byte[product.var_alloc_size];
 int retval = getProduct(42, 43, ref product);

最好的猜测,希望它有效。

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

在 C# 中将结构体指针作为参数传递 的相关文章

  • FileStream 构造函数和默认缓冲区大小

    我们有一个使用 NET 4 用 C 编写的日志记录类 我想添加一个构造函数参数 该参数可以选择设置文件选项 WriteThrough http msdn microsoft com en us library system io fileo
  • 为什么在创建矩阵类时使用向量不好?

    对于我的矩阵类 我做了 template
  • ASP.NET Web API 客户端 ProgressMessageHandler Post 任务卡在 WinForm 应用程序中

    我在用着HttpClient and ProgressMessageHandler来自MS ASP NET Web API 客户端库 http nuget org packages Microsoft AspNet WebApi Clien
  • 根据 N 个值中最小的一个返回不同的结果

    不确定如何使标题更具描述性 所以我只是从一个例子开始 我使用下面的代码位 它从枚举中选择一个方向 具体取决于四个轴中哪一个与给定方向相比形成最小角度 static Direction VectorToDirection Vector2 di
  • GCC 和 ld 找不到导出的符号...但它们在那里

    我有一个 C 库和一个 C 应用程序 尝试使用从该库导出的函数和类 该库构建良好 应用程序可以编译 但无法链接 我得到的错误遵循以下形式 app source file cpp text 0x2fdb 对 lib namespace Get
  • 类的成员复制

    在学习 复制成员 概念时 书中给出了如下说法 此外 如果非静态成员是引用 const 或没有复制赋值的用户定义类型 则无法生成默认赋值 我不太明白这个声明到底想传达什么 或者说这个说法指的是哪一种场景 谢谢 该语句与编译器自动为您编写的类
  • 如何获取 QTableView 的标题列表?

    我有一个QTableView我的对话框中的对象 我需要访问该表的水平标题并将它们放入QStringList object 尽管进行了大量搜索 但我在 Qt 文档中找不到如何获取此标头列表 编辑 我发现的最接近的地方是this https w
  • 单例模式和 std::unique_ptr

    std unique ptr唯一地控制它指向的对象 因此不使用引用计数 单例确保利用引用计数只能创建一个对象 那么会std unique ptr与单例执行相同 单例确保只有一个实例属于一种类型 A unique ptr确保只有一个智能指针到
  • std::forward_as_tuple 将参数传递给 2 个构造函数

    我想传递多个参数以便在函数内构造两个对象 以同样的方式std pair
  • C++ php 和静态库

    我创建了一个library a 其中包含 cpp 和 h 文件 其中包含很多类 嵌套类和方法 我想在 php 示例中包含这个静态库并尝试使用它 我想提一下 我是 php 新手 我已经在 test cpp 文件中测试了我的 libray a
  • 检查 RoutedEvent 是否有任何处理程序

    我有一个自定义 Button 类 当单击它时 打开特定窗口 它总是执行相同的操作 我添加了一个可以在按钮的 XAML 中分配的 Click 事件 就像常规按钮一样 当它被单击时 我想执行 Click 事件处理程序 如果已分配 否则我想执行默
  • 运行选定的代码生成器时出错:“未将对象引用设置到对象的实例。”错误?

    我已经尝试了所有解决方案 例如修复 VS 2013 但没有用 当您通过右键单击控制器文件夹来创建控制器并添加控制器时 然后右键单击新创建的控制器的操作并选择添加视图 当我尝试创建视图时 就会发生这种情况 它不是一个新项目 而是一个现有项目
  • 每个租户的唯一用户名和电子邮件

    我正在使用以下代码编写多租户应用程序ASP NET Core 2 1 我想覆盖默认的与用户创建相关的验证机制 目前我无法创建多个具有相同的用户UserName My ApplicationUser模型有一个名为TenantID 我想要实现的
  • .NET Core 中的跨平台文件名处理

    如何处理文件名System IO以跨平台方式运行类以使其在 Windows 和 Linux 上运行 例如 我编写的代码在 Windows 上完美运行 但它不会在 Ubuntu Linux 上创建文件 var tempFilename Dat
  • IEnumerable.Except 不起作用,那么我该怎么办?

    我有一个 linq to sql 数据库 非常简单 我们有 3 个表 项目和用户 有一个名为 User Projects 的连接表将它们连接在一起 我已经有了一个获得的工作方法IEnumberable
  • C++ Streambuf 方法可以抛出异常吗?

    我正在尝试找到一种方法来获取读取或写入流的字符数 即使存在错误并且读 写结束时间较短 该方法也是可靠的 我正在做这样的事情 return stream rdbuf gt sputn buffer buffer size 但如果streamb
  • 如何在 DropDownList 中保留空格 - ASP.net MVC Razor 视图

    我在视图中通过以下方式绑定我的模型 问题是我的项目文本是格式化文本 单词之间有空格 如下所示 123 First 234 00 123 AnotherItem 234 00 123 Second 234 00 我想保留此项目文本中的空格 即
  • 矩阵到数组 C#

    这将是转换方阵的最有效方法 例如 1 2 3 4 5 6 7 8 9 into 1 2 3 4 5 6 7 8 9 in c 我在做 int array2D new int 1 2 3 4 5 6 7 8 9 int array1D new
  • 从 JavaScript 中的 OnClientClick 事件中阻止 C# 中的 asp:Button OnClick 事件?

    我有一个asp Button在我的网页上 它调用 JavaScript 函数和代码隐藏方法 后者进行调用以导航到另一个页面 在 JavaScript 函数中 我正在检查条件 如果不满足这个条件 我想中止导航 以便OnClick方法未被调用
  • Java 和/C++ 在多线程方面的差异

    我读过一些提示 多线程实现很大程度上取决于您正在使用的目标操作系统 操作系统最终提供了多线程能力 比如Linux有POSIX标准实现 而windows32有另一种方式 但我想知道编程语言水平的主要不同 C似乎为同步提供了更多选择 例如互斥锁

随机推荐

  • MSVC++7.1 中的 ifstream.read() 与 ifstream.readsome()

    我只是采用了在 Linux 下开发的文件阅读器的一些旧代码 并尝试在使用 MSVC 7 1 编译的 Windows 项目中使用相同的代码 代码编译没有任何问题 但根据 Windows 上的文件阅读器 该文件似乎是空的 我跟踪问题到 ifst
  • Azure 流量管理器 SSL 设置(非经典)

    我有一个 Azure API 应用服务 我想为其配置 优先 流量管理 这是新的流量管理器 不是经典的 我已将该服务部署到两个独立的 Azure 区域 并配置了流量管理器实例以执行到两个服务实例的优先级路由 这些服务具有以下自定义域配置 fo
  • 在asp.net应用程序上显示sql数据库中存储的UTC时间的本地时间

    我已经将时间以 utc 格式保存在 SQL 数据库中 我在网格视图上显示这些时间 但它们仍然是 UTC 格式 我想将它们转换为客户端浏览器的本地时间 问题是 虽然我可以获得仅适用于当前日期 时间的时区偏移量 如果未来的某些日期最终发生在夏令
  • 如何在 Angular 2 最终版本中编写 HTTP 模拟单元测试?

    我已从 RC4 迁移到最终版本 2 1 0 并且正在重构我的单元测试以符合 2 1 0 语法 除了 HTTP 模拟之外 这很容易 我找不到任何关于如何在 2 1 0 中模拟 HTTP 请求的示例 这是一个 RC4 HTTP 单元测试 我将如
  • 使用 msbuild 从网站部署中排除文件

    我有一个使用 msbuild 部署的网站项目 在项目中 有一些构建所需的文件和文件夹 例如 web config 部分替换文件 但我不想将其部署到目标站点 我能想到的最好的办法是删除这些文件的构建后目标 但我想知道是否有办法让这些文件不复制
  • 由于占用率低而导致 GPU 利用率不足是什么意思?

    我正在使用 NUMBA 和 cupy 来执行 GPU 编码 现在我已将代码从 V100 NVIDIA 卡切换到 A100 但是随后我收到以下警告 NumbaPerformanceWarning 网格大小 27 NumbaPerformanc
  • VSCode Flutter Dart 慢的建议

    我使用 Visual Studio Code 进行 flutter 编程 并且没有使用很多扩展 我喜欢代码补全 但通常太慢 显示所有建议大约需要 1 2 秒 这个问题有什么解决办法吗 这是我已安装的扩展的列表 我被告知要添加此配置 dart
  • 什么是 WCF 服务参考 .datasource 文件?

    Visual Studio 中 创建服务引用 自动生成的 datasource 文件是什么 文件中的注释是这样的 该文件是自动生成的 由 Visual Studio Net 提供 这是 用于存储通用对象数据源配置信息 重命名文件扩展名或编辑
  • FormData 键作为数组

    我正在尝试使用 FormData html5 api 设置多个文件上传 问题是我无法删除 FormData 键上的数组索引 前任 if editor frmData editor frmData append upload files 0
  • IntelliJ Idea Android 项目包括 apk 中不受监管的文件

    我有一个复杂的应用程序结构 主项目有 android 库 它们有自己的 android 库和 jar 主要工程 Libs Android Lib project A Jars Android Lib项目B Jars 为了澄清起见 我有一个
  • 如何在 Sphinx 文档中显示类的继承成员?

    我想记录一些类 这些类都派生自具有一些公共属性的同一基类 并且我想重复子类中每个属性的文档 以便我可以在一个位置看到一个类的所有属性 例如我有这样的代码 class Base object Base class First attribut
  • 构建 .NET Core 控制台应用程序以输出 EXE

    对于面向 NET Core 1 0 的控制台应用程序项目 我无法弄清楚如何在构建期间输出 exe 该项目在调试中运行良好 我尝试过发布该项目 但这也不起作用 这是有道理的 因为 EXE 文件是特定于平台的 但必须有一种方法 我的搜索仅找到对
  • 如何检查设备是否需要 SafeArea? (需要底部/顶部填充)

    有没有一种方法可以检查运行该应用程序的设备是否需要 SafeArea 我需要根据这个 true 或 false 值运行代码 我不需要使用 SafeArea 小部件 如果设备需要填充 我所需要的只是正确或错误的答案 例如 像iPhone 8这
  • CMake:为每个项目设置编译选项和编译功能

    我有一个代码库 例如 存储库 其中包含多个软件组件 可执行文件 库 所有内容都是使用 CMake 构建的 每个组件都有单独的目标 现在 我知道设置编译器标志的现代方法是特定于目标的 target compile options foo PR
  • 什么是金融运作中的锁定、僵局问题?

    盘问SQL 什么时候应该使用 with nolock https stackoverflow com questions 686724 sql when should you use with nolock 在一家当地的金融机构 我因为向他
  • 记录清单

    以下代码似乎向列表中添加了一条新记录 但会用最后创建的记录覆盖所有记录 我可以让它正常工作 lpr Add new personRecord Age pr Age Name pr Name 但这似乎更冗长 并且在真正的应用程序中记录要大得多
  • 使用 Springfox 在 Spring 应用程序中记录 jax-rs 服务

    我想使用 Springfox 记录现有应用程序的 API 我将这些依赖项添加到 pom xml 中
  • 反编译的Jar文件的类路径

    所以我不是计算机科学专业或任何其他专业 我只是在研究一些东西来练习我从视频中观看的一些 Java 技能 我知道这不是主要的方法 但请让我这样做 所以我提取了一个 jar 文件 http www zenlunatics com quizcar
  • C# Linq 与柯里化

    我正在玩一点函数式编程及其各种概念 所有这些东西都很有趣 我曾多次阅读过有关柯里化的内容以及它的优势 但我不明白这一点 以下源代码演示了柯里化概念的使用以及 linq 的解决方案 实际上 我没有看到使用柯里化概念的任何优点 那么 使用柯里化
  • 在 C# 中将结构体指针作为参数传递

    我有一个 C 函数 已导出到 DLL I 包含一个结构体指针作为参数之一 我需要在 C 中使用此函数 因此我使用 DLLImport 作为该函数 并使用 StructLayout 在 C 中重新创建了该结构 我尝试使用 ref 传入参数 并