2012-07-24 25 views
5

thể trùng lặp:
Loading x86 or x64 assemblyNET liên kết thư viện cụ nền tảng

Tôi đang cố gắng để biên dịch Bất kỳ dự án CPU NET, nhưng tôi phải liên kết thư viện SQLite trong đó có các phiên bản khác nhau cho nền tảng x86 và x64. Chỉ thay đổi các phiên bản DLL thành x64 không giúp ích, ứng dụng không khởi động được, tôi cần biên dịch lại mã bằng tham chiếu x64. Khi tôi thêm cả tham chiếu x86 và x64, nó không thể biên dịch được, vì xung đột. Tôi không thể biên dịch ứng dụng bằng x86, vì một trong các thư viện COM hệ thống tôi đang sử dụng không hoạt động trong WOW64.

All 32-bit VSS applications (requesters, providers, and writers) must run as native 32-bit or 64-bit applications. Running them under WOW64 is not supported

http://social.msdn.microsoft.com/Forums/en-US/windowsgeneraldevelopmentissues/thread/eadf5dcd-fbd1-4224-9a56-b5843efebb15/

vì vậy tôi cần phải xây dựng Bất kỳ dự án CPU, nhưng giải pháp duy nhất cho vấn đề này tôi thấy tại thời điểm này đang có dự án trùng lặp cho x86 và x64. Có điều gì tốt hơn không?

CẬP NHẬT

Khi tôi tham khảo thư viện x64 trong dự án, nhưng cố gắng để tải thư viện x86 tôi nhận được ngoại lệ sau đây.

The located assembly's manifest definition does not match the assembly reference.

+0

Cảm ơn. Tôi đã nhìn thấy các bài viết như thế, nhưng vấn đề đang thay đổi DLL chỉ không giúp được gì nhiều. Nó vẫn không hoạt động khi tôi sao chép 64 bit DLL vào thư mục của tôi, tôi vẫn cần phải biên dịch lại ứng dụng tham khảo các thư viện 64 bit đó. Tôi có làm điều gì sai? Và tôi cũng không hiểu phiên bản nào tôi nên tham khảo? – axe

+1

Có. Thư viện gốc phải có tên giống nhau, nhưng phải nằm trong các thư mục khác nhau (chẳng hạn như thư mục con của ứng dụng của bạn). Khi chạy, bạn gọi 'SetDllDirectory' để làm cho hệ điều hành nhìn vào đúng thư mục tùy thuộc vào bit. Hoặc sử dụng sự kiện 'AppDomain.CurrentDomain.AssemblyResolve' như [được đề xuất bởi Rover] (http://stackoverflow.com/questions/3787428/loading-x86-or-x64-assembly#comment7029800_6060754). Bạn không trực tiếp tham khảo các thư viện đó, trình bao bọc được quản lý SQLite thực hiện. Mã của bạn sẽ làm cho trình bao bọc tải phiên bản chính xác của thư viện gốc cơ sở. – GSerg

+0

Tôi đã thử lại một lần nữa, nó không hiệu quả với tôi. Ứng dụng gặp sự cố khi bắt đầu. Vấn đề là tôi đang tham khảo các thư viện x64 trong dự án, nhưng tôi chọn các thư viện x86 khi chạy. Nếu tôi xây dựng ứng dụng của tôi bằng cách sử dụng các thư viện x86, nó hoàn toàn hoạt động trên các cửa sổ x86, nếu không nó sẽ không hoạt động. – axe

Trả lời

6

Vấn đề chính là một thực tế mà tôi đã sử dụng các phiên bản khác nhau của SQLite cho x86 và x64. tôi đã thêm phương pháp

static private Assembly SQLitePlatformSpecificResolve(object sender, ResolveEventArgs args) 
{ 
    string platform = Environment.Is64BitProcess ? "x64" : "x86"; 
    string assemblyName = new AssemblyName(args.Name).Name; 
    string assemblyPath = Path.Combine(
     Environment.CurrentDirectory, "SQLite", platform, assemblyName + ".dll"); 

    return !File.Exists(assemblyPath) ? null : Assembly.LoadFrom(assemblyPath); 
} 

Và thiết lập xử lý sự kiện

AppDomain.CurrentDomain.AssemblyResolve += SQLitePlatformSpecificResolve; 

ở chính điểm vào ứng dụng. Bây giờ nó tải x86 lắp ráp cho x86 nền tảng và x64 trên nền tảng 64 bit tương ứng.

Cảm ơn.

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