Информация
- В рейтинге
- Не участвует
- Откуда
- Санкт-Петербург, Санкт-Петербург и область, Россия
- Дата рождения
- Зарегистрирован
- Активность
Специализация
Десктоп разработчик, Бэкенд разработчик
Старший
C#
.NET
ASP.NET
WPF
SQL
Git
ООП
Английский язык
Разработка программного обеспечения
.NET Core
На десятке самые серьёзные из замеченных проблем:
— Утечка памяти ядром. Через пару дней аптайма приложения начинают сыпаться с Out of memory. Исправляется выключением Superfetch.
— Пропадание ярлыков из «Пуска». Пришлось поставить Wox для запуска программ.
В rescue mode у меня тоже сваливалось, причина оказалась в смене UUID у раздела, указанного в fstab.
Ещё есть вариант подписаться на geektimes.ru/rss/?with_hubs=true и фильтровать по хабам регулярками в ридере или том же Yahoo Pipes. Тогда и новые хабы мимо не пройдут, если не будут явно отфильтрованы.
adb shell su -c dd if=/dev/block/mmcblk0p12 | dd of=userdata.imgСкорость была около 3 МБ/с в cygwin.
Вот только, как оказалось, Module Initializer автоматически после загрузки DLL не вызывается, он выполняется только когда происходит первое обращение к управляемому коду, чего Mathcad, конечно же, делать не будет.
Вообще я не вижу простого способа зарегистрировать функции, не помещая потенциально опасного кода в нативный DllMain. Разве что на этапе построения сборки с функциями генерировать независимый C++-код для регистрации в DllMain (с захардкоженными FunctionInfo) и линковать его в исходную сборку, как описано здесь. Адреса функций тогда тоже должны быть статическими, для этого прокси тоже надо влинковать в исходную сборку и экспортировать как C-функции.
В общем, прямой вызов управляемого кода из DllMain, как у вас, значительно проще, хоть и небезопасен. Можно написать всё, кроме этого кусочка, на C#, а затем слинковать, как описано по ссылке выше.
Если бы Mathcad вызывал экспортированную функцию для инициализации (большинство программ с поддержкой плагинов делают именно так), можно было бы обойтись чисто управляемым кодом, но увы. Видимо, разработчики не предполагали, что для получения адресов из своей же DLL плагину понадобится плясать с бубном.
Я бы и ваш IFunction превратил в просто метод объекта с конкретными типами параметров, из них можно и метаданные вывести. И атрибуты для уточнения.
Для генерации прокси можно и Linq.Expressions вместо Reflection.Emit использовать, код будет попроще. Делегат создаётся весьма неочевидным образом, к этому надо ещё и генерацию атрибутов добавить.
Впрочем, на практике я данный метод не использовал, был опыт только с фиксированным набором параметров, там всё в разы проще.