WIN7 UAC/结构体的Equals方法/C# 开发wince程序,窗口上总留有一块空白区域/静态构造函数

1. vs2005在win7下通过IIS7调试时,调用dll失败,但在XP下正常。相信是权限问题,请问应该如何解决?能不能设置dll默认以管理员身分运行?
备注:此DLL已注册成功!

回复引用
全部回复
2010年10月13日 12:30mazhou 
先检查一下这个 DLL 调用,是否有 E_ACCESS_DENIED 错误,如果有,那就是 UAC 的问题。

DLL 并不是一个宿主,它需要依靠特定的宿主 (如动态链接它的可执行文件,或者 RunDll32,DllHost,SvsHost 等其他辅助) 才能运行。因此,需要在其宿主进程上设置 UAC 级别。所以,不可以对 DLL 单独设置 UAC 运行级别。

Windows 7 的 IIS 有几种运行用户凭据,一个是 ApplicationPool,这个的话,默认用户是 IUSR 匿名用户,需要把该用户的权限加成可执行;如果是指定凭据,如 Network Service,则把相应的系统用户权限加给这个 DLL。基本上都能解决问题。

如果用 ApplicationPool 不行的话,直接把凭据改成 Network Service,然后给 DLL 加 Network Service 完全控制。一般问题可以解决。

 

2. 结构体的Equals方法是采用值语义来比较的,也就是只要两个结构体的实例的值相等,两个结构体实例就相等。

大家看这个Demo:

    public struct S
    {
        public double a;
        public double b;
    }

            S s1, s2;
            s1.a = s2.a = 1;
            s1.b = 0.0;
            s2.b = -0.0;
            bool r2 = s1.Equals(s2); // 这里居然是false
            Console.WriteLine(r2);

而且更奇怪的是把struct定义的a字段改成float

    public struct S
    {
        public float a;
        public double b;
    }

那么s1.Equals(s2)就返回true了,这个太奇怪了,a的类型不知道怎么会影响比较的结果!

经测试,只要a和b是同样的类型,同时是float类型或同时是double类型,那结果就是false,只有a和b类型不同,结果才是true.

这个问题研究好久了,实在是没有想出为什么是这样的现象,请教一下大家啊。

查了一下原因,情况是这样的。

因为 struct 的 Equals 方法,是实际上调用 System.ValueType.Equals(Object) 方法。而这个方法做了这 4 步的计算:

1、判断传入的参数 obj 是否为 null,如果 null,返回 false。
2、判断传入参数的类型是不是与被比较的 this 类型相同,如果不同,返回 false。
3、判断如果 this 和传入参数可以被二进制比较,则进行快速二进制比较。
4、利用反射获得每一个公共字段的值,并调用其基础类型上的 Equals 方法进行逐个比较。

您的问题是,因为 struct 类型是值类型,当其所有域的类型相同时,其内部数据类型会得到优化,以节约存储空间 (类似于 C++ 的 Align)。上面的代码使用了基元类型 (primitive type) 且所有域都是同一基元类型,此时第三步 CanCompareBits 返回 true,因此调用了 FastEqualsCheck 而没有进行第四步,所以,结果返回 false。

这可能是 .NET CLR 的一个潜在 bug,不幸的是我并不能拿到 CanCompareBits 和 FastEqualsCheck 的源代码 (因为它们是用本地汇编写的)。但请将这个问题提交给 Microsoft,以便得到更好的解释。

需要说明的是,如果将 foo2.Bar2 和 foo1.Bar2 都赋值为非 0 的 double 值,结果就会是 true。

--------------------------------------------------------------------------------
Mark Zhou
已标记为答案mldark版主2010年7月21日 8:05

3. C# 开发wince程序,窗口上总留有一块空白区域
如果这个窗口带菜单,那么就没有这个问题
不带菜单窗口,那么窗口上原来菜单的那块地方,就无法使用,放控件都是给隐藏了,就留出了这快空白区域  
hi,
1.您的意思是说把菜单控件砍掉,仍无法使用winform窗口的位置??
2.按ctrl+alt+t观察控件的顺序,把你要显示在最上层的控件往上提

4. 静态构造函数用于初始化任何静态数据,或用于执行仅需执行一次的特定操作。在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数。

静态构造函数具有以下特点:
    静态构造函数既没有访问修饰符,也没有参数。
    在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。
    无法直接调用静态构造函数。
    在程序中,用户无法控制何时执行静态构造函数。
    静态构造函数的典型用途是:当类使用日志文件时,将使用这种构造函数向日志文件中写入项。
    静态构造函数在为非托管代码创建包装类时也很有用,此时该构造函数可以调用 LoadLibrary 方法。

1. STAThreadAttribute 指示应用程序的 COM 线程模型是单线程单元。使用 Windows 窗体的任何应用程序的入口点上必须存在STAThreadAttribute 属性;如果没有此属性,则 Windows 组件可能无法正常工作。如果不存在此属性,则应用程序使用 Windows 窗体不支持的多线程单元模型。

posted @ 2010-10-21 13:28  pursue  阅读(662)  评论(0编辑  收藏  举报