Вызов метода DLL Delphi из кода C # - PullRequest
5 голосов
/ 04 февраля 2010

Я пытаюсь вызвать функцию Delphi из кода C # ASP.NET. Объявление функции выглядит так:

function SomeFunction(const someString, SomeOtherString: string): OleVariant;

Из моего кода C # у меня есть этот код:

[DLLImport(MyDLL.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
public static extern object SomeFunction(string someString, string SomeOtherString);

Каждый раз, когда я вызываю этот метод и сохраняю его как объект, я получаю ошибку P / Invoke. Я никогда раньше не вызывал неуправляемый код из моего C #, поэтому я немного растерялся.

Ответы [ 2 ]

9 голосов
/ 04 февраля 2010

Вы не можете вызвать эту функцию DLL, потому что она использует специфичный для Delphi тип данных string, который не имеет эквивалента в продуктах не-Embarcadero. (Даже если ваш код C # может соответствовать структуре строкового типа Delphi, вам также необходимо выделить память с помощью диспетчера памяти DLL, который он почти наверняка не экспортирует.)

Если у вас есть возможность изменить DLL, тогда параметры должны иметь тип PAnsiChar или PWideChar. (Из вашей декларации C # похоже, что вы хотите PAnsiChar.) Это то, что DLL должна была использовать все время.

Если вы не можете изменить DLL, то напишите DLL-оболочку в Delphi или C ++ Builder, которая использует PAnsiChar или PWideChar, а затем перенаправьте эти параметры в исходную DLL-библиотеку Delphi. Или громко пожаловаться поставщику DLL и запросить новую версию, которая использует типы, более дружественные для других языков.

0 голосов
/ 04 февраля 2010

Попробуйте

[DLLImport(MyDLL.dll, CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
public static extern IntPtr SomeFunction(string someString, string SomeOtherString);

и используйте Marshal.GetObjectForNativeVariant с возвращаемым значением для получения объекта .NET.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...