簡體   English   中英

如何用無效的參考語法重構這個反編譯的 C# 代碼?

[英]How to refactor this decompiled C# code with invalid reference syntax?

反編譯一個程序集后,它生成的代碼產生了很多類似的方法:

internal long m_position;

internal void PutString(long RecordNumber, string s)
{
    if (s == null)
        s = "";
    int byteCount = this.m_Encoding.GetByteCount(s);
    this.SetRecord(RecordNumber);
    this.LengthCheck(byteCount);
    if (byteCount != 0)
        this.m_sw.Write(s);
    // ISSUE: variable of a reference type
    long& local;
    // ISSUE: explicit reference operation
    long num = checked (^(local = ref this.m_position) + (long) byteCount);
    local = num;
}

只有從// ISSUE開始的代碼有問題。 如您所見,它包含無效的語法long& local; . 我找到了這個答案,它很好地解釋了這是什么。 在閱讀了 C# ref locals 之后,我嘗試重構此方法以便它可以編譯,但我沒有成功。 ^(local = ref this.m_position)部分真的很適合我,因為我在按位運算方面不是很強大。

有人可以幫我重構最后三行並向我解釋它是如何工作的嗎? 這種模式在反編譯的代碼中幾乎逐字出現數百次,所以一旦我“理解”這個例子,我應該對它的 rest 沒有問題。

這是 dotPeek 失敗但 ILSpy 處理得很好的事情之一。 您看到的是+=運算符的編譯器優化。 而不是計算字段位置兩次 - 一次獲取值並再次存儲它 - 編譯器生成計算字段偏移量的代碼,然后將其用於操作的兩個部分。

您遇到問題的位(未知的^運算符)很可能是 dotPeek 嘗試顯示 ref 變量的取消引用。 當然,在 C# 中這不是必需的,我們只使用變量本身的名稱。

只需將其重寫為:

m_position += byteCount;

編譯器將決定是否要添加該特定優化。

long&表示 long 的引用類型,應替換為ref long 然后將m_position字段的地址分配給local變量(使local成為它的別名),然后在向其添加字節數時檢查算術溢出。 不完全確定插入符號,在托管 C++ 中,它是指導 object GC 的帽子,所以我想這就是它在做什么。 當算術檢查成功完成時,通過local var 將m_position字段設置為當前值加上byteCount

ref long local = ref this.m_position;
long num = checked(local + (long)byteCount);
local = num;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM