首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C#为MarshalAs属性类定义自定义UnmanagedType

C#为MarshalAs属性类定义自定义UnmanagedType
EN

Stack Overflow用户
提问于 2011-09-30 12:04:11
回答 1查看 8K关注 0票数 2

是否可以为MarshalAs属性类定义自定义UnmanagedType?具体来说,我想将一个长的into时间转换为DateTime类型。就像这样:

代码语言:javascript
运行
复制
[MarshalAs(UnmanagedType.LongTimeUnix)]
public DateTime Time;

我必须将自定义的LongTimeUnix枚举类型放在哪里,以及将时间转换代码放在哪里:

代码语言:javascript
运行
复制
public static DateTime ConvertUnix2DateTime(long timeStamp)
{
        DateTime DT = new DateTime(1970, 1, 1, 0, 0, 0, 0);
        DT = DT.AddSeconds(timeStamp);
        return DT;
}

当将数据传输到

代码语言:javascript
运行
复制
(SomeStruct)Marshal.PtrToStructure(
 IntPtr,
 typeof(SomeStruct));

我希望长时间的unix自动与上面的代码sinppet进行转换。我是否必须继承MarshalAs类并将转换写入这个类?谢谢你,尤尔根

更新这里是自定义封送处理程序:

代码语言:javascript
运行
复制
class MarshalTest : ICustomMarshaler
{
    public void CleanUpManagedData(object ManagedObj)
    {
        throw new NotImplementedException();
    }

    public void CleanUpNativeData(IntPtr pNativeData)
    {
        throw new NotImplementedException();
    }

    public int GetNativeDataSize()
    {
        return 8;
    }

    public IntPtr MarshalManagedToNative(object ManagedObj)
    {
        throw new NotImplementedException();
    }

    public object MarshalNativeToManaged(IntPtr pNativeData)
    {
        long UnixTime = 0;
        try
        {
            UnixTime = Marshal.ReadInt64(pNativeData);
        }
        catch (Exception e)
        {

           QFXLogger.Error(e, "MarshalNativeToManaged");
        }
        DateTime DT = new DateTime(1970, 1, 1, 0, 0, 0, 0);
        DT = DT.AddSeconds(UnixTime);
        return DT;
    }
 }

以下是类的定义:

代码语言:javascript
运行
复制
unsafe public struct MT5ServerAttributes
{
    /// <summary>
    /// Last known server time.
    /// </summary>
    [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(MarshalTest))]
    public DateTime CurrentTime;

    //[MarshalAs(UnmanagedType.U8)]
    [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(MarshalTest))]
    public DateTime TradeTime;

 }

最后,从非托管内存封送数据的代码:

代码语言:javascript
运行
复制
try
{
   MT5ServerAttributes MT5SrvAttributes = (MT5ServerAttributes)Marshal.PtrToStructure(mMT5Proxy.MT5InformationProxy.ServerData,
                                                                    typeof(MT5ServerAttributes));
}
catch (Exception e)
{

QFXLogger.Error(e, "ConsumeCommand inner");
}

当运行此操作时,将引发以下超异常(这不是PtrToStructure的直接异常!)不能封送类型为‘QFX_DLL.MT5ServerAttributes’的字段'CurrentTime‘:无效的托管/非托管类型组合( DateTime类必须与Struct配对)。有什么想法吗?

EN

Stack Overflow用户

回答已采纳

发布于 2011-09-30 12:09:59

不能将自己的内容添加到枚举中,但可以使用UnmanagedType.CustomMarshaler。若要指定要使用自定义类型封送它,请执行以下操作。

MSDN有一个完整的章节专门讨论这个问题。

你最终会做一些这样的事情:

代码语言:javascript
运行
复制
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(MyCustomMarshaler))]
public DateTime Time;

然后将MyCustomMarshaler实现为ICustomMarshaler

票数 6
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7610069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档