2012-04-24 68 views
7

Trong C++, bạn có thể sử dụng trình khai báo __declspec(align(#)) để kiểm soát căn chỉnh dữ liệu do người dùng xác định. Làm thế nào có thể làm điều này cho C#. Tôi có hai thủ tục được viết trên Assembler trong dll của tôi. Đối số cho các thủ tục (hai mảng) phải được căn chỉnh trên 16 byte. Đối với C++ nó hoạt động tốt.C# kiểm soát căn chỉnh dữ liệu

tôi chỉ sử dụng tờ khai

__declspec(align(16)) 
double a[2]={10.2,10.6}; 
+2

có lẽ bạn nên cho chúng tôi biết những gì bạn muốn làm chứ không phải (hoặc bổ sung cho) làm thế nào bạn sẽ làm điều đó bằng ngôn ngữ khác. – Servy

+4

@Servy: Hoàn toàn thẳng thắn, tôi nghĩ anh ấy khá rõ ràng về những gì anh ấy muốn làm; việc cung cấp một ví dụ bằng ngôn ngữ khác là bình thường. – NotMe

+0

@ChrisLively Nó không sai, tôi chỉ không xem xét nó đủ. Bạn giới hạn câu trả lời cho những người đã quen với chức năng của ngôn ngữ khác. Một cổng trực tiếp cũng không phải lúc nào cũng là ý tưởng giữa các ngôn ngữ. Nếu vấn đề cơ bản là biết một giải pháp phù hợp hơn với ngôn ngữ có thể được sử dụng. – Servy

Trả lời

8

Nếu bạn đang tìm kiếm cố gắng không quản lý interop (truyền dữ liệu giữa C# /. NET-based và/C++/phần mềm lắp ráp dựa trên C), bạn sẽ sử dụng một sự kết hợp của các thuộc tính StructLayoutFieldOffset thuộc tính:

[StructLayout(LayoutKind.Explicit, Pack = 16)] 
public class MyDataClass { 
    [FieldOffset(0)] 
    double[] a; 
} 

Theo MSDN:

Trường System.Runtime.InteropServices.StructLayoutAttribute.Pack xác định căn chỉnh bộ nhớ của trường dữ liệu của đối tượng đích.

http://support.microsoft.com/kb/922785

+0

Nếu câu trả lời của tôi là trợ giúp cho bạn, xin vui lòng đánh dấu nó là chính xác ... –

+0

Downvoter, chăm sóc bình luận? –

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