Доступ к Microsoft. Win32. UnsafeNativeMethods?

Microsoft имеет очень хорошую обертку Windows API, включенную в платформу.NET. Это хранится в Microsoft. Win32. UnsafeNativeMethods, Microsoft. Win32. SafeNativeMethods и Microsoft. Win32. NativeMethods. К сожалению, они не доступны, потому что они объявляются как частные. Существует ли способ получить доступ к ним легко?

7
задан Kristina Brooks 31 January 2010 в 02:19
поделиться

4 ответа

Свойство позиций слоя представления основано на свойстве anchorPoint . По умолчанию (0,5, 0,5), т.е. точка привязки слоя находится в его центре. Если вид (и его слой) имеют нечетное количество пикселов в ширину или в высоту, установка интегрального значения для позиции приведет к тому, что начало координат вида будет неинтегрированным, что приведет к видимой размытости.

Чтобы обойти это, вы можете найти интегральную версию своего положения, заняв нужное центральное положение вида, вычитая половину ширины вида, округляя это значение, затем добавляя половину ширины вида и повторяя для высоты. Можно также установить значение anchorPoint для слоя представления, равное (0,0), и расположить представление в зависимости от его начала.

Есть вероятность, что это также может быть связано с несоответствием подчиненного. Чтобы диагностировать это, можно использовать инструмент Core Animation в окне Instruments и выбрать параметр Color Misaligned Images. Он должен окрашивать любые виды или слои, не выровненные по пикселям в приложении.

-121--3853803-

Существует две основные школы мысли по этому вопросу:

  1. Поместите логику в DataContext (частичный класс или фактический класс, если кодировать DataContext вручную). Причина этого в том, что DataContext уже знает обо всех ваших различных сущностях, поэтому это не создает никакой дополнительной связи и не приводит к раздутию класса.

    Недостатком, конечно, является то, что если у вас есть несколько сотен этих методов API (и вы, вероятно, в конечном итоге), то ваш DataContext быстро начнет превращаться в шар грязи, заполненный каждым случайным API запроса любой программист решит вбросить. Можно попытаться очистить это путем разделения связанных функций на различные экземпляры одного и того же класса DataContext , но это действительно только косметическое улучшение.

  2. Поместите логику в класс репозитария, т.е. в репозитарий . Два преимущества этого подхода: а) возможность использовать инъекцию зависимостей в репозитории и IoC рамки, в случае, если вы решите изменить модель данных, и b) тот факт, что вы придерживаетесь принципа единой ответственности - фактически имеет смысл , чтобы метод был там, где он есть.

    Основными недостатками размещения этих данных в репозитории являются: (а) Они могут дублировать очень похожую логику, которая уже существует в DataContext как хранимые процедуры; (б) они имеют способ создавать головные боли, когда речь идет об управлении транзакциями (если вы также используете их для сохранения); и (c) когда вы начинаете иметь много пользовательских запросов, которые возвращают специально настроенные DTO для конкретных операций или отчетов, вы оставляетесь с двумя крошечными выбор создания одного репозитория для каждого DTO,или создание одного главного "служебного" репозитория для всех DTO или какой-либо их свободно связанной группы. Оба в конечном итоге довольно плохой дизайн.

Таковы компромиссы; только вы можете решить, что лучше для ваших целей.

Я хотел бы определенно посоветовать против подхода extension-method, поскольку методы расширения трудно обнаружить (вы не можете просто ввести метод и заставить Intellisense подобрать соответствующую ссылку), и они также просто не нужны, когда у вас есть возможность непосредственно изменить или расширить (через partials) исходный класс.

Я бы также посоветовал не продлевать класс Назначение ; одна из причин, по которой мы используем такие инструменты, как Linq To SQL, заключается в том, что мы можем иметь дело с объектами POCO, которые не должны знать что-либо о том, откуда они взялись. По этой причине я лично очень против связывания классов сущностей с их DataContext - зависимость должна быть только односторонней.

-121--3404450-

Большинство определений методов в этих классах (если не все) являются объявлениями extern с атрибутами Dll Import , которые ссылаются на функции в Windows API через P/Invoke. Неважно, где эти заявления находятся. Можно создать собственный класс с именем UnsafeNativeMethods или SafeNativeMethods и поместить в него объявления, ссылающиеся на те же функции Windows API. Подписи многих функций Windows API для C # можно найти на pinvoke.net .

2
ответ дан 7 December 2019 в 14:32
поделиться

Причина может заключаться в воздействии на безопасность SuppressUnamanagedCodeSecurityAttribute. Проверьте Move P/Invokes to NativeMethods class

0
ответ дан 7 December 2019 в 14:32
поделиться

Большая часть функциональности, содержащейся в этих классах, открывается самим фреймворком .Net; перед вызовом API необходимо выполнить поиск (или задать вопрос здесь).

Чтобы ответить на ваш вопрос, нет.
Лучшее, что вы можете сделать, это скопировать их из рефлектора или ссылочного источника.

1
ответ дан 7 December 2019 в 14:32
поделиться

Для чего я всегда думал, что должна была быть кернел32.interop.dll и т.д. со статическими методами уже DllImport'ed. Но я прибегнул к созданию своих по мере необходимости. За годы работы я обнаружил, что редко пользуюсь более чем горсткой из них, но это такая заноза в заднице, когда мне нужен API, который я еще не импортировал.

1
ответ дан 7 December 2019 в 14:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: