“ private extern String PadHelper”的源代码在哪里?

时间:2019-04-09 21:13:37

标签: c# .net padleft

当我在.NET源代码中寻找以下源代码时,我没有找到PadLeftPadRight中的方法PadHelper的源代码。

我的搜索是否有问题?

[System.Security.SecuritySafeCritical]  // auto-generated
[ResourceExposure(ResourceScope.None)]
[MethodImplAttribute(MethodImplOptions.InternalCall)]
private extern String PadHelper(int totalWidth, char paddingChar, bool isRightPadded);

1 个答案:

答案 0 :(得分:3)

这似乎不是一个有据可查的东西。我也不知道更多细节以及它如何工作,但请看一下CodeProject上的this thread。该方法似乎位于comstring.cpp中。

很遗憾,此线程中已链接的帖子不再可用。这可能很有趣。

编辑:找到完整的源代码here on github

/*==================================PadHelper===================================
**Action:
**Returns:
**Arguments:
**Exceptions:
==============================================================================*/
FCIMPL4(Object*, COMString::PadHelper, StringObject* thisRefUNSAFE, INT32 totalWidth, CLR_CHAR paddingChar, CLR_BOOL isRightPadded)
{
    CONTRACTL {
        DISABLED(GC_TRIGGERS);
        THROWS;
        MODE_COOPERATIVE;
        SO_TOLERANT;        
    } CONTRACTL_END;

    STRINGREF refRetVal = NULL;
    STRINGREF thisRef = (STRINGREF) thisRefUNSAFE;
    HELPER_METHOD_FRAME_BEGIN_RET_ATTRIB_1(Frame::FRAME_ATTR_RETURNOBJ, thisRef);
    //-[autocvtpro]-------------------------------------------------------

    WCHAR *thisChars, *padChars;
    INT32 thisLength;


    if (thisRef==NULL) {
        COMPlusThrow(kNullReferenceException, L"NullReference_This");
    }

    RefInterpretGetStringValuesDangerousForGC(thisRef, &thisChars, &thisLength);

    //Don't let them pass in a negative totalWidth
    if (totalWidth<0) {
        COMPlusThrowArgumentOutOfRange(L"totalWidth", L"ArgumentOutOfRange_NeedNonNegNum");
    }

    //If the string is longer than the length which they requested, give them
    //back the old string.
    if (totalWidth<thisLength) {
        refRetVal = thisRef;
        goto lExit;
    }

    if (isRightPadded) {
        refRetVal = NewString(&(thisRef), 0, thisLength, totalWidth);
        padChars = refRetVal->GetBuffer();
        for (int i=thisLength; i<totalWidth; i++) {
            padChars[i] = paddingChar;
        }
        refRetVal->SetStringLength(totalWidth);
        _ASSERTE(padChars[totalWidth] == 0);
    } else {
        refRetVal = NewString(totalWidth);
        INT32 startingPos = totalWidth-thisLength;
        padChars = refRetVal->GetBuffer();
        // Reget thisChars, since if NewString triggers GC, thisChars may become trash.
        RefInterpretGetStringValuesDangerousForGC(thisRef, &thisChars, &thisLength);

            memcpyNoGCRefs(padChars+startingPos, thisChars, thisLength * sizeof(WCHAR));

        for (int i=0; i<startingPos; i++) {
            padChars[i] = paddingChar;
        }
    }

lExit: ;
    //-[autocvtepi]-------------------------------------------------------
    HELPER_METHOD_FRAME_END();
    return OBJECTREFToObject(refRetVal);
}
FCIMPLEND