Marshal.SizeOf的NotSupportedException异常问题

dfpgb 2011-01-04 05:45:12

后面的代码在WIN32上的.Net Framework 2.0上运行没有问题
但是如果在WINCE上的.Net CompactFramework 2.0上运行则会由Marshal.SizeOf引发下面的异常

NotSupportedException
位于 System.Runtime.InteropServices.Marshal.SizeOfInternal()
位于 System.Runtime.InteropServices.Marshal.SizeOf()
位于 ConsoleApplicationMarshalMSDNDemo.Program.Main()

如果注释掉其中的那三行则不会异常

代码如下:

using System;
using System.Collections.Generic;
using System.Text;

using System.Runtime.InteropServices;
using System.Drawing;

namespace ConsoleApplicationMarshalMSDNDemo
{
/// <summary>
/// CALLBACK Procedure to PageSetupDlgTag structure
/// </summary>
public delegate Int32 Prn2CallBack(IntPtr hwnd, Int32 msg, Int32 wp, Int32 lp);

/// <summary>
/// PageSetupDlgTag structure
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public class PageSetupDlgTag
{
public Int32 lStructSize = 0;
public IntPtr hwndOwner = IntPtr.Zero;
public IntPtr hDevMode = IntPtr.Zero;
public IntPtr hDevNames = IntPtr.Zero;
public Int32 Flags = 0;
public Point ptPaperSize;
public Rectangle rtMinMargin;
public Rectangle rtMargin;
public IntPtr hInstance = IntPtr.Zero;
public Int32 lCustData = 0;
public Prn2CallBack lpfnPageSetupHook;;//如果注释掉这三行则不会引发异常
public Prn2CallBack lpfnPagePaintHook;//如果注释掉这三行则不会引发异常
public String lpPageSetupTemplateName = null;//如果注释掉这三行则不会引发异常
public IntPtr hPageSetupTemplate = IntPtr.Zero
} //End Class PageSetupDlgTag

class Program
{
static void Main(string[] args)
{
try
{
PageSetupDlgTag PageSetup = new PageSetupDlgTag();
//下面的Marshal.SizeOf(PageSetup)引发了异常
PageSetup.lStructSize = Marshal.SizeOf(PageSetup); // 84
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}

Console.ReadLine();
}
}
}

...全文
334 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
thestronger 2011-03-06
  • 打赏
  • 举报
回复
郁闷,我在vb.net中也遇到了这问题,也是在.net 中通过,在.net cf 中不能过
dfpgb 2011-01-24
  • 打赏
  • 举报
回复
dfpgb 2011-01-07
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 virtualas 的回复:]
.Net CompactFramework 2.0和.NET 2.0是2码事,Windows上能用的不一定在Windows Mobile上也能用
[/Quote]
是的,不过SDK是FOR WINCE的....
None465465535 2011-01-07
  • 打赏
  • 举报
回复
.Net CompactFramework 2.0和.NET 2.0是2码事,Windows上能用的不一定在Windows Mobile上也能用
dfpgb 2011-01-07
  • 打赏
  • 举报
回复
感谢楼上各位老大的帮助

但是我上面的代码是厂商驱动里的SDK的代码...应该不需要修改就可以用的吧...
有没有别的方向的问题呢...(比如我没引用什么东西啥的?)
厂商是外国的...国内无支持...

xingyuebuyu 2011-01-05
  • 打赏
  • 举报
回复
Marshal.StringToHGlobalAuto方法支持平台中没有WINCE

byte[] bytes=System.Text.Encoding.Default.GetByte(s1);
IntPtr ptr = Marshal.AllocHGlobal(bytes.Length);
Marshal.Copy(bytes,0,ptr,bytes.Length);
PageSetup.lpPageSetupTemplateName=ptr;

//...不需要使用后要释放资源

Marshal.FreeHGlobal(ptr);


xuzysun 2011-01-05
  • 打赏
  • 举报
回复
不错!!
xingyuebuyu 2011-01-05
  • 打赏
  • 举报
回复
    [StructLayout(LayoutKind.Sequential)]
public class PageSetupDlgTag
{
public Int32 lStructSize = 0;
public IntPtr hwndOwner = IntPtr.Zero;
public IntPtr hDevMode = IntPtr.Zero;
public IntPtr hDevNames = IntPtr.Zero;
public Int32 Flags = 0;
public Point ptPaperSize;
public Rectangle rtMinMargin;
public Rectangle rtMargin;
public IntPtr hInstance = IntPtr.Zero;
public Int32 lCustData = 0;
public IntPtr lpfnPageSetupHook;;//如果注释掉这三行则不会引发异常
public IntPtr lpfnPagePaintHook;//如果注释掉这三行则不会引发异常
public IntPtr lpPageSetupTemplateName = null;//如果注释掉这三行则不会引发异常
public IntPtr hPageSetupTemplate = IntPtr.Zero
} //End Class PageSetupDlgTag



PageSetupDlgTag PageSetup = new PageSetupDlgTag();
PageSetup.lpfnPageSetupHook=Marshal.GetFunctionPointerForDelegate(d1);
PageSetup.lpfnPagePaintHook=Marshal.GetFunctionPointerForDelegate(d2);
PageSetup.lpPageSetupTemplateName=Marshal.StringToHGlobalAuto(s1);





WINCE没用过,建议全部改用IntPtr 来代替。
d1,d2是Prn2CallBack的委托实例,s1就是字符串了


dfpgb 2011-01-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wuyq11 的回复:]
检查相关参数类型是否支持
[/Quote]
菜鸟表示理解困难...
wuyq11 2011-01-04
  • 打赏
  • 举报
回复
检查相关参数类型是否支持

110,572

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧