Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
(연관된 글이 2개 있습니다.)

C# - Marshal.GetIUnknownForObject/GetIDispatchForObject 사용 시 메모리 누수(Memory Leak) 발생

지난 글에서,

C# - GetNativeVariantForObject 사용 시 메모리 누수(Memory Leak) 발생 및 해결 방법
; https://www.sysnet.pe.kr/2/0/12157

발생한 메모리 누수와 유사한 현상이 GetIUnknownForObject과 GetIDispatchForObject에서도 나타납니다.

static unsafe void Main(string[] args)
{
    int i = 0;
    while (true)
    {
        TestHandleWithoutLeak();

        i++;

        if (i > 1000)
        {
            GC.Collect();
            GC.Collect();
            i = 0;
        }
    }
}

private unsafe static void TestHandleWithLeak()
{
    object obj = new object();

    {
        IntPtr pointer = Marshal.GetIUnknownForObject(obj);
        while (Marshal.Release(pointer) > 0) { };
    }
}

위의 프로그램을 실행하면 메모리 누수가 발생하는데 "!gchandles"의 "Ref Count Handles"가 늘어나는 현상도 동일합니다. 실제로 검색해 보니 다음과 같은 글이 있군요. ^^;

IC65849: MEMORY LEAK FROM .NET PROVIDER METHOD IBM.DATA.INFORMIX.DBCWRAPPER.ENLISTASREQUIRED
; https://www-01.ibm.com/support/docview.wss?uid=swg1IC65849

The memory leak is caused by the IntPtr returned from Marshal.GetIUnknownForObject but never released with Marshal.Release().


문제는, 해당 메서드들이 반환하는 값은 이미 IUnknown/IDispatch 인터페이스의 포인터이기 때문에 VariantClear와 같은 해결책을 적용할 수 없다는 점입니다. 딱히 그 외에는 해볼 만한 것이 없어 저도 매끄러운 방법을 찾아내지는 못했습니다. (혹시 아시는 분은 덧글 부탁드립니다.)

단지, 우회하는 방법은 있는데 어차피 IUnknown이나 IDispatch는 Variant로부터도 구할 수 있으므로 다음과 같은 식으로 GetNativeVariantForObject를 감싸는 helper 클래스를 만들어,

public sealed class ObjectInterface : IDisposable
{
    [DllImport("oleaut32.dll", PreserveSig = true)]
    private static extern int VariantClear(IntPtr pObject);

    unsafe static int _varSize = sizeof(Variant);

    IntPtr _pAlloc;
    unsafe Variant* _pVariant;

    public void Dispose()
    {
        if (_pAlloc != IntPtr.Zero)
        {
            VariantClear(_pAlloc);
            Marshal.FreeHGlobal(_pAlloc);
        }
    }

    public unsafe ObjectInterface(object obj)
    {
        _pAlloc = Marshal.AllocHGlobal(_varSize);
        Marshal.GetNativeVariantForObject(obj, _pAlloc);

        _pVariant = (Variant *)_pAlloc.ToPointer();
    }

    public unsafe IntPtr Unknown
    {
        get 
        {
            if (_pVariant == null)
            {
                return IntPtr.Zero;
            }

            if (_pVariant->vt != (ushort)VarEnum.VT_UNKNOWN && _pVariant->vt != (ushort)VarEnum.VT_DISPATCH)
            {
                return IntPtr.Zero;
            }

            return _pVariant->data01;
        }
    }

    public unsafe IntPtr Dispatch
    {
        get
        {
            if (_pVariant == null)
            {
                return IntPtr.Zero;
            }

            if (_pVariant->vt != (ushort)VarEnum.VT_DISPATCH)
            {
                return IntPtr.Zero;
            }

            return _pVariant->data01;
        }
    }

    [StructLayout(LayoutKind.Sequential)]
    struct Variant
    {
        public ushort vt;
        public ushort wReserved1;
        public ushort wReserved2;
        public ushort wReserved3;
        public IntPtr data01;
        public IntPtr data02;
    }
}

이렇게 사용할 수 있습니다.

private unsafe static void TestHandleWithoutLeak()
{
    object obj = new object();

    {
        // IntPtr pointer = Marshal.GetIUnknownForObject(obj); // memory-leak
        // IntPtr pointer = Marshal.GetIDispatchForObject(obj); // memory-leak

        using (ObjectInterface oi = new ObjectInterface(obj)) // NO memory-leak
        {
            IntPtr ptr = oi.Unknown;
            // ptr = oi.Dispatch;
        }
    }
}

(첨부 파일은 이 글의 예제 코드를 포함합니다.)




참고로, 아래의 코드는 Marshal.GetIUnknownForObject 함수이고,

clr!MarshalNative::GetIUnknownForObjectNative:
00007ffc`dc56bb60 488bc4          mov     rax,rsp
00007ffc`dc56bb63 885010          mov     byte ptr [rax+10h],dl
00007ffc`dc56bb66 4154            push    r12
00007ffc`dc56bb68 4156            push    r14
00007ffc`dc56bb6a 4157            push    r15
00007ffc`dc56bb6c 4881ec60010000  sub     rsp,160h
00007ffc`dc56bb73 48c7442458feffffff mov   qword ptr [rsp+58h],0FFFFFFFFFFFFFFFEh
00007ffc`dc56bb7c 48897008        mov     qword ptr [rax+8],rsi
00007ffc`dc56bb80 48897818        mov     qword ptr [rax+18h],rdi
00007ffc`dc56bb84 408af2          mov     sil,dl
00007ffc`dc56bb87 4c8d35d2ffffff  lea     r14,[clr!MarshalNative::GetIUnknownForObjectNative (00007ffc`dc56bb60)]
00007ffc`dc56bb8e 4c89742438      mov     qword ptr [rsp+38h],r14
00007ffc`dc56bb93 488364243000    and     qword ptr [rsp+30h],0
00007ffc`dc56bb99 48894c2428      mov     qword ptr [rsp+28h],rcx
00007ffc`dc56bb9e 83a4249000000000 and     dword ptr [rsp+90h],0
00007ffc`dc56bba6 4c89b424a0000000 mov     qword ptr [rsp+0A0h],r14
00007ffc`dc56bbae 488d0543646e00  lea     rax,[clr!HelperMethodFrame_1OBJ::`vftable' (00007ffc`dcc51ff8)]
00007ffc`dc56bbb5 4889442478      mov     qword ptr [rsp+78h],rax
00007ffc`dc56bbba 488d442428      lea     rax,[rsp+28h]
00007ffc`dc56bbbf 4889842450010000 mov     qword ptr [rsp+150h],rax

00007ffc`dc56bbc7 488d8c24a8000000 lea     rcx,[rsp+0A8h]
00007ffc`dc56bbcf e81c93f1ff      call    clr!LazyMachStateCaptureState (00007ffc`dc484ef0)
00007ffc`dc56bbd4 488d4c2478      lea     rcx,[rsp+78h]
00007ffc`dc56bbd9 e85293f1ff      call    clr!HelperMethodFrame::Push (00007ffc`dc484f30)
00007ffc`dc56bbde 488b8c2498000000 mov     rcx,qword ptr [rsp+98h]
00007ffc`dc56bbe6 4533ff          xor     r15d,r15d
00007ffc`dc56bbe9 4532e4          xor     r12b,r12b
00007ffc`dc56bbec 8a0546749200    mov     al,byte ptr [clr!g_StackProbingEnabled (00007ffc`dce93038)]
00007ffc`dc56bbf2 84c0            test    al,al
00007ffc`dc56bbf4 741a            je      clr!MarshalNative::GetIUnknownForObjectNative+0xb0 (00007ffc`dc56bc10)
00007ffc`dc56bbf6 e8d1652400      call    clr!DefaultRetailStackProbeWorker (00007ffc`dc7b21cc)
00007ffc`dc56bbfb 8a0537749200    mov     al,byte ptr [clr!g_StackProbingEnabled (00007ffc`dce93038)]
00007ffc`dc56bc01 84c0            test    al,al
00007ffc`dc56bc03 740b            je      clr!MarshalNative::GetIUnknownForObjectNative+0xb0 (00007ffc`dc56bc10)
00007ffc`dc56bc05 488d4c2448      lea     rcx,[rsp+48h]
00007ffc`dc56bc0a e885762400      call    clr!SOIntolerantTransitionHandler::CtorImpl (00007ffc`dc7b3294)
00007ffc`dc56bc0f 90              nop

00007ffc`dc56bc10 48837c242800    cmp     qword ptr [rsp+28h],0
00007ffc`dc56bc16 750c            jne     clr!MarshalNative::GetIUnknownForObjectNative+0xc4 (00007ffc`dc56bc24)
00007ffc`dc56bc18 488d0db9767700  lea     rcx,[clr!`string' (00007ffc`dcce32d8)]
00007ffc`dc56bc1f e8c8453a00      call    clr!RealCOMPlusThrowArgumentNull (00007ffc`dc9101ec)
00007ffc`dc56bc24 b901000000      mov     ecx,1
00007ffc`dc56bc29 e82e1ff2ff      call    clr!EnsureComStarted (00007ffc`dc48db5c)
00007ffc`dc56bc2e 4084f6          test    sil,sil
00007ffc`dc56bc31 7417            je      clr!MarshalNative::GetIUnknownForObjectNative+0xea (00007ffc`dc56bc4a)
00007ffc`dc56bc33 488d4c2428      lea     rcx,[rsp+28h]
00007ffc`dc56bc38 e873104f00      call    clr!MarshalNative::IsObjectInContext (00007ffc`dca5ccb0)
00007ffc`dc56bc3d 85c0            test    eax,eax
00007ffc`dc56bc3f 7509            jne     clr!MarshalNative::GetIUnknownForObjectNative+0xea (00007ffc`dc56bc4a)
00007ffc`dc56bc41 33ff            xor     edi,edi
00007ffc`dc56bc43 48897c2430      mov     qword ptr [rsp+30h],rdi
00007ffc`dc56bc48 eb19            jmp     clr!MarshalNative::GetIUnknownForObjectNative+0x103 (00007ffc`dc56bc63)
00007ffc`dc56bc4a 4533c0          xor     r8d,r8d
00007ffc`dc56bc4d 418d5005        lea     edx,[r8+5]
00007ffc`dc56bc51 488d4c2428      lea     rcx,[rsp+28h]
00007ffc`dc56bc56 e855fdffff      call    clr!GetComIPFromObjectRef (00007ffc`dc56b9b0)
00007ffc`dc56bc5b 488bf8          mov     rdi,rax
00007ffc`dc56bc5e 4889442430      mov     qword ptr [rsp+30h],rax
00007ffc`dc56bc63 c644244800      mov     byte ptr [rsp+48h],0
00007ffc`dc56bc68 803dc973920000  cmp     byte ptr [clr!g_StackProbingEnabled (00007ffc`dce93038)],0
00007ffc`dc56bc6f 740b            je      clr!MarshalNative::GetIUnknownForObjectNative+0x11c (00007ffc`dc56bc7c)
00007ffc`dc56bc71 488d4c2448      lea     rcx,[rsp+48h]

00007ffc`dc56bc76 e851762400      call    clr!SOIntolerantTransitionHandler::DtorImpl (00007ffc`dc7b32cc)
00007ffc`dc56bc7b 90              nop
00007ffc`dc56bc7c eb1c            jmp     clr!MarshalNative::GetIUnknownForObjectNative+0x13a (00007ffc`dc56bc9a)
00007ffc`dc56bc7e 408ab42488010000 mov     sil,byte ptr [rsp+188h]
00007ffc`dc56bc86 4c8b742438      mov     r14,qword ptr [rsp+38h]
00007ffc`dc56bc8b 488b7c2430      mov     rdi,qword ptr [rsp+30h]
00007ffc`dc56bc90 4c8b7c2440      mov     r15,qword ptr [rsp+40h]
00007ffc`dc56bc95 448a642420      mov     r12b,byte ptr [rsp+20h]
00007ffc`dc56bc9a 4584e4          test    r12b,r12b
00007ffc`dc56bc9d 7409            je      clr!MarshalNative::GetIUnknownForObjectNative+0x148 (00007ffc`dc56bca8)
00007ffc`dc56bc9f 498bd7          mov     rdx,r15
00007ffc`dc56bca2 e891211000      call    clr!UnwindAndContinueRethrowHelperAfterCatch (00007ffc`dc66de38)
00007ffc`dc56bca7 cc              int     3
00007ffc`dc56bca8 488d4c2478      lea     rcx,[rsp+78h]
00007ffc`dc56bcad e8be92f1ff      call    clr!HelperMethodFrame::Pop (00007ffc`dc484f70)
00007ffc`dc56bcb2 488d8c24a8000000 lea     rcx,[rsp+0A8h]
00007ffc`dc56bcba e81187f1ff      call    clr!HelperMethodFrameRestoreState (00007ffc`dc4843d0)
00007ffc`dc56bcbf 85c0            test    eax,eax
00007ffc`dc56bcc1 0f85d7feffff    jne     clr!MarshalNative::GetIUnknownForObjectNative+0x3e (00007ffc`dc56bb9e)
00007ffc`dc56bcc7 488bc7          mov     rax,rdi
00007ffc`dc56bcca 4c8d9c2460010000 lea     r11,[rsp+160h]
00007ffc`dc56bcd2 498b7320        mov     rsi,qword ptr [r11+20h]
00007ffc`dc56bcd6 498b7b30        mov     rdi,qword ptr [r11+30h]

00007ffc`dc56bcda 498be3          mov     rsp,r11
00007ffc`dc56bcdd 415f            pop     r15
00007ffc`dc56bcdf 415e            pop     r14
00007ffc`dc56bce1 415c            pop     r12
00007ffc`dc56bce3 c3              ret

아래는 Marshal.GetNativeVariantForObject 함수입니다. 내심 GetIUnknownForObject가 내부적으로 GetNativeVariantForObject 함수를 호출한다면 어떤 식으로든 해결책을 욱여넣어보려고 했는데 ^^; 각각 구현이 되어 있어 희망이 사라졌습니다.

clr!MarshalNative::GetNativeVariantForObject:
00007ffc`dca5a8f0 488bc4          mov     rax,rsp
00007ffc`dca5a8f3 48895010        mov     qword ptr [rax+10h],rdx
00007ffc`dca5a8f7 57              push    rdi
00007ffc`dca5a8f8 4156            push    r14
00007ffc`dca5a8fa 4157            push    r15
00007ffc`dca5a8fc 4881ec60010000  sub     rsp,160h
00007ffc`dca5a903 48c7442458feffffff mov   qword ptr [rsp+58h],0FFFFFFFFFFFFFFFEh
00007ffc`dca5a90c 48895808        mov     qword ptr [rax+8],rbx
00007ffc`dca5a910 48897018        mov     qword ptr [rax+18h],rsi
00007ffc`dca5a914 488bfa          mov     rdi,rdx
00007ffc`dca5a917 488d35d2ffffff  lea     rsi,[clr!MarshalNative::GetNativeVariantForObject (00007ffc`dca5a8f0)]
00007ffc`dca5a91e 4889742438      mov     qword ptr [rsp+38h],rsi
00007ffc`dca5a923 48894c2428      mov     qword ptr [rsp+28h],rcx
00007ffc`dca5a928 33db            xor     ebx,ebx
00007ffc`dca5a92a 899c2490000000  mov     dword ptr [rsp+90h],ebx
00007ffc`dca5a931 4889b424a0000000 mov     qword ptr [rsp+0A0h],rsi
00007ffc`dca5a939 488d05b8761f00  lea     rax,[clr!HelperMethodFrame_1OBJ::`vftable' (00007ffc`dcc51ff8)]
00007ffc`dca5a940 4889442478      mov     qword ptr [rsp+78h],rax
00007ffc`dca5a945 488d442428      lea     rax,[rsp+28h]
00007ffc`dca5a94a 4889842450010000 mov     qword ptr [rsp+150h],rax

00007ffc`dca5a952 488d8c24a8000000 lea     rcx,[rsp+0A8h]
00007ffc`dca5a95a e891a5a2ff      call    clr!LazyMachStateCaptureState (00007ffc`dc484ef0)
00007ffc`dca5a95f 488d4c2478      lea     rcx,[rsp+78h]
00007ffc`dca5a964 e8c7a5a2ff      call    clr!HelperMethodFrame::Push (00007ffc`dc484f30)
00007ffc`dca5a969 488b8c2498000000 mov     rcx,qword ptr [rsp+98h]
00007ffc`dca5a971 4c8bf3          mov     r14,rbx
00007ffc`dca5a974 448afb          mov     r15b,bl
00007ffc`dca5a977 8a05bb864300    mov     al,byte ptr [clr!g_StackProbingEnabled (00007ffc`dce93038)]
00007ffc`dca5a97d 84c0            test    al,al
00007ffc`dca5a97f 741a            je      clr!MarshalNative::GetNativeVariantForObject+0xab (00007ffc`dca5a99b)
00007ffc`dca5a981 e84678d5ff      call    clr!DefaultRetailStackProbeWorker (00007ffc`dc7b21cc)
00007ffc`dca5a986 8a05ac864300    mov     al,byte ptr [clr!g_StackProbingEnabled (00007ffc`dce93038)]
00007ffc`dca5a98c 84c0            test    al,al
00007ffc`dca5a98e 740b            je      clr!MarshalNative::GetNativeVariantForObject+0xab (00007ffc`dca5a99b)
00007ffc`dca5a990 488d4c2448      lea     rcx,[rsp+48h]
00007ffc`dca5a995 e8fa88d5ff      call    clr!SOIntolerantTransitionHandler::CtorImpl (00007ffc`dc7b3294)
00007ffc`dca5a99a 90              nop
00007ffc`dca5a99b 4885ff          test    rdi,rdi
00007ffc`dca5a99e 750c            jne     clr!MarshalNative::GetNativeVariantForObject+0xbc (00007ffc`dca5a9ac)
00007ffc`dca5a9a0 488d0da9892800  lea     rcx,[clr!`string' (00007ffc`dcce3350)]

00007ffc`dca5a9a7 e84058ebff      call    clr!RealCOMPlusThrowArgumentNull (00007ffc`dc9101ec)
00007ffc`dca5a9ac 488b442428      mov     rax,qword ptr [rsp+28h]
00007ffc`dca5a9b1 4885c0          test    rax,rax
00007ffc`dca5a9b4 741f            je      clr!MarshalNative::GetNativeVariantForObject+0xe5 (00007ffc`dca5a9d5)
00007ffc`dca5a9b6 488b00          mov     rax,qword ptr [rax]
00007ffc`dca5a9b9 3918            cmp     dword ptr [rax],ebx
00007ffc`dca5a9bb 7c18            jl      clr!MarshalNative::GetNativeVariantForObject+0xe5 (00007ffc`dca5a9d5)
00007ffc`dca5a9bd f60030          test    byte ptr [rax],30h
00007ffc`dca5a9c0 7413            je      clr!MarshalNative::GetNativeVariantForObject+0xe5 (00007ffc`dca5a9d5)
00007ffc`dca5a9c2 488d1577862800  lea     rdx,[clr!`string' (00007ffc`dcce3040)]
00007ffc`dca5a9c9 488d0d883d2800  lea     rcx,[clr!`string' (00007ffc`dccde758)]
00007ffc`dca5a9d0 e8ff55ebff      call    clr!RealCOMPlusThrowArgumentException (00007ffc`dc90ffd4)
00007ffc`dca5a9d5 66891f          mov     word ptr [rdi],bx
00007ffc`dca5a9d8 488d442428      lea     rax,[rsp+28h]
00007ffc`dca5a9dd 4889442430      mov     qword ptr [rsp+30h],rax
00007ffc`dca5a9e2 488bd7          mov     rdx,rdi
00007ffc`dca5a9e5 488d4c2430      lea     rcx,[rsp+30h]
00007ffc`dca5a9ea e82173b1ff      call    clr!OleVariant::MarshalOleVariantForObject (00007ffc`dc571d10)
00007ffc`dca5a9ef 885c2448        mov     byte ptr [rsp+48h],bl
00007ffc`dca5a9f3 381d3f864300    cmp     byte ptr [clr!g_StackProbingEnabled (00007ffc`dce93038)],bl

00007ffc`dca5a9f9 740b            je      clr!MarshalNative::GetNativeVariantForObject+0x116 (00007ffc`dca5aa06)
00007ffc`dca5a9fb 488d4c2448      lea     rcx,[rsp+48h]
00007ffc`dca5aa00 e8c788d5ff      call    clr!SOIntolerantTransitionHandler::DtorImpl (00007ffc`dc7b32cc)
00007ffc`dca5aa05 90              nop
00007ffc`dca5aa06 eb19            jmp     clr!MarshalNative::GetNativeVariantForObject+0x131 (00007ffc`dca5aa21)
00007ffc`dca5aa08 33db            xor     ebx,ebx
00007ffc`dca5aa0a 488bbc2488010000 mov     rdi,qword ptr [rsp+188h]
00007ffc`dca5aa12 488b742438      mov     rsi,qword ptr [rsp+38h]
00007ffc`dca5aa17 4c8b742440      mov     r14,qword ptr [rsp+40h]
00007ffc`dca5aa1c 448a7c2420      mov     r15b,byte ptr [rsp+20h]
00007ffc`dca5aa21 4584ff          test    r15b,r15b
00007ffc`dca5aa24 7409            je      clr!MarshalNative::GetNativeVariantForObject+0x13f (00007ffc`dca5aa2f)
00007ffc`dca5aa26 498bd6          mov     rdx,r14
00007ffc`dca5aa29 e80a34c1ff      call    clr!UnwindAndContinueRethrowHelperAfterCatch (00007ffc`dc66de38)
00007ffc`dca5aa2e cc              int     3
00007ffc`dca5aa2f 488d4c2478      lea     rcx,[rsp+78h]
00007ffc`dca5aa34 e837a5a2ff      call    clr!HelperMethodFrame::Pop (00007ffc`dc484f70)
00007ffc`dca5aa39 488d8c24a8000000 lea     rcx,[rsp+0A8h]
00007ffc`dca5aa41 e88a99a2ff      call    clr!HelperMethodFrameRestoreState (00007ffc`dc4843d0)
00007ffc`dca5aa46 85c0            test    eax,eax

00007ffc`dca5aa48 0f85dcfeffff    jne     clr!MarshalNative::GetNativeVariantForObject+0x3a (00007ffc`dca5a92a)
00007ffc`dca5aa4e 4c8d9c2460010000 lea     r11,[rsp+160h]
00007ffc`dca5aa56 498b5b20        mov     rbx,qword ptr [r11+20h]
00007ffc`dca5aa5a 498b7330        mov     rsi,qword ptr [r11+30h]
00007ffc`dca5aa5e 498be3          mov     rsp,r11
00007ffc`dca5aa61 415f            pop     r15
00007ffc`dca5aa63 415e            pop     r14
00007ffc`dca5aa65 5f              pop     rdi
00007ffc`dca5aa66 c3              ret




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 2/26/2020]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 121  122  123  124  125  126  127  128  129  130  131  [132]  133  134  135  ...
NoWriterDateCnt.TitleFile(s)
1756정성태9/23/201427486기타: 48. NVidia 제품의 과다한 디스크 사용 [2]
1755정성태9/22/201434280오류 유형: 241. Unity Web Player를 설치해도 여전히 설치하라는 화면이 나오는 경우 [4]
1754정성태9/22/201424642VC++: 80. 내 컴퓨터에서 C++ AMP 코드가 실행이 될까요? [1]
1753정성태9/22/201420611오류 유형: 240. Lync로 세미나 참여 시 소리만 들리지 않는 경우 [1]
1752정성태9/21/201441071Windows: 100. 윈도우 8 - RDP 연결을 이용해 VNC처럼 사용자 로그온 화면을 공유하는 방법 [5]
1751정성태9/20/201438944.NET Framework: 464. 프로세스 간 통신 시 소켓 필요 없이 간단하게 Pipe를 열어 통신하는 방법 [1]파일 다운로드1
1750정성태9/20/201423832.NET Framework: 463. PInvoke 호출을 이용한 비동기 파일 작업파일 다운로드1
1749정성태9/20/201423732.NET Framework: 462. 커널 객체를 위한 null DACL 생성 방법파일 다운로드1
1748정성태9/19/201425385개발 환경 구성: 238. [Synergy] 여러 컴퓨터에서 키보드, 마우스 공유
1747정성태9/19/201428474오류 유형: 239. psexec 실행 오류 - The system cannot find the file specified.
1746정성태9/18/201426106.NET Framework: 461. .NET EXE 파일을 닷넷 프레임워크 버전에 상관없이 실행할 수 있을까요? - 두 번째 이야기 [6]파일 다운로드1
1745정성태9/17/201423035개발 환경 구성: 237. 리눅스 Integration Services 버전 업그레이드 하는 방법 [1]
1744정성태9/17/201431062.NET Framework: 460. GetTickCount / GetTickCount64와 0x7FFE0000 주솟값 [4]파일 다운로드1
1743정성태9/16/201420985오류 유형: 238. 설치 오류 - Failed to get size of pseudo bundle
1742정성태8/27/201426972개발 환경 구성: 236. Hyper-V에 설치한 리눅스 VM의 VHD 크기 늘리는 방법 [2]
1741정성태8/26/201421334.NET Framework: 459. GetModuleHandleEx로 알아보는 .NET 메서드의 DLL 모듈 관계파일 다운로드1
1740정성태8/25/201432508.NET Framework: 458. 닷넷 GC가 순환 참조를 해제할 수 있을까요? [2]파일 다운로드1
1739정성태8/24/201426538.NET Framework: 457. 교착상태(Dead-lock) 해결 방법 - Lock Leveling [2]파일 다운로드1
1738정성태8/23/201422047.NET Framework: 456. C# - CAS를 이용한 Lock 래퍼 클래스파일 다운로드1
1737정성태8/20/201419765VS.NET IDE: 93. Visual Studio 2013 동기화 문제
1736정성태8/19/201425576VC++: 79. [부연] CAS Lock 알고리즘은 과연 빠른가? [2]파일 다운로드1
1735정성태8/19/201418205.NET Framework: 455. 닷넷 사용자 정의 예외 클래스의 최소 구현 코드 - 두 번째 이야기
1734정성태8/13/201419864오류 유형: 237. Windows Media Player cannot access the file. The file might be in use, you might not have access to the computer where the file is stored, or your proxy settings might not be correct.
1733정성태8/13/201426362.NET Framework: 454. EmptyWorkingSet Win32 API를 사용하는 C# 예제파일 다운로드1
1732정성태8/13/201434477Windows: 99. INetCache 폴더가 다르게 보이는 이유
1731정성태8/11/201427081개발 환경 구성: 235. 점(.)으로 시작하는 파일명을 탐색기에서 만드는 방법
... 121  122  123  124  125  126  127  128  129  130  131  [132]  133  134  135  ...