Вызов метода DLL Дельфи из Кода C#

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

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# прежде, таким образом, я отчасти в недоумении.

5
задан Dan 4 February 2010 в 14:50
поделиться

2 ответа

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

Если вы иметь возможность изменить DLL, а затем сделать параметры типа PAnsiChar или PWideChar. (Судя по вашему объявлению C #, вам нужен PAnsiChar.) Это то, что DLL должна была использовать все время.

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

9
ответ дан 14 December 2019 в 01:07
поделиться

Попробуйте

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

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

0
ответ дан 14 December 2019 в 01:07
поделиться
Другие вопросы по тегам:

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