2015-10-15 2 views
3

Возможно ли, что C# вызывает API Win32 или общую DLL, которые делают доступ непосредственно к оборудованию или памяти?Доступ к аппаратным средствам или памяти с C#

Я читал о совместимости, небезопасном электронном неуправляемом DLL ...

Например, если я пишу DLL в C, что Bitmask некоторых битого устройства после того, как можно дальше от C# вызова этой DLL?

Точно так же, если я пишу DLL в C, что выделить кусок сырого памяти, обеспечивают функции чтения и записи, я могу позвонить из C# , что DLL для чтения или записи, что часть памяти?

+0

Так реализуется множество .NET Framework. В конце концов, он должен позвонить в родную ОС. – usr

ответ

5

В принципе, можно назвать родные DLL-файлы Windows с C#; технику, на которой можно найти учебники и определения here, называется «invoke платформы». С точки зрения пользователя, сигнатуры методов и типы, используемые в соответствующей dll, должны быть переопределены в C# - тогда сигнатуры метода должны быть оснащены соответствующим атрибутом DllImport, который документирован here. В ссылочной DLL могут быть выполнены все виды желаемых «родных» вещей.

1

Возможно ли, что C# вызывает API Win32 или общую DLL, которые напрямую обращаются к аппаратным средствам или памяти?

Нет. Хотя вы можете вызывать API Win32 с C#, нет никаких API Win32, которые обеспечивают прямой доступ к памяти или аппаратным средствам. Только драйверы устройств могут напрямую обращаться к памяти или аппаратным средствам.

Ваш код C# и действительно неуправляемый код Win32 выполняется в режиме пользователя. Код режима пользователя не может напрямую обращаться к памяти или аппаратным средствам. Для этого код должен выполняться в режиме ядра и для этого требуется драйвер устройства.

Драйверы устройств не могут быть реализованы на C#. Обычно драйверы устройств реализованы на C. Вы можете реализовать драйвер устройства, чтобы делать все, что вам нужно, и общаться с ним с C#, вызывая DeviceIoControl.

+0

Но если я разработаю драйвер устройства на C и создаю DLL для управления им, я могу использовать эту DLL из C# через interop и небезопасный код, как говорит Codor в его ответе? – xdevel2000