Helpers - компьютеры, интернет, программирование

Как указать, становиться ли владельцем упорядоченной строки или нет?

предположим, у меня есть x.dll на C ++, который выглядит так

MYDLLEXPORT
const char* f1()
{
   return "Hello";
}

MYDLLEXPORT
const char* f2()
{
   char* p = new char[20];
   strcpy(p, "Hello");
   return p;   
}

Теперь предположим, что я хочу использовать это в C #

[DllImport("x.dll")]
public static extern string f1();

[DllImport("x.dll")]
public static extern string f2();

Есть ли способ сказать CLR, что она должна полностью владеть строкой, возвращаемой из f2, но не f1? Дело в том, что тот факт, что строка, возвращенная из f1, в конечном итоге будет освобождена, удалена или что-то еще с помощью GC, одинаково плохо с тем фактом, что строка, возвращенная из f2, не будет. Надеюсь, вопрос был ясен. заранее спасибо

08.03.2011

Ответы:


1

Если у вас есть какое-либо влияние на реализацию dll, я настоятельно рекомендую вам просто не делать этого, как вы показали в своем примере. В противном случае уточните вопрос, указав это ограничение.

Если вам нужно вернуть строку, выделенную кучей из библиотеки DLL, вы также должны предоставить функцию очистки (всегда хорошая практика при экспорте динамически выделяемой памяти из библиотеки DLL). Вы вызываете функцию распределения с возвратом IntPtr и маршалируете ее одним из Marshal.PtrToString... в http://msdn.microsoft.com/en-us/library/atxe881w.aspx и завершите, вызвав функцию очистки для собственной стороны.

Другой способ - использовать BSTR (пример из Маршалинг BSTR в COM / Interop или P / Invoke):

Родной:

__declspec(dllexport)
void bstrtest(BSTR *x)
{
    *x = SysAllocString(L"Something");
}

Удалось:

[DllImport("mydll.dll")]
extern static void bstrtest(ref IntPtr dummy);

static void Main(string[] args)
{
    var bstr = IntPtr.Zero;
    bstrtest(ref bstr);

    var text = Marshal.PtrToStringBSTR(bstr);
    Console.WriteLine(text);

    Marshal.FreeBSTR(bstr);
}

Я только что нашел аналогичный вопрос о SO: PInvoke для функции C, которая возвращает char * < / а>

08.03.2011
  • Спасибо. Извините, я не могу проголосовать за вас (достигнут дневной лимит), предоставленная вами ссылка была именно тем, что мне было нужно! 09.03.2011
  • @Armen: Ты всегда можешь вернуться завтра ...;) 09.03.2011
  • Новые материалы

    Интуитивное понимание тензоров в машинном обучении
    Тензор является важной концепцией во многих научных областях, таких как математика, физика, обработка сигналов и компьютерное зрение, и это лишь некоторые из них. В математике тензор — это..

    Использование машинного обучения для диагностики болезни Альцгеймера, часть 4
    Маркеры семантической согласованности для ранней диагностики болезни Альцгеймера (arXiv) Автор: Давиде Колла , Маттео Дельсанто , Марко Агосто , Бенедетто Витиелло , Даниэле Паоло Радичони..

    Почему объяснимость так важна прямо сейчас?
    По мере того, как системы искусственного интеллекта и инструменты на основе машинного обучения распространяются в нашей повседневной жизни, как практики, так и критики все чаще заявляют о..

    Анимированный математический анализ
    Использование Manim для создания математических анимированных визуализаций Визуализация данных помогает понять скрытые закономерности в данных, которые невозможно визуализировать..

    Создание простого слайдера изображений с помощью JavaScript
    Узнайте, как создать базовый слайдер изображений с помощью HTML, CSS и JavaScript. Введение В этом уроке мы создадим удобный слайдер изображений, используя JavaScript, HTML и CSS. Ползунок..

    Создание базы данных с помощью супергероя «Python»
    В этом посте мы узнаем, как создать «базу данных SQLite с помощью модуля python sqlite3, создав простую функцию входа и регистрации. Готовы ли вы к этому путешествию? Если да , давайте приступим..

    ИИ для чайников: руководство для начинающих по пониманию будущего технологий
    Вы чувствуете, что остались позади в мире ИИ? Не волнуйтесь, вы не одиноки! Со всей этой шумихой вокруг искусственного интеллекта может быть трудно понять, с чего начать. Но не позволяйте сленгу..