Как настроить функцию C++ так, чтобы она могла использоваться p/invoke?

Если Ваша долгосрочная цель состоит в том, чтобы мигрировать на использование Знатока для управления всем процессом сборки (который мог бы намереваться сделать для новых проектов нового строительства), то я сердечно рекомендую использовать Знатока файлы pom.xml для управления зависимостями от имени Муравья файлы build.xml. Конечный результат состоит в том, что и Ваши проекты нового строительства и Ваши проекты прежней версии тогда все используют тот же механизм для управления зависимостями. И оказывается, что Знаток действительно делает лучшее задание руководящих зависимостей для Муравья файлы build.xml, чем делает Ivy.

До принятия Знатока как наш ведущий инструмент сборки, я сделал, чтобы разработчик попытался использовать Ivy в комбинации существующему Муравью файлы build.xml. Это было самым расстраивающим опытом, которые очень скоро приводят нас отклонять Ivy. Мы продолжили принятие Знатока. Наши проекты нового строительства начали создаваться с подходом Знатока запаса, и т.д.

Однако я вернулся к устаревшим проектам Муравья и начал использовать задачу Ant Знатока для определения определений пути к классу (и иногда других определений свойства Ant, втянутых из pom.xml). Это оказалось самым превосходным опытом. Существующие файлы build.xml Муравья должны только быть измененными немного для использования интеграции муравья Знатока для определения любого пути к классу, которые использовались в файле build.xml. Все зависимости, требуемые проектом, стали определенными в сопроводительном файле pom.xml, который обрабатывается Знатоком через задачу Ant, включенную в файлы build.xml.

объемы Знатока могут использоваться для точной настройки определений пути к классу, таким образом, что одно подходящее для компиляции или рабочий модульный тест, или для упаковки, и др., может быть установлено. Кроме того, в значительной степени на любой элемент чего-то определенного в файле pom.xml можно сослаться как свойство Ant в файле build.xml.

Действительно с задачей Ant для Знатока нет никакой жизнеспособной причины для Ivy даже существовать.

8
задан x4000 7 October 2009 в 20:15
поделиться

4 ответа

Вы захотите использовать extern «C» , а также __ declspec (экспорт) , например:

extern "C" _declspec(dllexport)  bool TestFunc()
{
    return true;
}

Для получения полной информации, см. MSDN по типам маршалинга .

13
ответ дан 5 December 2019 в 07:12
поделиться

Расширение правильного ответа Рида.

Другая проблема, с которой вы можете столкнуться при раскрытии функции C ++ через PInvoke, - это использование недопустимых типов. PInvoke действительно может поддерживать только маршалинг примитивных типов и простых старых типов структур / классов данных.

Например, предположим, что TestFunc имеет следующую сигнатуру

void TestFunc(std::string input);

Даже добавления extern «C» и __ declspec (dllexport) будет недостаточно для открытия функции C ++. Вместо этого вам нужно будет создать вспомогательную функцию, которая предоставляет только типы, совместимые с PInvoke, а затем вызывается в основной функции. Например,

void TestFunc(const std::string& input) { ... }

extern "C" _declspec(dllexport)  void TestFuncWrapper(char* pInput) {
  std::string input(pInput);
  TestFunc(input);
}
7
ответ дан 5 December 2019 в 07:12
поделиться
$('div.band div.member');

предоставит вам объект jQuery, содержащий

, который соответствует селектору, т.е. div с элементом class , которые являются потомками div с class группа .

Объект jQuery представляет собой объект, подобный массиву, в котором каждому согласованному элементу присваивается числовое свойство (например, индекс) объекта, а также определяется свойство length . Чтобы получить один элемент, это

// first element
$('div.band div.member')[0];

или

// first element
$('div.band div.member').get(0);

. Вместо того, чтобы выбирать все элементы, вы можете указать, чтобы выбрать определенный элемент в соответствии с положением в DOM. Например

// get the first div with class member element
$("div.band div.member:eq(0)")

или

// get the first div with class member element
$("div.band div.member:nth-child(1)")

EDIT:

Вот плагин, который я только что выбил

(function($) {

$.fn.randomize = function(childElem) {
  return this.each(function() {
      var $this = $(this);
      var elems = $this.children(childElem);

      elems.sort(function() { return (Math.round(Math.random())-0.5); });  

      $this.detach(childElem);  

      for(var i=0; i < elems.length; i++)
        $this.append(elems[i]);      

  });    
}
})(jQuery);

Вот Рабочая демонстрация . добавьте / edit к URL-адресу, чтобы увидеть код. Если вам нужны какие-либо подробности о том, как это работает, оставьте комментарий.

1
ответ дан 5 December 2019 в 07:12
поделиться

Компилятор C ++ изменяет имена ваших функций, чтобы включить информацию о параметрах и типах возврата. Это называется искажением имени. С другой стороны, компилятор C не искажает имена ваших функций.

Вы можете указать компилятору C ++ работать как компилятор C, используя extern "C" :

extern "C" __declspec(dllexport) bool TestFunc { return true; }

Для вызова функций из C # с использованием P / Invoke, ваши имена не должны изменяться. Следовательно, вы действительно можете экспортировать функции C в C #. Если вы хотите, чтобы функциональность была реализована на C ++, вы можете написать функцию C, которая просто вызывает функцию C ++, реализующую эту функциональность.

1
ответ дан 5 December 2019 в 07:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: