none
請教c#中是否有類似vb中的VarPtr函數,尋找指針地址 RRS feed

  • 問題

  • 請教c#中是否有類似vb中的VarPtr,StrPtr,ObjPtr函數,尋找指針地址的函數,對於c#中的傳值傳址還是有一點不清楚。
    另外是否在stack區的指針都為4byte呢?而64位元的就是8byte ?
    • 已編輯 kuoma 2010年3月3日 下午 02:55
    2010年3月3日 上午 05:23

解答

  • 剛看了一下相關文件, 是利用 GCHandle 結構 來做
    有人用C#寫了一個這樣的Method
    int VarPtr(object e)
    {
        System.Runtime.InteropServices.GCHandle gh = System.Runtime.InteropServices.GCHandle.Alloc(e, System.Runtime.InteropServices.GCHandleType.Pinned);
        int gc = gh.AddrOfPinnedObject().ToInt32();
        gh.Free();
        return gc;
    }

    MSDN 文件庫很重要
    問題本身越具體, 越容易得到大家的回應
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    • 已標示為解答 kuoma 2010年3月3日 下午 03:35
    2010年3月3日 上午 05:49
    版主

所有回覆

  • 有沒有這類的函數我不確定,不過對於傳址的話你可以在變數名前加上 ref 關鍵字試試看~~

    ref (C# 參考)
    http://msdn.microsoft.com/zh-tw/library/14akc2c7(VS.80).aspx
    萬丈高樓平地起,只要有心不艱辛
    2010年3月3日 上午 05:39
  • 剛看了一下相關文件, 是利用 GCHandle 結構 來做
    有人用C#寫了一個這樣的Method
    int VarPtr(object e)
    {
        System.Runtime.InteropServices.GCHandle gh = System.Runtime.InteropServices.GCHandle.Alloc(e, System.Runtime.InteropServices.GCHandleType.Pinned);
        int gc = gh.AddrOfPinnedObject().ToInt32();
        gh.Free();
        return gc;
    }

    MSDN 文件庫很重要
    問題本身越具體, 越容易得到大家的回應
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    • 已標示為解答 kuoma 2010年3月3日 下午 03:35
    2010年3月3日 上午 05:49
    版主
  • static int VarPtr(object e)
    {
        System.Runtime.InteropServices.GCHandle gh = System.Runtime.InteropServices.GCHandle.Alloc(e, System.Runtime.InteropServices.GCHandleType.Pinned);
        int gc = gh.AddrOfPinnedObject().ToInt32();
        gh.Free();
        return gc;
    }

    public static void Main(string[] args)
    {
        string stra = "ABC";
        string srtb = VarPtr(stra).ToString("x");//這一個是對的
        Console.WriteLine(stra);
        int inta = 1;
        string intb = VarPtr(inta).ToString("x");//這一個應該是副本地址
        Console.WriteLine(inta);
    }
    再請一下,試了結果字串真的有指到此托管堆裡的地址,然後整數型態我再猜想是不是傳進有經過拆裝箱?但我改成傳入VarPtr(int e)結果也是不對的或是這只能針對參考型別的東西才可以使用?
    實測的結果這一個函數比較象vb的ObjPtr

    其最主要的是想測試下面的我的想法是否正確而已
    string a = "123";
    stra(ref a);
    static void stra(ref string a1)//a是否跟參數a1在stack同一個地址但都指向相同拖管堆中的字串

    string b = "456";
    strb(b);
    static void strb(string b1)//b是否跟參數b1在stack不同地址但都指向相同拖管堆中的字串?

    2010年3月3日 上午 07:09
  • 封裝遞送出來的位置,應該是複製體的位置~


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年3月3日 下午 02:19
  • 心冷 您好您是指二個都是複製體的地址嗎?也就是第一個也是副本地址?
    public static void Main(string[] args)
    {
        string stra = "ABC";
        string srtb = VarPtr(stra).ToString("x");//這一個是對的<<<<?
        Console.WriteLine(stra);
        int inta = 1;
        string intb = VarPtr(inta).ToString("x");//這一個應該是副本地址
        Console.WriteLine(inta);
    }

    我有實測過用WinHex去修字串地址的值再Console.WriteLine(stra)印出來結果是我編輯過後的值,但int那一個就不行。
    因為vb有VarPtr,StrPtr,ObjPtr這三個函數怎麼傳一看都很清楚但就是找不到可以列出變數那一個指針(在stack區上的4byte變數)
    2010年3月3日 下午 03:14
  • 微軟目前沒公開 .Net 記憶體模型~
    先前板上應該是小朱大貼過國外測的結果,你可以找找看。
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年3月3日 下午 03:25
  • 謝謝了,我再找找看了,這方面的資料真的不好找。

    2010年3月3日 下午 03:36
  • 用 google 找比較快...
    http://www.google.com.tw/search?hl=zh-TW&source=hp&q=+.Net+%E8%A8%98%E6%86%B6%E9%AB%94%E6%A8%A1%E5%9E%8B+site%3Asocial.msdn.microsoft.com%2FForums%2Fzh-TW%2F&meta=&aq=f


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年3月3日 下午 03:59