【发布时间】:2012-04-08 02:38:58
【问题描述】:
在 C# 中,我定义了一个结构:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct MyObject
{
[MarshalAs(UnmanagedType.LPWStr)]
public string var1;
[MarshalAs(UnmanagedType.LPWStr)]
public string var2;
};
我在 C++ 中有这个结构:
public value struct MyObject
{
LPWSTR var1;
LPWSTR var2;
};
在 C++ 的方法中,这是一个从 C# 调用的公共类:
TestingObject(MyObject^ configObject)
{
// convert configObject from managed to unmanaged.
}
对象已正确调试,我可以看到两个字符串 var1 和 var2。但是,现在的问题是我需要将对象:configObject 编组为非托管对象。
我想到的是做这样的事情:
TestingObject(MyObject^ configObject)
{
// convert configObject from managed to unmanaged.
MyObject unmanagedObj = (MyObject)Marshal::PtrToStructure(configObject, MyObject);
}
这是我能想到的,但当然,我得到了这个错误:
错误 2 错误 C2275: 'MyObject' : 非法使用此类型作为 表达
将托管对象转换为非托管对象是否正确?如果是这样,我怎样才能正确地Marshal::PtrToStructure?如果没有,我该怎么办?
【问题讨论】:
-
你的 C# 不会编译,除非你定义了别名(或实际类型)称为
LPWSTR。 -
这是我的错误。我刚刚更新了它
-
就像@Botz 在他的回答中提到的那样,这里没有非托管类型。你想做什么?