Я использую код Unmanaged Exports от Robert Giesecke, чтобы поместить некоторые методы из класса C# в DLL. На данный момент, код:Доступ к неуправляемому экспорту C# из приложения Delphi
[DllExport("add", CallingConvention = CallingConvention.StdCall)]
public static int TestExport(int left, int right)
{
return left + right;
}
который является таким же, как пример кода Giesecke, в стороне от CallingConvention
, но я также пробовал с Cdecl
).
Я пытаюсь получить доступ к этому методу в приложении Delphi VCL WinForms. Я следую this article, который говорит об экспорте из DLL Delphi и использует эту функцию в консольном приложении Delphi. Возможно, я ошибочно полагаю, что здесь слишком много общего.
Во всяком случае, есть два замечания:
1) Использование GExperts's PE Информация на этой DLL (экспортируемого из проекта C#) не перечисляет никакого экспорта. Увидев, что этот инструмент показывает точки входа для доступного экспорта, для меня это красный флаг # 1. Я не проверял Dependency Walker.
2) В статье в Delphi говорится о добавлении объявления функции, а затем показан пример. Моя IDE не любит этот синтаксис. Это может быть разница между приложениями и консолями.
const
TestExportsDLL = 'CS_CallbackTest_Class.dll';
type
TForm1 = class(TForm)
...
private
function AddIntegers(_a, _b: integer): integer; stdcall; external TestExportsDLL;
public
{ Public declarations }
end;
Я пробовал с несколькими различными вариантами этого. Предполагая, что использование RGiesecke.DllExport
- лучший способ сделать это, почему я не могу получить приложение Delphi для компиляции?
Вы объявили метод, но вам нужна отдельная функция. Переместите его за пределы класса. За исключением того, что вам нужно будет добавить 'name 'add'' в конец объявления. – TLama
Прочтите статью еще раз. Ни в коем случае это не означает, что вы можете экспортировать метод формы. Фактически, сам пример, который вы использовали, не имеет 'TForm1' перед его реализацией в любом из четырех примеров его кода. –
@Tlama ok, это вне класса' TForm1'. Составляет. Когда я пытаюсь запустить, я получаю «Приложение не смогло начать правильно (0xc000007b). Нажмите« ОК », чтобы закрыть приложение». Где «добавить»? @KenWhite Это было связано с тем, что статья ссылалась на консольное приложение. Поэтому, по предложению Тламы, я переместил его из реализации 'TForm1'. – ikathegreat