- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我正在尝试编写一个 C# 包装器来与我们的一个设备驱动程序对话。 (创建单元测试)驱动程序是新的,但是针对旧的 c++ header 进行编码,因此定义了结构布局,并且不能真正更改。
所以我已经复制了设备期望 DeviceIOControl 传入的 c++ 结构。
更新 #3 - 将代码更改为具有相同问题的演示代码。同时清理问题以供其他人使用,请参阅下面的答案
[StructLayout(LayoutKind.Sequential, Pack=1)]
public class Points
{
public int id;
[MarshalAs(UnmanagedType.ByValArray, SizeConst=10)]
public int[] x = new int[10];
[MarshalAs(UnmanagedType.ByValArray, SizeConst=10)]
public int[] y = new int[10];
};
[StructLayout(LayoutKind.Sequential, Pack=1)]
public class Shape
{
public int name;
[MarshalAs(UnmanagedType.ByValArray, SizeConst=10)]
public Points[] p = new Points[10];
};
[StructLayout(LayoutKind.Sequential,Pack1)]
public class GeoShape:Shape
{
public int top;
public int left;
[MarshalAs(UnmanagedType.ByValArray, SizeConst=10)]
public int[] v = new int[10];
};
我对 deviceIOControl
的调用失败了,因为在驱动程序端它检查传入的缓冲区的大小。在 C# 端,我的对象太小了 Marshal.SizeOf( )
返回 52
作为大小,而当它应该是 852
时,如果我将 Size=
添加到 StructLayout
属性,该函数将“通过”,但我相当确定数据没有被正确传递。
我相当确定问题出在这个 public Points[] p = new Points[10];
我认为 Marshal.StructToPtr() 没有正确编码它,因为它本质上是一个多维数组.
所以我想我的问题是这甚至可能吗? 似乎 C# 可能足够聪明,知道如何在内存中为该结构数组创建适量的空间......但也许不是?
我认为“可能”可行的替代方案。
编写自定义序列化程序,将对象转换为 byte[] 并返回,元数据为零。 - 不理想。
是否可以编写一个混合的 clr c++ dll 并尝试将其用作楔子。但是我担心的是,我是否会遇到同样的问题,但只是在托管 C++ 中?或者即使在混合模式下,我也必须编写一个托管类来包装非托管对象,以便在 c# 中使用它。但是问题变成了如何将它传递到 deviceIOcontrol 中,如果我从 c# 中这样做,那么当前的问题是尝试正确编码东西吗?或者,如果我将它传递到调用 DeviceIOControl 的 C++ 调用中,那么我需要知道如何获取传入的每个托管对象的非托管类型。
只需编写创建对象并调用 deviceIOControl 的 C++ 函数,因为参数可能会失控而不太了解?
放弃并在 C++ 中完成所有工作,我实际上正在尝试为我的硬件编写单元测试,而 VS 中较新的 cpp 单元测试确实集成得相当好......
我也看到了这个较早的问题,并尝试了一下,但我认为我的场景有点不同。 Un-/Marshalling nested structures containing arrays of structures
struct Points
{
int id;
int x[10];
int y[10];
};
struct Shape
{
int name;
Points p[10];
};
struct GeoShape :Shape
{
int top;
int left;
int v[10];
};
更新 2我应该澄清一下,我正在尝试向驱动程序发送一个对象,而不是接收一个对象(至少还没有)
我是这样调用它的。
public static bool SetObject(SafeFileHandle device, DeviceControlCode ioctlCode, Object obj)
{
int size = Marshal.SizeOf(obj.GetType());
IntPtr ptr = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(obj, ptr, false);
// call the dviceIOControl method
return Control(device, ref ioctlCode, ptr, size, IntPtr.Zero, 0);
}
最佳答案
我真的不知道标题上有什么,但作为起点考虑阅读 this关于何时使用 struct 或 class
作为警告...您确定 Pack = 1 吗?你有 #pragma 将它设置为 1 吗?
如果您提供相关的 .h 代码,将更容易检查可能存在的问题。无论如何,根据可用信息,我会这样做:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct VENUS_FORMAT4
{
public uint Top;
public uint Left;
public uint Rows;
public uint Columns;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.MAX_CD_ROWS)]
public uint[] V65Rows;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.MAX_CD_COLS_DD2)]
public uint[] CDCols;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.MAX_DD_SECTIONS)]
public uint[] DDSections;
}
除了VENUS_VM4_DEVICE_FORMAT4IL,其余部分与上面基本相同,您必须“复制”字段,因为在使用结构时无法继承(在 C# 中(类型值))。
此外,如果在 C++ 方面您有 union ,这将不起作用,您应该使用LayoutKind.Explicit 和FieldOffset。
关于C#调用具有复杂结构的deviceIOControl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24396540/
我之前发布过question已得到答复,但我也需要对此进行查询。我有一个包含这样数据的表结构(日期格式为 dd/mm/yyyy)。 ID Account Number Unit Ad
我正在使用 React Native Calendars 并尝试为议程组件构建我的数据。 预期的数据结构是(一个对象) { '2012-05-22': [{text: 'item 1 - any j
这个问题不太可能对任何 future 的访客有帮助;它只与一个较小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于全世界的互联网受众。如需帮助使此问题更广泛适用,visit the
两列城镇和优先级。 我需要对表进行排序,以便优先级=1的城镇排在第一位,并且不按名称 ASC 排序,而其余城镇则按名称 ASC 排序。 我该怎么做? 谢谢;) 更新 SELECT * FROM map
我有三个表“Hardware_model”、“Warehouse”和“Brand”,并且表以这种方式一起引用:Hardware_model 仓库Hardware_model 品牌 现在我要执行以下
我有一个 MySQL 表 (tbl_filters),包含 3 列:id、cat、val id 和 val 是数字,cat 是 varchar。每个 id 有多行。 我还有另一个包含多个列的表 (tb
我想获取字段的不同值,比方说:field1...这需要一个如下查询:“从表中选择不同的(字段1)” 但是,对于某些记录,field1 为空,并且还有另一列可以替代 field1,即 field2。对于
表 1 - 用户 id username items 1 Paul 1(0020);2(0001); 表 2 - 项目 id name 1 name_here 在我的用户的项目中,我输入了 2(000
我想连接同一个表 4 次以获取列的显示方式,我不确定是否可以在 1 个 SQL 语句中完成。 tbl_用户名 id username 1 Adam 2 Bob 3 Chris tbl_机
首先,我刚刚开始自己学习JS,没有任何编程经验,这意味着我仍然要了解这种出色的编程语言的基本构建模块。 我的问题与我编写的以下代码有关: let orderCount = 0; con
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 9 年前。 Improve t
我正在使用 XMAPP,MySQL 正在正常运行。在 phpMyAdmin 中,我不太明白这一点,所以我尝试在 PHP 中创建一个。使用此代码,它会告诉我数据库 benutzer。尽管我在 phpMy
是否有一种高效的算法可以找到平均度最大的子图(可能是图本身)? 最佳答案 The paper "Finding a Maximum-Density Subgraph" by Andrew Goldbe
目录 1、业务背景 2、场景分析 3、流程设计 1、业务流程 2、导入流程
我有 2 个表: 1) 包含自 1900 年 1 月 1 日以来所有日期的 Masterdates 表 2) Stockdata 表,其中包含表单中的股票数据 日期、交易品种、开盘价、最高价、最低价、
我有一个非常复杂的 UI,其状态栏不断变化,其中包含多种类型的状态消息,并且 UI 具有复杂的图表控件和已加载的指示性地理 map 。 现在这些小而复杂的区域的数据上下文具有同样复杂的 ViewMod
有人可以用简单的方式向我解释为什么常量在大 O 表示法中无关紧要吗?为什么添加常量时复杂性保持不变。这不是作业问题,我只是想更好地理解这一点。让我明白这个大 O 是为了看到一个函数在接近无穷大时的行为
我在 flex 搜索索引中有以下文档。 [{ "_index": "ten2", "_type": "documents", "_id": "c323c
我有一个以零碎的方式构建的 LINQ 查询,如下所示: var initialQuery = from item in MyContext where xxx == yyy select item;
我目前正在涉足 SQL,并且希望针对我所创建的问题获得一些帮助。 为了练习一些编程,我正在制作一个 IOU 应用程序。下面是我存储的表我的借条记录(忽略一些相关栏目)。该表允许用户说“嘿,你欠我 X
我是一名优秀的程序员,十分优秀!