Đây là một giải pháp làm việc cho vấn đề của bạn:
Thêm 2 DLL (x86 và x64) cho giải pháp của bạn trong một thư mục con. Đặt chúng thành "Sao chép nếu mới hơn"
Tham chiếu đúng DLL bạn sử dụng để phát triển gỡ lỗi từ 2 DLL bạn đã thêm vào. Làm cho nó Copy Local = false.
Điều này xảy ra khi bạn khởi động ứng dụng DLL không được tự động tải. Nó sẽ không được tải cho đến khi bạn sử dụng một loại từ hội đồng đó. Khi điều đó xảy ra, một sự kiện sẽ được kích hoạt trong .Net hỏi nơi có thể tìm thấy assembly của bạn.
Vì vậy, đôi khi trước lần sử dụng đầu tiên của hội đồng đó, hãy đảm bảo bạn đính kèm chính mình vào sự kiện đó.
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
Trong nội dung của trình xử lý, hãy đảm bảo bạn tải DLL (x86 hoặc x64) khi nó yêu cầu.
static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) {
if (args.Name.Equals("MyFullAssemblyName")) {
var path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
if (IntPtr.Size > 4) {
var dll = System.IO.Path.Combine(path, @"MySubDir\MyDLL_x64.dll");
return System.Reflection.Assembly.LoadFile(dll);
}
else {
var dll = System.IO.Path.Combine(path, @"MySubDir\MyDLL.dll");
return System.Reflection.Assembly.LoadFile(dll);
}
}
return null;
}
Thì đấy. Bây giờ bạn có thể chạy ứng dụng của mình dưới dạng 32 bit và 64 bit.
Ngoài ra để thêm các file DLL trong một thư mục con, bạn có thể làm cho họ như nhúng Tài nguyên, và sau đó tải chúng như thế này:
static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) {
if (args.Name.Equals("MyFullAssemblyName")) {
var ass = Assembly.GetExecutingAssembly();
if (IntPtr.Size > 4) {
var strm = ass.GetManifestResourceStream("the.resource.name.for.MyDLL_x64.dll");
var data = new byte[strm.Length];
strm.Read(data, 0, data.Length);
return Assembly.Load(data);
}
else {
var strm = ass.GetManifestResourceStream("the.resource.name.for.MyDLL.dll");
var data = new byte[strm.Length];
strm.Read(data, 0, data.Length);
return Assembly.Load(data);
}
}
return null;
}
này không làm việc cho tất cả các cụm. Một số "hybrid" hội đồng có xu hướng thất bại, trừ khi chúng được nạp từ đĩa (có thể được giải quyết bằng cách viết chúng vào đĩa ngay trước khi tải).
Nếu bạn sắp phát triển ứng dụng 32/64bit, bạn thực sự nên sử dụng hệ điều hành 64 bit. Ít nhất với Windows, một hệ điều hành 32 bit không thể chạy các chương trình 64 bit, nhưng một hệ điều hành 64-bit _can_ chạy các chương trình 32 bit. – rossipedia
Một câu hỏi khác để suy ngẫm là "Ứng dụng của tôi * có thực sự * cần chạy trong 64 bit không?" WOW thực hiện một công việc tuyệt vời khi chạy một ứng dụng 32 bit trên x64. – vcsjones