ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
29 марта
883898 Топик полностью
fk0, легенда (20.11.2018 11:13, просмотров: 137) ответил бомж на вызов C/C++ кода -- легко! Пишешь dll на C++ и вызываешь из шарпа как родные.
Ага, printf вызови! Да и не просто всё, вопросы сходу: 1) если код кросплатформенный, то как быть с тем, что где-то нужны .dll, где-то .dynlib, где-то .so, а имя библиотеки захардкожено и используется, в момент компиляции (я уже знаю как выкрутиться и захардкодить только libdl.so или user32.dll, чтоб потом вызывать dlopen() и dlsym()/GetProcAddress() -- костылище)... 2) должен для каждой функции писать правило маршалинга, если функций много это нереально объёмная работа (в том же SWIG всё проще делается); 3) в C# нет функций с переменным числом аргументов (есть params array[], но он же в куче аллоцируется, есть недошаблоны (где нет переменного числа параметров тоже), и недо-tuple (который не умеет хранить ни ноль, ни более 8-и элементов) но там же происходит boxing и, видимо аллокация, для кажого объекта; 4) непонятно как в compile-time захардкодить нужную библиотеку в зависимости от платформы (особенно при кросс-компиляции); 5) 2-х байтные chars в строках -- это значит на каждый чих их переводить в ascii/utf-8/cp1251 и обратно и опять же аллоцировать память, сделали хотя бы совместимость с wchar_t, чтоб можно было wsnprintf() вызвать... 6) в нормальных языках по 100500 разным причинам есть аналог printf, только у микрософта нет.
[ZX]