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();
}
}
}

...全文
233 点赞 收藏 11
写回复
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日
检查相关参数类型是否支持
回复 点赞
发动态
发帖子
C#
创建于2007-09-28

8.5w+

社区成员

64.0w+

社区内容

.NET技术 C#
社区公告
暂无公告