2010-04-27 4 views
3

.Net 3.5 프로젝트에서 msvcrt.dllstrlen 함수를 사용하고있었습니다. 더 구체적으로 :이 기능을 사용하는 경우in .Net 4 : PInvokeStackImbalance 예외

private unsafe static extern int strlen(byte *pByte);

.NET 4.0으로 마이그레이션 한 후, 그것은 PInvokeStackImbalance 예외가 발생합니다.

.NET 3.5 msvcrt.dll을 가져 오거나이 예외를 수정하려면 어떻게해야합니까?

답변

10

문제가 호출 규칙과 같다고 생각하면 Cdecl을 사용해야합니다.

[DllImport("msvcrt.dll", CallingConvention=CallingConvention.Cdecl)] 
private unsafe static extern int strlen(byte* pByte); 
+0

당신에게 크리스 감사드립니다. 그것은 다시 매력처럼 작동합니다.) +1 – SDReyes

+0

위대한, 나는 그것이 기쁜 것을 도왔다. –

+0

+1 오늘 직장에서 똑같은 문제가 있었고 해결책은 내가 필요로하는 것이 었습니다. 고맙습니다. –

1

이것은 실제로 직접적인 대답은 아니지만이 기능과 같은 것으로 사용자가 직접 작성하는 것이 좋습니다. 예를 들어, 다음 C# 코드가 작동 할 수 있습니다 (너무 일하는 것이 기존 기능을 사용하여 아마 하나 라이너가 있지만) :

static int mystrlen(byte[] pbyte) 
    { 
    int i = 0; 
    while (pbyte[i] != 0) 
     i++; 
    return i; 
    } 
1

어떤 4. .NET 3.5에서이 변경 (그리고이 없어야한다, btw, msvcrt.dll은 프레임 워크의 일부가 아닙니다. Microsft C++ 런타임 라이브러리입니다. 프로젝트에서 변경된 사항이 없습니까?

난 그냥 예상대로 작동 및 인쇄 "4"하는이 코드를 시도 :

class Test 
{ 
    public unsafe static void Main(string[] args) 
    { 
     byte[] bytes = new byte[] {70, 40, 30, 51, 0}; 
     fixed(byte* ptr = bytes) 
     { 
      int len = strlen(ptr); 
      Console.WriteLine(len); 
     } 
    } 
    [DllImport("msvcrt.dll")] 
    private unsafe static extern int strlen(byte* pByte);  
} 

적 관리 코드에서 나 strlen를 호출 할 이유 그것은 내게 불분명하지만, 물론 당신이있을 수 있습니다 너의 이유. 당신이 다른 관리 구현을해야하는 경우, 여기 당신이 사용할 수있는 하나의 라이너입니다

멀티 바이트 (유니 코드) 문자를 처리하지 않습니다 물론
private static int managed_strlen(byte[] bytes) 
{ 
    return bytes.TakeWhile(b => b != 0).Count(); 
} 

,하지만 난 나 strlen 중 하나를 수행합니다 생각하지 않습니다. 그냥 재미를 위해

+0

안녕하세요, Driis, 답장을 보내 주셔서 감사합니다. 안전하지 않은 코드에서 사용하고 있습니다. 언급하지 않았습니다. @ CallTaylor : CallingConvention 속성을 잊어 버렸습니다. – SDReyes

1

:

public static unsafe int strlen(void* buffer) 
{ 
    byte* end = (byte*)buffer; 
    while (*end++ != 0); 
    return(int)end - (int)buffer - 1; 
}