none
在C#中使用C++dll接口方法传递数据 RRS feed

答案

  • 已经解决。

    public structQuestionInfo
    {
    Inptr name;
    
    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 260)]
    byte[] content;
    }
    

    使用上面的结构,而不使用

    public structQuestionInfo
    {
    Inptr name;
    
    [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 260)]
    string content;
    }
    在c#中使用Unsafe代码,将底层内存拷贝为bytes再转换

    • 已标记为答案 skczjun 2014年8月22日 1:58
    2014年8月19日 11:16

全部回复

  • 你好,

    因为此问题和C#相关性更强,所以我移动到Visual C#论坛


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年8月17日 19:18
    版主
  • C++的方法中传递了Struct参数,在C#中也应该定义一个struct来作为参数,并且标记StructLayout特性,需要注意的是定义的struct中的成员类型要和C++中Struct成员类型一致:

    [StructLayout(LayoutKind.Sequential)]

    然后在C#中P/Invoke该方法,参考:

    Calling an unmanaged dll from .NET (C#)


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年8月18日 8:14
    版主
  • C++的方法中传递了Struct参数,在C#中也应该定义一个struct来作为参数,并且标记StructLayout特性,需要注意的是定义的struct中的成员类型要和C++中Struct成员类型一致:

    [StructLayout(LayoutKind.Sequential)]

    然后在C#中P/Invoke该方法,参考:

    Calling an unmanaged dll from .NET (C#)


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    你说的这个我知道怎么用,但是传到底层的数据不对。我是这么定义d

    [StructLayoutAttribute(LayoutKind.Sequential, Pack = 4)]
        public struct WktInnerQuestionInfo
        {
            public IntPtr name;
            [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 260)]
            public string content;
    }

    使用的时候底层传入跟传出的数据不一致,因为底层的char*等字串是需要utf编码的,而c#这层是default,该如何做呢?

    c++ dll是第三方的,我不能修改他


    2014年8月18日 9:02
  • 已经解决。

    public structQuestionInfo
    {
    Inptr name;
    
    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 260)]
    byte[] content;
    }
    

    使用上面的结构,而不使用

    public structQuestionInfo
    {
    Inptr name;
    
    [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 260)]
    string content;
    }
    在c#中使用Unsafe代码,将底层内存拷贝为bytes再转换

    • 已标记为答案 skczjun 2014年8月22日 1:58
    2014年8月19日 11:16