Pinvoking不复制整个字符串

时间:2014-01-07 20:33:58

标签: c# class pinvoke

我有一个C ++本机dll,其结构定义如下:

typedef struct
{
int x;
int y;
unsigned short* orange;
}SET_PROFILE;

C ++ dll中的函数为:

extern "C" _declspec(dllexport) void modifyClass(SET_PROFILE** input)
{
    *input = &globPro;  
}

其中globPro是SET_PROFILE类型的全局对象,其成员橙色为“ABC”。

我已经在C#端重新定义了这个结构作为类:

[StructLayout(LayoutKind.Sequential)]
public class SET_PROFILE
{
    public int x;
    public int y;
    public String orange;
}

并对该功能进行调整:

[DllImport("Project2.dll", CallingConvention = CallingConvention.Cdecl)]
static extern void modifyClass(out IntPtr input);

当我调用此函数然后将其归结为结构时:

IntPtr classPtr = IntPtr.Zero;
classPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(SET_PROFILE)));
modifyClass(out classPtr);
profile1 = (SET_PROFILE)Marshal.PtrToStructure(classPtr, typeof(SET_PROFILE));

现在,profile1的橙色meber只有“A”而不是“ABC”。它与如何使用指针进行复制有关。但是,我不能修改C ++函数。 是因为我使用字符串作为C#类的成员而不是unsigned short []。我也尝试了但失败了。

1 个答案:

答案 0 :(得分:1)

尝试使用以下内容:

[StructLayout(LayoutKind.Sequential)]
public class SET_PROFILE
{
    public int x;
    public int y;

    public System.IntPtr orange;    
    public string OrangeString { get { return Marshal.PtrToStringAnsi(orange); } }
}