2010-07-31 57 views
6

Trong các hội đồng .Net của tôi, tôi sẽ phải sử dụng một số tập tin bản địa (C++). Thông thường chúng ta cần copy các file C++ vào thư mục bin và sử dụng PInvoke để gọi nó. Để tiết kiệm chi phí phân phối, tôi muốn nhúng C++ vào dll .Net trực tiếp của tôi, để số lượng các assembly được phân phối sẽ ít hơn.Nhúng Thư viện C++ vào .Net Thư viện

Bất kỳ ý tưởng nào về cách thực hiện việc này?

+0

có thể trùng lặp của [Nhúng dll không được quản lý vào một C# dll được quản lý] (http://stackoverflow.com/questions/666799/embedding-unmanaged-dll-into-a-managed-c-dll) –

+1

tôi không đồng ý với việc đóng trùng lặp - câu trả lời cho câu hỏi khác mô tả phần "nhúng dưới dạng tài nguyên" chứ không phải cách tải đúng thư viện khi chúng đã được trích xuất vào ổ đĩa –

Trả lời

3

Bạn sẽ nhúng DLL gốc của mình làm tài nguyên.

Sau đó, khi chạy, bạn sẽ phải giải nén các tệp DLL gốc đó vào một thư mục tạm thời; bạn không nhất thiết phải ghi quyền truy cập vào thư mục ứng dụng khi ứng dụng của bạn khởi chạy: hãy nghĩ về windows vista hoặc windows 7 và UAC. Kết quả là bạn sẽ sử dụng loại mã này để tải chúng từ một đường dẫn cụ thể:

public static class NativeMethods { 

    [DllImport("kernel32")] 
    private unsafe static extern void* LoadLibrary(string dllname); 

    [DllImport("kernel32")] 
    private unsafe static extern void FreeLibrary(void* handle); 

    private sealed unsafe class LibraryUnloader 
    { 
    internal LibraryUnloader(void* handle) 
    { 
     this.handle = handle; 
    } 

    ~LibraryUnloader() 
    { 
     if (handle != null) 
     FreeLibrary(handle); 
    } 

    private void* handle; 

    } // LibraryUnloader 


    private static readonly LibraryUnloader unloader; 

    static NativeMethods() 
    { 
    string path; 

    // set the path according to some logic 
    path = "somewhere/in/a/temporary/directory/Foo.dll";  

    unsafe 
    { 
     void* handle = LoadLibrary(path); 

     if (handle == null) 
     throw new DllNotFoundException("unable to find the native Foo library: " + path); 

     unloader = new LibraryUnloader(handle); 
    } 
    } 
} 
+0

Nếu bạn trích xuất chúng, tại sao bạn cần phải đi toàn bộ tuyến đường LoadLibrary ? – leppie

+0

để tải chúng từ một đường dẫn cụ thể, không nhất thiết phải từ cùng một đường dẫn như ứng dụng thực thi –

0

Bạn có thể nhúng dll của mình làm tài nguyên.

Khi chạy, hãy giải nén chúng vào cùng thư mục với exe của bạn và sử dụng phương thức P/Gọi để gọi bên trong chúng.

+0

bạn không nhất thiết phải có quyền ghi vào thư mục ứng dụng khi ứng dụng của bạn khởi chạy: nghĩ windows vista hoặc windows 7 và UAC –