Как стать автором
Обновить
1
0
Alexander @Norfolc

Software Engineer

Отправить сообщение
Чтобы сделать условный брекпоинт с использованием имени параметра нужно загрузить символы для библиотеки. Microsoft Symbol Servers содержит символы для gdi32.dll, но, к сожалению, не содержит имен параметров. Поэтому нужно опуститься на уровень ассемблера, так как все параметры, в конечном счёте, передаются либо через стек, либо через регистры.

Если запускать программу в 32-битном режиме, то первый параметр будет находиться по адресу [ebp+8], так как winapi использует stdcall. см. x86 Function-call Conventions
Соответсвенно значение по этому адресу можно получить так: (*(int*)(ebp+8))


Если программа 64-битная, то первые 4 целочисленные параметры функции находятся в регистрах RCX, RDX, R8, R9. см. Microsoft x64 calling convention.
Если мы хотим проверять только младшие 4 байта параметра, то вместо регистра rcx нужно использовать ecx: ecx == 0x12345678.

Вместо ApiMonitor можно попробовать запустить отладку в Mixed Mode и поставить брекпоинты (с трассировкой) на нативные функции. И тут уже могут работать условные брекпоинты.

Это довольно серьёзная разница в производительности. Может быть для современных PC это не существенная разница, но при использовании такого кода на мобильных устройствах это может быть очень заметно.
Согласен. В моём коде есть ошибка.
Если operation будет вызван заранее (как при использовании extension-метода), то будет дедлок:
var operation = OperationAsync();
return Task.Run(() => operation).Result; // Deadlock!!

Однако дедлока можно избежать, если сделать такой вызов:
return Task.Run(() => OperationAsync()).Result;


В этом случае OperationAsync() не будет захватывать контекст синхронизации, и как результат не будет дедлока.
Следствием этого всего является то, что невозможно написать extension-метод для Task-а без дедлока в общем случае.
И какую задачу это решит? Если operation — асинхронная функция, вызывающая у себя внутри другие асинхронные функции, то это ни на что не повлияет.
На самом деле, плохо совмещать синхронный и асинхронный код. Но если уж приходится это делать, то нужно это делать с умом, учитывая особенности в каждом конкретном месте.
Например, если не важно, в каком потоке будет работать код после await, то можно использовать ConfigureAwait(false) на всех библиотечных функциях и после этого можно вызвать свойство Result…
Оба решения, в зависимости от ситуации, могут как работать, так и не работать.
Решение без Task-а вызовет дедлок в WinForms/WPF приложении, если обращение к Result будет до окончания последнего вызова, захватывающего контекст, внутри асинхронной функции.
Решение с таском может не работать, например, если внутри асинхронной функции будет обращение к UI…
Простой вызов operation.Result может привезти к дедлоку — если в качестве operation передать результат асинхронной функции, которая использует текущий SynchronizationContext.
Поэтому решением здесь как раз таки бывает вызов нового таска:
return Task.Run(() => operation.Result).Result;
Я для аналогичных целей использую Dropbox. AdHoc-сборки я кладу в папку [DropboxFoler]/Public и посылаю пользователям ссылку на html-ку (с адресом типа dl.dropboxusercontent.com/u/[userid]/app/app.html), которая лежит рядом же.
А автоматизировать деплой в эту папку можно с помощью обычной команды cp. А уже саму заливку сделает само приложение Dropbox-а.
Это возможно и это я сам делал. Мы создавали свою нативную ObjectiveC-библиотеку и из нее вызывали C#-код.
Как это делается на iOS:
1) Создается интерфейс на ObjectiveC (MonoObject.h):
@interface MonoOject : NSObject {
}

@property(nonatomic) BOOL isAuthenticated;

- (int) search: (NSString*)query;
@end

2) Нативная библиотека компилируется и подключается в Binding Library проект.
3) В ApiDefinition.cs файле этого проекта прописывается следующий код:
    [BaseType(typeof(NSObject), Name="MonoObject")]
    [Model]
    interface MonoObject
    {
        [Export("isAuthenticated")]
        [Abstract]
        bool IsAuthenticated { get; }

        [Export("search:")]
        [Abstract]
        int Search(string query);
    }

4) Создается наследник-имлементация от класса MonoObject:
public class MonoObjectImpl : MonoObject
{
    public override bool IsAuthenticated
    {
        get 
        {
            return true;
        }
    }
    ...
}

5) Объект класса MonoObjectImpl передается в нативный код и оттуда уже вызываются методы этого объекта.

Такой подход позволил нам создать нативную библиотеку со всем UI и взаимодействовать с ней. При этом вся бизнес логика осталась кросс-платформенной на C#.
В Xamarin.Android есть специальный тип проекта — Java Binding Library.
При этом получается использовать «нативные» Java-библиотеки очень просто — в Java Binding Library добавляется jar-файл, и после компиляции получается .Net dll-ка, содержащая необходимый нам Java-код с .Net-интерфейсом. При этом вся JNI-обертка делается автоматически.
Плюс ещё можно писать с помощью C#/MonoTouch.
Ну там же Мигель — не единственный разработчик… и, насколько мне известно, они все время расширяют свой штат сотрудников…
Если я правильно Вас понял, то стоит смотреть на эту статью, чтобы вызывать Managed-методы из неуправляемого кода…
Я сам экспериментировал с этим (в частности на iPhone) и это вполне себе работает. Думаю и на андроиде и на других платформах это будет работать аналогично.
Не правильно. Для запуска на iPhone приложение нужно преобразовать в бинарный вид. А это делает только MonoTouch. Да и гуишный фреймворк под iOS свой и не совместим с другими платформами.
Ну а если под «на C# писать программы для iOS» понимается написание не гуишных библиотек для использования в MonoTouch приложениях, то это можно делать не только под MacOS, а под любой другой платформой. Только нужно быть готовым к проблемам в виде отсутствия многих фреймворков под MonoTouch.
ну я бы не сказал, что практически всё. Например, с WCF там большие дыры и проблемы. Один и тот же код под .NET и под Mono работает по-разному (в моно не работает, то что должно работать).
Успешные результаты есть. По постановлению суда ПФ выплачивает долги.
смотреть их только в режиме приватного просмотра. Тогда они и в истории браузера ничего не обнаружат.
там есть есть ещё и «изготовление, хранение, перевозка или другое перемещение» — что подходит и под вывоз. Но только «с целью сбыта или распространения».
Когда летел из Днепропетровского аэропорта меня тоже просили вытащить ноут из рюкзака. Включать не просили.
А были (и есть) ещё люди, которые вместо скопировать (отксерить) говорять отэрить — от названия советского аппарата ЭРА (сокр. Электрографический Репродукционный Аппарат).
1

Информация

В рейтинге
Не участвует
Откуда
Израиль
Зарегистрирован
Активность