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 窗體不支持的多線程單元模型。
轉載于:https://www.cnblogs.com/pursue/archive/2010/10/21/1857410.html
總結
以上是生活随笔為你收集整理的WIN7 UAC/结构体的Equals方法/C# 开发wince程序,窗口上总留有一块空白区域/静态构造函数...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转】解决IIS 用localhost需
- 下一篇: Bitmap截图