C#互操作性与数组指针一样短,且不安全

时间:2018-12-03 06:29:47

标签: c# pointers interop

我对Interop的C#经验不足,并且现在正遇到Pointer问题。我有一个外部编译的DLL和一个C#API(无法更改其中的内容)。 Interop代码本身看起来像(并且必须进行bot更改)

[DllImport("FWLIB32.dll", EntryPoint="cnc_rdcurrent")]
public static extern short cnc_rdcurrent( ushort FlibHndl, out short a );

第二个参数是(根据文档)短数组的地址,外部调用会将数据放入其中。实际大小是在运行时确定的。

目前,我正在考虑类似(未测试)

            short* c = stackalloc short[N];
            for (int i = 0; i < N; i++) c[i] = 0;
            short cc = (short)c;

            int NCReadCode = Focas1.cnc_rdcurrent(flibHndl, out cc);

但这需要不安全的代码。由于应用程序的其余部分完全安全(其他API成员使用预定义的结构而不是显式的内存地址)

那么,有没有没有不安全代码的方法? (第二,如果您发现我的想法有缺陷,我也很高兴听到;))

谢谢大家!

1 个答案:

答案 0 :(得分:0)

因此,如果已知元素a1(): mov rax, QWORD PTR s1[rip] mov QWORD PTR s2[rip], rax ret a2(): mov rax, QWORD PTR s1[rip] mov QWORD PTR s2[rip], rax ret 的数量并如上所述在其他地方定义,我将建议以下内容:

            da.SelectCommand = cmd
            dt.Clear()
            da.Fill(dt)
            DataGridView1.DataSource = dt
            con.Close()



Select (SELECT [id] FROM INVENTORY WHERE ID = coalesce(p.itemid, s.itemid)) AS [ID],
(SELECT [itemname] FROM INVENTORY WHERE ID = coalesce(p.itemid, s.itemid)) AS [ITEM NAME],
(SELECT [UPC] FROM INVENTORY WHERE ID = coalesce(p.itemid, s.itemid)) AS [UPC],
(SELECT [CustomUPC] FROM INVENTORY WHERE ID = coalesce(p.itemid, s.itemid)) AS [CUSTOM UPC],
(SELECT [Description] FROM INVENTORY WHERE ID = coalesce(p.itemid, s.itemid)) AS DESCRIPTION,
coalesce(p.sum_qty, 0) - coalesce(s.sum_qty, 0) as [Quantity],
(SELECT [UOM] FROM INVENTORY WHERE ID = coalesce(p.itemid, s.itemid)) AS UOM,
(coalesce(p.sum_qty, 0) - coalesce(s.sum_qty, 0)) * ((SELECT CAST([UOMUNIT] AS DECIMAL(18,2)) FROM INVENTORY WHERE ID = coalesce(p.itemid, s.itemid))) as [Quantity],
(SELECT UOMMeasure FROM INVENTORY WHERE ID = coalesce(p.itemid, s.itemid)) AS SUOM,
(coalesce(p.sum_qty, 0) - coalesce(s.sum_qty, 0))*(SELECT CAST([TUNIT] AS DECIMAL(18,2)) FROM INVENTORY WHERE ID = coalesce(p.itemid, s.itemid)) as [Quantity],
(SELECT TUOM FROM INVENTORY WHERE ID = coalesce(p.itemid, s.itemid)) AS TUOM,(SELECT [Cost] FROM INVENTORY WHERE ID = coalesce(p.itemid, s.itemid)) AS [COST PRICE],
(SELECT [Markup] FROM INVENTORY WHERE ID = coalesce(p.itemid, s.itemid)) AS [MARKUP%],(SELECT [Selling] FROM INVENTORY WHERE ID = coalesce(p.itemid, s.itemid))AS [SELLING PRICE],
(SELECT [Wholesale] FROM INVENTORY WHERE ID = coalesce(p.itemid, s.itemid)) AS [WP],
(SELECT [MRP] FROM INVENTORY WHERE ID = coalesce(p.itemid, s.itemid)) AS MRP,
(SELECT [GSTP] FROM INVENTORY WHERE ID = coalesce(p.itemid, s.itemid)) AS [GST%],
(SELECT [ISBill] FROM INVENTORY WHERE ID = coalesce(p.itemid, s.itemid)) AS [BILLABLE],
(SELECT [Batch] FROM INVENTORY WHERE ID = coalesce(p.itemid, s.itemid)) AS BATCH,
(SELECT [Firm] FROM INVENTORY WHERE ID = coalesce(p.itemid, s.itemid)) AS FIRM,
(SELECT [Product] FROM INVENTORY WHERE ID = coalesce(p.itemid, s.itemid)) AS PRODUCT,
(SELECT [Brand] FROM INVENTORY WHERE ID = coalesce(p.itemid, s.itemid)) AS BRAND,
(SELECT [Groupname] FROM INVENTORY WHERE ID = coalesce(p.itemid, s.itemid)) AS [GROUP],
(SELECT [Cateryname] FROM INVENTORY WHERE ID = coalesce(p.itemid, s.itemid)) AS [CATEGORY],
(SELECT [HSN] FROM INVENTORY WHERE ID = coalesce(p.itemid, s.itemid)) AS HSN,
(SELECT [IncludeFree] FROM INVENTORY WHERE ID = coalesce(p.itemid, s.itemid)) AS FREE,
(SELECT [UPCF] FROM INVENTORY WHERE ID = coalesce(p.itemid, s.itemid)) AS [UPC FREE],
(SELECT [Descf] FROM INVENTORY WHERE ID = coalesce(p.itemid, s.itemid)) AS [DESC],
(SELECT [UOMUnit] FROM INVENTORY WHERE ID = coalesce(p.itemid, s.itemid)) AS [UOM-UNIT],
(SELECT [UOMMeasure] FROM INVENTORY WHERE ID = coalesce(p.itemid, s.itemid)) AS SUOM,
(SELECT [Reorder] FROM INVENTORY WHERE ID = coalesce(p.itemid, s.itemid)) AS [REORDER] 
from (select inv.ItemName,dp.itemid, sum(cast(dp.qty as numeric(18, 2))) as sum_qty from detailpurchase dp, inventory inv where dp.itemid=inv.id  group by dp.itemid,inv.ItemName ) p full outer join 
( select inv.ItemName,ds.itemid, sum(cast(ds.qty as numeric(18, 2))) as sum_qty   from detailsale ds, inventory inv where ds.itemid = inv.id    group by ds.ITEMID,inv.ItemName ) s on s.ITEMID = p.ITEMID order by s.itemname,p.ItemName asc

使用时:

N

因此,您的托管程序集负责阵列内存管理,而非托管DLL将结果复制到预分配的内存中。不需要不安全的代码。