【问题标题】:Use unmanaged(C) buffer in managed code(C#) in .NET Compact Framework在 .NET Compact Framework 的托管代码 (C#) 中使用非托管 (C) 缓冲区
【发布时间】:2013-09-13 07:26:27
【问题描述】:

我有两个功能。

  1. 注册一个在 C 中定义的回调函数。
  2. C# 中的回调函数,由 IntPtr 缓冲区组成。

在 C 中,我创建一个字节缓冲区并使用回调函数更新 IntPtr。

问题是,我无法在 C# 标签对象中打印缓冲区。但我可以在 MessageBox 中显示它。

C# 函数:

private void button1_Click(object sender, EventArgs e)
{
        Tempclass.RegCallback(Callback);
}



 public void Callback(IntPtr data,ref  int size)
    {
    byte[] ReadData = new byte[size];

    Marshal.Copy(data, ReadData, 0, size); 

    String szData  = Encoding.UTF8.GetString(data, 0, size); 
    label1.Text =   szData; // error is here.    
    }

C 函数:

typedef void (__stdcall * Callback)( _Out_ byte* , _Out_ int*);
void RM2RegImgCallback (_In_ Callback pfnCallback)
{
    char    buffer[4]={0x64,0x65,0x66,0x00};
    DWORD size =4;
    pfnCallback((byte*)buffer,(int*)&size);
    return;
}

【问题讨论】:

  • 那么也许你应该发布你的代码。不然怎么会有人知道你做错了什么?
  • 请同时显示非托管代码。

标签: c# .net c windows windows-ce


【解决方案1】:

您的代码不完整。 Tempclass.Regcallback 是什么样的?您应该在某个时候调用 GetFunctionPointerForDelegate,而该调用的结果应该是跨越 P/Invoke 边界的内容。

【讨论】:

    【解决方案2】:

    检查 .net 框架是否使用宽字符,所以也许您应该在 C 中使用宽字符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-06
      相关资源
      最近更新 更多