【问题标题】:Using double * or short * in C DLL, what to use in C# with pinvoke在 C DLL 中使用双 * 或短 *,在带有 pinvoke 的 C# 中使用什么
【发布时间】:2012-09-18 01:29:06
【问题描述】:

我在 C DLL 中有以下结构:

struct foo
{
      double *x;
      short  *y;
}

调用 DLL 的 c# 应用程序:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public class foo
{
        public ? x;
        public ? y;
}

我知道如果我有一个 int*,我应该使用 IntPtr,但找不到 short* 和 double * 的等价物。

在 C 端,我使用 short * 来分配 short 数组,double * 用于双精度数组。

【问题讨论】:

    标签: c pointers dll pinvoke


    【解决方案1】:

    实际上,C# 中的所有非托管指针都使用IntPtr 表示。之所以称为IntPtr,不是因为它类似于int *,而是因为它是“指针”大小的整数(与Int32Int64 不同,它们分别是32 位和64 位整数)。它的大小取决于平台。

    例如,要获取x[0] 的值,您应该这样做

    double[] arr = new double[1];
    Marshal.Copy(f.x, arr, 0, 1);
    

    要阅读*y,您会这样做

    short val = Marshal.ReadInt16(f.y);
    

    【讨论】:

    • 对不起,我不清楚我想如何使用 C 端的指针。我在帖子的最后一行添加了这一点。
    • 我想我明白了……所以指针就是指针,不管它是 int*、short*、double*、char* 等……它们都是一样的尺寸。我假设它们在 DLL 和 C 中的大小相同,但如果我正在编译 64 位应用程序,我应该使用 Int64?
    • 是的,指针就是指针(在 C 中,它们都可以转换为 void * 并返回)。 IntPtr 自动为正确的大小(32 位应用程序为 32 位,64 位应用程序为 64 位应用程序);这就是“指针大小”的含义。请注意,您不能将 32 位 DLL 链接到 64 位应用程序,反之亦然。
    猜你喜欢
    • 1970-01-01
    • 2016-02-22
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 2014-05-28
    • 1970-01-01
    • 2020-10-14
    • 1970-01-01
    相关资源
    最近更新 更多