我有一个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 []。我也尝试了但失败了。
答案 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); } }
}