2010-02-04 30 views
5

Estoy intentando llamar a una función Delphi desde el código C# ASP.NET. La declaración de la función es el siguiente:Llamar a un método delphi DLL desde C# Code

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

Desde mi C# código que tengo este código:

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

Cada vez que llama a este método y lo almacenan como un objeto, aparece un P/Invoke de error . Nunca he llamado código no administrado de mi C# antes, así que estoy algo perdido.

+0

¿Cuál es el error de P/Invoke que está recibiendo? =) – Rob

+0

Debe marcar su función como "export" y "stdcall" como mínimo. Muestre su código de unidad donde se define esta función para exportar. –

+0

[Consulte estas preguntas frecuentes que escribí hace unos días en los foros de Tek-Tips (haga clic en Me)] (http://tek-tips.com/faqs.cfm?fid=7416) –

Respuesta

9

No se puede llamar que función DLL, ya que utiliza el tipo de datos string Delphi-específica, que no tiene equivalente en productos no Embarcadero. (Incluso si su código C# puede coincidir con la estructura del tipo de cadena de Delphi, también tendría que asignar la memoria mediante el administrador de la memoria de la DLL, que es casi seguro que no exporta.)

Si usted tiene la capacidad para cambiar la DLL, luego haz que los parámetros tengan el tipo PAnsiChar o PWideChar. (A partir de su declaración de C#, parece que desea PAnsiChar.) Eso es lo que el archivo DLL debería haber usado todo el tiempo.

Si no puede cambiar la DLL, escriba una DLL contenedora en Delphi o C++ Builder que use PAnsiChar o PWideChar y luego reenvíe esos parámetros a la DLL original de Delphi. O quejarse en voz alta al proveedor de DLL y solicitar una nueva versión que use tipos que sean más amigables con otros idiomas.

0

Trate

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

y utilizar Marshal.GetObjectForNativeVariant con el valor de retorno para obtener un objeto .NET.

Cuestiones relacionadas