@daniil14056

Как написать на с++ метод и экспортировать его в c# заинлайнить, и можно ли _fastcall его сделать???

В c# библиотека Math содержит методы, некоторые, реализованы на c++ и экспортированы
Многие методы как этот, ну 1-2 строчки кода
[System.Security.SecuritySafeCritical]  // auto-generated
      [ResourceExposure(ResourceScope.None)]
      [MethodImplAttribute(MethodImplOptions.InternalCall)]
      extern public static double Abs(double value);

ВОПРОС как сделать функцию sum в с++ что бы она работала так же быстро как и sum в c# коде? Как ее заинлайнить? Можно ли за FastCall -ить ее?
extern "C" __declspec(dllexport)  inline int __fastcall Sum(int a, int b)
{
    return a + b;
}


Компилятор .net 7.0 не дает мне указать FastCall
//[MethodImpl( MethodImplOptions.AggressiveInlining )] то же не помогает
 [DllImport(@"sum.dll", CallingConvention = CallingConvention.FastCall)]
        public static extern int Sum(int a, int b);

Экспортированная функция работает в 4 раза медленнее. В то время как методы Math работают так же быстро.
Или бессмысленно маленькие методы экспортировать?

Кстати еще вопрос, как библиотеку с++ подключать к проекту, почему DllImport не находит, если указать ссылку на проект, находит только по абсолютному адресу от диска "c://...", и при компиляции, не компилирует с++ проект(не обновляет). К примеру, если хочу c# библиотеку сделать, то просто добавили ссылку и забыл о всем. А когда добавляю так же ссылку на dll от с++ проекта, то ноль реакции.
  • Вопрос задан
  • 124 просмотра
Решения вопроса 1
Nipheris
@Nipheris Куратор тега C++
Экспортированная функция работает в 4 раза медленнее.

Разумеется, у вас всё время уходит на накладные расходы на PInvoke. Это полное безумие - выносить сложение чисел вообще в функцию, а тем более ещё и делать вызовом между языками. А PInvoke - это вам не InternalCall

ВОПРОС как сделать функцию sum в с++ что бы она работала так же быстро как и sum в c# коде? Как ее заинлайнить

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

К примеру, если хочу c# библиотеку сделать, то просто добавили ссылку и забыл о всем. А когда добавляю так же ссылку на dll от с++ проекта, то ноль реакции.

Потому что dll которые получились из C# - это дотнетовские сборки, которые только прикидываются Portable Executable, а вот то, что компилится из C++ - это действительно Portable Executable, и ничего дотнетовского там нет (если конечно это обычный C++ DLL-проект, а не C++/CLI).

Кстати еще вопрос, как библиотеку с++ подключать к проекту, почему DllImport не находит, если указать ссылку на проект,

Вам нужно настроить копирование C++ DLL в выходную директорию проекта, рядом с вашей дотнет-сборкой, в которой находится DllImport
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
vabka
@vabka Куратор тега C#
Токсичный шарпист

Или бессмысленно маленькие методы экспортировать?

Бессмысленно. Лучше сразу на C# их и писать.
Прибегать к C++ и p/invoke есть смысл только если невозможно переписать на C#.

Например это имеет смысл в случае библиотек уровня ffmpeg, sqlite, tensorflow
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы