2012-06-28 36 views
10

Tôi đang làm việc trên một dịch vụ web tương tác với một DLL gốc và tôi sử dụng LoadLibrary/GetModuleHandle/FreeLIbrary và GetProcAddress để tự động tải/dỡ bỏ DLL vì nó không phải là rất ổn định.Có LoadLibrary, FreeLibrary và GetModuleHandle Win32 chức năng chủ đề an toàn không?

public class NativeMethods 
{ 
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    public static extern IntPtr LoadLibrary(string libname); 

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    public static extern IntPtr GetModuleHandle(string libname); 

    [DllImport("kernel32.dll", CharSet = CharSet.Auto)] 
    public static extern bool FreeLibrary(IntPtr hModule); 

    [DllImport("kernel32.dll", CharSet = CharSet.Ansi)] 
    public static extern IntPtr GetProcAddress(IntPtr hModule, string lpProcName); 
} 

tôi đã nhận thấy rằng quá trình w3wp.exe occationally treo theo tải trọng nặng và khi tôi cố gắng để gỡ lỗi nó trình gỡ lỗi thường dừng lại ở chức năng gọi NativeMethods.GetModuleHandle() của tôi.

Tôi không thể tìm thấy bất kỳ bằng chứng nào cho thấy GetModuleHandle không an toàn chỉ vì vậy tôi tự hỏi có ai có bất kỳ trải nghiệm tương tự nào khi tương tác với hàm kernel32.dll này từ các ứng dụng .NET đa luồng không?

Oscar

+1

LoadLibrary và FreeLibrary nên là chủ đề an toàn liên quan đến danh sách tải DLL, và trong lý thuyết nên GetModuleHandle, tuy nhiên tôi có thể sử dụng một cặp LoadLibrary/FreeLibrary thay vì sử dụng phương pháp đó như sau đó bạn đảm bảo bạn có một tham chiếu đến thư viện và nó không thể biến mất khỏi trí nhớ trong khi bạn đang sử dụng nó. – tyranid

Trả lời

6

Theo Igor Tandetnik (Microsoft MVP).

Ngoài chức năng GDI không an toàn chỉ. Hầu hết mọi thứ cần có một số HWND và/hoặc số HDC phải được gọi trên cùng một chuỗi nơi mà HWND hoặc HDC được tạo (SendMessage, PostMessage và tương tự là các ngoại lệ đáng chú ý). HBITMAP s, HICON s và như vậy có thể được chuyển giữa các luồng, nhưng nên được thao tác bởi một luồng tại một thời điểm.

Hầu hết các chức năng khác - những chức năng không xử lý với GDI hoặc quản lý cửa sổ - thực sự là an toàn chỉ.

Điều này nên bao gồm LoadLibrary, GetModuleHandle, FreeLibraryGetProcAddress.

Tuy nhiên, hãy nhớ rằng FreeLibrary không nên được gọi từ DllMain.

Tôi cũng có thể thêm rằng tôi đã sử dụng các chức năng này trong môi trường đa luồng trong một thời gian khá dài mà không gặp vấn đề gì.

+0

https://mvp.support.microsoft.com/profile=b3eb0170-44f2-4819-b048-8616caa4d107/http://social.msdn.microsoft.com/profile/igor%20tandetnik/?ws=usercard-mini (Nếu đây là người đúng) không hoạt động đối với MS? nhưng anh ấy là một MVP ... – Anders

+0

Câu trả lời đã thay đổi để phản ánh nhận xét trước –

+0

Hãy lưu ý rằng 'LoadLibrary' tăng số lượng tham chiếu của mô-đun, trong khi' GetModuleHandle' KHÔNG tăng số lượng tham chiếu của mô-đun. Đáng buồn thay, điều này làm cho 'GetModuleHandle' không phải là chủ đề an toàn. Xem phần ** Ghi chú ** để biết thêm chi tiết: https://msdn.microsoft.com/en-us/library/windows/desktop/ms683199(v=vs.85).aspx Lưu ý quan trọng: ** Ví dụ: giả sử rằng một luồng truy lục một trình xử lý mô-đun, nhưng trước khi nó sử dụng tay cầm, luồng thứ hai sẽ giải phóng mô-đun. .... ** –

Các vấn đề liên quan