2012-09-13 35 views
7

Có cách nào tôi có thể áp dụng một thuộc tính cho cấu trúc có điều kiện không?Thuộc tính struct khác nhau dựa trên 32bit hoặc 64bit

Nếu máy là 32bit Tôi muốn áp dụng thuộc tính này

[StructLayout(LayoutKind.Sequential, Pack = 2, CharSet = CharSet.Unicode)]

Nếu máy là 64bit Tôi muốn áp dụng thuộc tính này

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]

Hoặc cách khác tôi có thể thay thế một giá trị trong thuộc tính ...

32bit (Gói = 2)

[StructLayout(LayoutKind.Sequential, Pack = 2, CharSet = CharSet.Unicode)]

64bit (Gói = 8)

[StructLayout(LayoutKind.Sequential, Pack = 8, CharSet = CharSet.Unicode)]

tôi đã cố gắng sử dụng này example nhưng nó cho thuộc tính tùy chỉnh, không tồn tại những người.

Cập nhật:

  • Tôi muốn comile để "Bất kỳ CPU"
  • Thuộc tính là cho SHFILEOPSTRUCT và tùy thuộc vào bộ vi xử lý sử dụng một trong hai hoặc.
  • Tôi không muốn phải biên dịch hai phiên bản.
+1

Bạn sẽ biên dịch chương trình tĩnh 64 và 32 bit hay bạn đang sử dụng "CPU bất kỳ" và muốn hoạt động khác nhau trong thời gian chạy? –

+0

Nếu chỉ có lớp 'StructLayoutAttribute' không được niêm phong. Doh! – simonlchilds

+1

bạn có thể thực hiện điều này với các chỉ thị biên dịch có điều kiện. –

Trả lời

6

Câu hỏi hay.

Câu trả lời tôi nghĩ đầu tiên là các chỉ thị tiền xử lý và các bộ sưu tập được biên dịch 32 và 64 bit. Bạn có thể sử dụng cùng mã, ngay cả những dự án tương tự, chỉ cần xây dựng và triển khai nó hai cách tùy thuộc vào hệ thống mục tiêu:

#ifdef Bit32 
[StructLayout(LayoutKind.Sequential, Pack = 2, CharSet = CharSet.Unicode)] 
#endif 
#ifdef Bit64 
[StructLayout(LayoutKind.Sequential, Pack = 8, CharSet = CharSet.Unicode)] 
#endif 

này sẽ yêu cầu xác định Bit32 và Bit64 hằng biên dịch cho dự án của bạn dựa trên kiến ​​trúc mục tiêu, và có thể xây dựng ứng dụng của bạn hai lần.

Nếu bạn muốn làm điều này trong thời gian chạy, tôi không nghĩ rằng nó có thể trừ khi bạn phát ra toàn bộ lớp học một cách linh hoạt khi chạy. Các thuộc tính chỉ có thể có dữ liệu không đổi và chúng không thể được áp dụng theo điều kiện khi chạy (các chỉ thị tiền xử lý hoạt động tại thời gian biên dịch, không phải thời gian chạy).Cách khác duy nhất tôi có thể nghĩ để làm điều này là sao chép định nghĩa lớp thành hai không gian tên, và có điều kiện sử dụng một hoặc cái khác dựa trên thuộc tính Environment.Is64BitOperatingSystem. Bạn có thể sử dụng thuộc tính này để điều khiển lớp bạn khởi tạo, hoặc chiến lược tạo ra bạn chọn (phương thức nhà máy hoặc mẫu liên quan nào được sử dụng), nhưng bạn không thể kiểm soát các thuộc tính trong thời gian chạy; thông tin của họ được biên dịch tĩnh vào tệp kê khai lắp ráp dưới dạng siêu dữ liệu. Điều này đặc biệt được sử dụng bởi chính thời gian chạy để xác định cách lưu trữ các thành viên của đối tượng như dữ liệu heap và bạn không bao giờ thực sự tìm thuộc tính này trong mã người dùng và sử dụng nó để xác định hành vi (do đó bỏ qua hoặc chỉ định một gói có điều kiện giá trị khi chạy).

+0

+1. Phát ra âm thanh thời gian chạy như cách tiếp cận thú vị. –

+0

Đó là niềm vui cùng một cách bị trói và nghẹt thở trong phòng ngủ là niềm vui; chắc chắn có một suy nghĩ nào đó để nhìn nó theo cách đó. – KeithS

+0

vâng, tôi nên chọn từ ngữ cẩn thận hơn - vui như trong "thú vị, thú vị, mạo hiểm nhưng không có khả năng sinh lợi". Tôi nghĩ rằng "trói và nghẹt thở" là so sánh quá nghiệt ngã, trừ khi gây ra một quyết định về cách tiếp cận như vậy cho mã sản xuất thực tế. –

0

Tôi không nghĩ bạn có thể làm điều đó. Chỉ có 2 cấu trúc và cung cấp một cách để chuyển đổi cả hai thành cấu trúc hoặc lớp được chia sẻ để xử lý ...

Lưu ý: tính năng bạn yêu cầu rất lạ (bố cục rõ ràng khác nhau của cấu trúc dựa trên loại JIT đã xảy ra trong thời gian chạy)). Trong hầu hết các trường hợp, điều này được sử dụng để bố trí vật lý các byte khớp với một số giao thức cố định nổi tiếng độc lập với ứng dụng bittness. Bạn có thể xem xét trường hợp của bạn là có 2 giao thức khác nhau/interops cho x86/x64 trường hợp và được hạnh phúc với 2 cấu trúc.

1

Tạo hai mục tiêu xây dựng khác nhau (một cho 32 bit, một cho 64 bit), thêm biểu tượng biên dịch có điều kiện cho mỗi (x86 cho một, x86_64 cho khác) và sử dụng các định nghĩa cấu trúc của #ifdef.

+0

Không có upvotes hơn: (.... Tôi nghĩ rằng cách tiếp cận này sẽ làm việc - biên dịch 2 phiên bản của cùng một lớp/struct và tự động tải một lúc chạy tùy thuộc vào quá trình hiện tại 'bitness.Đây là cách bạn có một struct/class và có thể dễ dàng sử dụng nó trong phần còn lại của mã mà không có ifdef lạ. –

+0

@Alexei Levenkov - nên nói, tôi không thực sự muốn biên dịch hai phiên bản. – Rob

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