Комментарии 40
COMExport не подходит?
+2
Это решение показалось для меня наиболее удобным. Честно сказать я никогда не пользовался COMExport
0
Честно говоря, не вижу ничего удобного в декомпиляции и правке ассемблерного кода. При автоматической сборке на билд-сервере вы проклянете это решение.
+4
Никогда до этого не слышал про билд-серверы… Было очень сильное ограничение по времени, и первое решение осталось предпочтительным, что бы не тратить время
-7
Ну, в таком случае рекомендую почитать про COM export. Для самообразования.
+6
Как только закончу работу над проектом, сразу же займусь. Спасибо за рекомендацию.
0
Кстати, рекомендую на эту тему потом почитать у самого bobermaniac ;-) Он вроде писал об этом где-то в 2009.
0
как вариант — метод вызывается динамически через загруженный в процесс CLR. Но COM Export таки изящнее.
Плюсы загрузки CLR в неуправляемое хост-приложение в том, что можно наложить требуемые разрешения и прокинуть в домен приложения нужные интерфейсы до запуска управляемого кода. Ну и скилл повышает, да.
Плюсы загрузки CLR в неуправляемое хост-приложение в том, что можно наложить требуемые разрешения и прокинуть в домен приложения нужные интерфейсы до запуска управляемого кода. Ну и скилл повышает, да.
0
При автоматической сборке на билд-сервере вы проклянете это решение.Берём Mono.Cecil и автоматизируем процесс.
0
Еще можно посоветовать обратить внимание на Running Object Table, прекрасное средство взаимодействия процессов, неважно на чем написанных, встроенное в систему.
0
Вроде бы ilasm у 4го.нета (а вы используете его) уже сам шарит вставлять vtentry/vtfixup, нужно только export в теле функции указать и все.
К тому же это будет также работать с x64, где нужно int64 вместо int32 в vtentry указывать.
К тому же это будет также работать с x64, где нужно int64 вместо int32 в vtentry указывать.
0
Вот интересный проектик sites.google.com/site/robertgiesecke/. Делает то же что и вы только автоматом :)
0
Хотелось бы поподробнее на счет «export в теле функции указать». Я не нашел решения.
0
Я в том году за статью об этом методе получил инвайт =).
Потом вышла более продуманная и расписанная тут: www.gotdotnet.ru/blogs/RaveNoX/7202/
Потом вышла более продуманная и расписанная тут: www.gotdotnet.ru/blogs/RaveNoX/7202/
+1
Ну вот народ автоматом всё делает, статья 2006 года How to Automate Exporting .NET Function to Unmanaged Programs
0
НЛО прилетело и опубликовало эту надпись здесь
Там внутри обычный COFF/PE с IL-кодом внутри одной из секций. При подгрузке такой библиотеки виндовый загрузчик заодно подгружает и CLR (mscoree.dll в таблице импоорта), который уже и выполняет JIT-компиляцию. Самой же дотнетной библиотеке никто не запрещает содержать и native code.
0
НЛО прилетело и опубликовало эту надпись здесь
Когда mscoree будет выполнять компиляцию?
Её пнут из DllMain, вероятно.
mscoree в момент своей загрузки поправит таблицу экспорта в загруженной сборке?Зачем править таблицу экспорта, если можно сразу при компиляции сделать переходники, пинающие mscoree?
Вообще, возьмите IDA да посмотрите, у меня её под рукой нет.
0
Есть же С++ CLI, в котором можно стандартными средставми указать ф-ии для экспорта и вызвать управляемую шарповую дллку. Зачем эти хаки?
+1
Не резон ради одной функции на C# писать оболочку на C++, а только .Net было обязательным требованием заказчика
0
Пару часов поисков в интернете...
А пару часов гуглить — ок?
И в итоге получить вместо нормального решения хак, требующий кучу ручной работы при пересборке.
+2
Я повторюсь, у меня в планах было написать приложение для автоматизации этого процесса, но поняв что библиотеку мне не нужно будет 100 раз пересобирать, я остановил свой выбор на этом методе
0
Статья только путать людей. Это курьез, не более того, не надо это использовать нигде.
С чего вы решили что вам надо будет что то пересобрать 100 раз? Два проекта просто будет которые сами скомпилируются.
У вас в руках и .h будет нормальный и .lib, в случае изменения интерфейсов у вас при компиляции будут ошибки возникать а не в рантайме. А такие решения как у вас вместо временных обычно становятся постоянными. Посмотрю я на вас или кого-то кто будет с этим в будущем разбираться если вы забудете сколько у вас параметров в функциях.
С чего вы решили что вам надо будет что то пересобрать 100 раз? Два проекта просто будет которые сами скомпилируются.
У вас в руках и .h будет нормальный и .lib, в случае изменения интерфейсов у вас при компиляции будут ошибки возникать а не в рантайме. А такие решения как у вас вместо временных обычно становятся постоянными. Посмотрю я на вас или кого-то кто будет с этим в будущем разбираться если вы забудете сколько у вас параметров в функциях.
0
С++/CLI — это один из языков .NET, вполне возможно было просто добавить managed C++ проект с необходимыми интерфейсами, это гораздо проще, чем каждый раз править IL.
0
Почему не COM? Платформа другая?
0
Кстати говоря. Может, я неправильно понял проблему, тогда поправьте, пожалуйста.
Есть библиотека на C#, нужно пользовать её функции в неуправляемом коде.
В таком случае берем таблицу типов из dll и подключаем эту dll в неуправляемом коде, примерно так:
Насколько я понимаю, это решает задачу.
Есть библиотека на C#, нужно пользовать её функции в неуправляемом коде.
В таком случае берем таблицу типов из dll и подключаем эту dll в неуправляемом коде, примерно так:
- #import "SupportLibrary.tlb" raw_interfaces_only
- using namespace SupportLibrary
Насколько я понимаю, это решает задачу.
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Делаем библиотеку написанную на .Net понятной для Unmanaged кода