2009-06-09 36 views
5

Tôi đang giao tiếp với một thành phần ActiveX cung cấp cho tôi địa chỉ bộ nhớ và số byte.Địa chỉ bộ nhớ truy cập trong C#

Làm cách nào tôi có thể viết chương trình C# để truy cập các byte bắt đầu tại địa chỉ bộ nhớ đã cho? Có cách nào để làm điều đó tự nhiên, hoặc tôi sẽ phải giao tiếp với C + +? Thành phần ActiveX và chương trình của tôi có cùng không gian bộ nhớ/địa chỉ không?

Trả lời

7

Tôi khuyên bạn nên sử dụng IntPtr và Marshal.Copy. Đây là một số mã để giúp bạn bắt đầu. memAddr là địa chỉ bộ nhớ bạn được cung cấp và bufSize là kích thước.

IntPtr bufPtr = new IntPtr(memAddr); 
byte[] data = new byte[bufSize]; 
Marshal.Copy(bufPtr, data, 0, bufSize); 

Điều này không yêu cầu bạn sử dụng mã không an toàn yêu cầu tùy chọn trình biên dịch/không an toàn và không được CLR xác minh.

Nếu bạn cần một mảng khác với byte, chỉ cần thay đổi dòng thứ hai. Marshal.Copy có một loạt các tình trạng quá tải.

+0

Cảm ơn bạn đã lấy mẫu mã; đây là những gì tôi đã kết thúc bằng cách sử dụng. – chocojosh

2

Tôi nghĩ bạn đang tìm kiếm loại IntPtr. Loại này (khi được sử dụng trong khối unsafe) sẽ cho phép bạn sử dụng bộ xử lý bộ nhớ từ thành phần ActiveX.

10

Bạn có thể sử dụng Marshal.Copy để sao chép dữ liệu từ bộ nhớ riêng thành một mảng được quản lý. Bằng cách này, bạn có thể sử dụng dữ liệu trong mã được quản lý mà không cần sử dụng mã unsafe.

+0

Đây có thể là cách thanh lịch hơn nhiều so với sử dụng mã không an toàn. Chương trình của tôi hiện đang hoạt động với mã không an toàn; nhưng, tôi sẽ xem lại sau để xem tôi có thể thay thế bằng Marshal.Copy – chocojosh

1

C# có thể sử dụng con trỏ. Chỉ cần sử dụng từ khóa 'không an toàn' trước lớp, khối, phương pháp hoặc biến thành viên của bạn (không phải biến cục bộ). Nếu một lớp được đánh dấu là không an toàn thì tất cả các biến thành viên cũng không an toàn.

unsafe class Foo 
{ 

} 

unsafe int FooMethod 
{ 

} 

Sau đó, bạn có thể sử dụng con trỏ với * và & giống như C.

Tôi không biết về các thành phần ActiveX trong không gian địa chỉ tương tự.

+0

Tôi đã sử dụng giải pháp này sau khi tôi đã đăng câu hỏi hay chưa. _axetRecord1.SourceBufferMemoryPointer lưu trữ vị trí bắt đầu bộ nhớ đệm. Mã sau đây hoạt động: [mã] ngắn * memPtr; memPtr = (short *) _ axetRecord1.SourceBufferMemoryPointer; [/ code] – chocojosh

+0

Bạn phải ghim ví dụ nếu bạn định chuyển nó sang mã gốc! –

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