Экспорт функций от C++ dll к C# P/Invoke

Шаг за шагом

Выделите входные данные

Данные ... Из таблицы / диапазона ... не проверять [] В моей таблице есть заголовки

Добавить столбец. .. Пользовательский столбец ... используя имя столбца Пользовательский, с формулой

Text.Length([Column1])

Добавить столбец ... Пользовательский столбец ... используя имя столбца Пользовательский 1, с формулой

if [Custom]=6 then [Column1] else null
[118 ] Нажмите на столбец Custom.1, щелкните правой кнопкой мыши и заполните ... вниз ...

Используйте стрелку рядом с пользовательским столбцом и снимите флажок [] 6, оставив только [x] 11

Щелкните столбец Пользовательский, щелкните правой кнопкой мыши и выберите удалить столбцы

файл ... закрыть и загрузить [ 1111]

Код производства:

let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Added Custom" = Table.AddColumn(Source, "Custom", each Text.Length([Column1])),
#"Added Custom1" = Table.AddColumn(#"Added Custom", "Custom.1", each if [Custom]=6 then [Column1] else null),
#"Filled Down" = Table.FillDown(#"Added Custom1",{"Custom.1"}),
#"Filtered Rows" = Table.SelectRows(#"Filled Down", each ([Custom] =11)),
#"Removed Columns" = Table.RemoveColumns(#"Filtered Rows",{"Custom"})
in #"Removed Columns"
8
задан Symmetric 24 February 2009 в 01:25
поделиться

5 ответов

Вы используете .def файл в своем dll проекте экспортировать те функции? Если так, удалите его и попробуйте еще раз. Это - просто предположение, потому что похоже, что Ваш экспорт не то, чем они должны быть, когда Вы делаете экстерна "C" declspec (dllexports).

Я испытал это с простым C++ dll использование

extern "C" __declspec(dllexport) BOOL Install();
extern "C" __declspec(dllexport) BOOL PPPConnect();

и простое приложение C# с помощью объявлений PInvoke и это хорошо работало.

Когда я сделал dumpbin/exports на dll, я видел:

Дамп файла PPPManager.dll

Тип файла: DLL

Раздел содержит следующий экспорт для PPPManager.dll

00000000 characteristics
499F6C2D time date stamp Fri Feb 20 20:51:25 2009
    0.00 version
       1 ordinal base
       2 number of functions
       2 number of names

ordinal hint RVA      name

      1    0 000110CD Install = @ILT+200(_Install)
      2    1 00011069 PPPConnect = @ILT+100(_PPPConnect)

Заметьте, что экспортируемые имена отличаются в моем случае.

8
ответ дан 5 December 2019 в 17:41
поделиться

Это могло быть что-то столь же простое как PPPConnect сбой способом, который неправильно истолкован ОС. Попытайтесь реализовать обоих Install и PPPConnect как без операций в секунду (просто сделали, чтобы они возвратились TRUE не делая ничего больше), и видят, сохраняется ли ошибка. Если так, попытайтесь подкачать порядок, в котором они экспортируются (все еще как без операций в секунду) и видят, связывается ли проблема с упорядочиванием (вряд ли) или с чем-то еще.

Можно также использовать графический инструмент depends подтвердить, что экспортирует таблицу DLL, похоже, но я сомневаюсь, что проблема возникает из тех четвертей.

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

используйте зависимость Уокер и откройте Ваш DLL для проверки, какие методы доступны

0
ответ дан 5 December 2019 в 17:41
поделиться

Согласно Вашей Установке описания и PPPConnect отличается только по именам. Я предполагаю, что Вы просто используете старую .dll версию со своим приложением C#. Тот без PPPConnect определяется.

Объявления выглядят правильными (насколько я могу судить без источников).

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

Большая информация, но как Вы упоминаете, все в порядке здесь. Попытайтесь установить Средства отладки для Windows и выполнения:

kd -z \path\to\PPPManager.dll -y \path\to\PPPManager.pdb -c "x pppmodule!*"

получить лучший дамп таблицы символов; это - слепой выстрел также, но Вы могли также попробовать:

extern "C" 
{
    __declspec(dllexport) BOOL Install();
    __declspec(dllexport) BOOL PPPConnect();
};

в случае, если __ declspec делает что-то странное.

0
ответ дан 5 December 2019 в 17:41
поделиться
Другие вопросы по тегам:

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