2010-04-07 46 views
8

Tôi có một dll đi kèm trong cả phiên bản 32bit và 64bit. .NET WinForm của tôi được cấu hình cho "CPU bất kỳ" và sếp của tôi sẽ không cho phép chúng tôi có cài đặt riêng cho các phiên bản hệ điều hành khác nhau. Vì vậy, tôi tự hỏi: nếu tôi gói cả hai dlls trong cài đặt, sau đó là có một cách để có WinForm xác định nếu 64bit/32bit của nó và tải dll thích hợp.Nhập dll bên ngoài dựa trên hệ điều hành 64bit hoặc 32bit

Tôi đã tìm thấy this article để xác định phiên bản. Nhưng tôi không chắc chắn làm thế nào để tiêm cách thích hợp để xác định thuộc tính DLLImport trên các phương pháp tôi muốn sử dụng. Bất kỳ ý tưởng?

Trả lời

6

Bạn có thể nhập cả hai và đưa ra quyết định về người nào cần gọi qua .NET thay thế?

Ví dụ:

[DllImport("32bit.dll", CharSet = CharSet.Unicode, EntryPoint="CallMe")] 
public static extern int CallMe32 (IntPtr hWnd, String text, String caption, uint type); 

[DllImport("64bit.dll", CharSet = CharSet.Unicode, EntryPoint="CallMe")] 
public static extern int CallMe64 (IntPtr hWnd, String text, String caption, uint type); 
+1

Đó thực sự là giải pháp "đi tới" của tôi nếu tôi không thể tìm ra cách làm sạch hơn. –

3

Bạn nên thực hiện hai phương pháp extern tin khác nhau, và thực hiện một phương pháp nội bộ để kiểm tra IntPtr.Size và gọi đúng phiên bản.

3

Giải pháp của tôi là tạo một lớp trừu tượng duy nhất, với phiên bản cụ thể tải và kết thúc DLL 32 bit của tôi và triển khai riêng biệt tải và kết thúc tốt hơn DLL 64 bit. Một phương thức nhà máy đơn lẻ trong lớp cơ sở có thể được sử dụng để thực hiện triển khai thích hợp dựa trên IntPtr.Size.

Điều tốt đẹp về cách tiếp cận này là phần còn lại của mã của bạn được phân lập hoàn toàn khỏi nền tảng - nó chỉ xây dựng một đối tượng bằng cách sử dụng phương thức nhà máy lớp cơ sở của bạn và làm việc với nó. Nó cũng rất dễ dàng để gọi vào nhiều phương thức trong các DLL trong câu hỏi, một cách thống nhất, và tất cả các mã "bản địa" của bạn có thể dễ dàng được đẩy vào một thực hiện riêng tư.

14

Bạn có thể tận dụng chức năng API SetDllDirectory, nó làm thay đổi đường dẫn tìm kiếm cho các hội đồng không được quản lý. Lưu trữ các tệp DLL 32 bit của bạn trong thư mục con x86 của thư mục cài đặt ứng dụng, các DLL 64 bit trong thư mục con x64.

Run mã này lúc khởi động ứng dụng trước khi bạn bất kỳ P/Invoke:

using System.IO; 
using System.Reflection; 
using System.Runtime.InteropServices; 
... 

    public static void SetUnmanagedDllDirectory() { 
     string path = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location); 
     path = Path.Combine(path, IntPtr.Size == 8 ? "x64 " : "x86"); 
     if (!SetDllDirectory(path)) throw new System.ComponentModel.Win32Exception(); 
    } 

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    private static extern bool SetDllDirectory(string path); 
+0

Đó là một giải pháp tuyệt vời. – Kieron

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