2011-05-30 37 views
6

Compuse .Net 3.5 dll con un único método, que debe ser llamado por Delphi .exe. Desafortunadamente no funciona.Llamar a C# dll desde Delphi

Los pasos: 1. Crear C# 3.5 DLL con el código:

public class MyDllClass 
{ 
    public static int MyDllMethod(int i) 
    { 
     MessageBox.Show("The number is " + i.ToString()); 
    } 
} 
  1. Ir a la Asamblea Propiedades -> Información de ensamblado y comprobado el "hacer el montaje COM-Visible"
  2. usados RegAsm.exe para registrar mi dll

Esto arroja una excepción de Delphi que indica que no puede conectar el dll. ¿Cuáles son los pasos necesarios para habilitar el uso de dll administrado C# del código no administrado?

¿Alguien está familiarizado con un buen ejemplo sobre el tema?

Gracias

+0

¿Cómo funciona exactamente estás tratando de conectar el objeto? ¿Lo está importando usando el asistente (que genera una unidad contenedora) o está cargando la biblioteca directamente? –

+0

Encontré la solución para estos problemas - vea la respuesta a continuación –

Respuesta

7

Después de una investigación masiva encontré la solución: se trata de parámetros de registro. El flag/codebase debe agregarse al comando regasm.

Muchos mensajes que sugieren usar Guid y otros atributos COM en el objeto expuesto Com C, obtuve la funcionalidad COM utilizando el atributo ComVisible (verdadero) y el comando regasm/tlb/codebse.

El código:

[Guid("7DEE7A79-C1C6-41E0-9989-582D97E0D9F2")] 
[ComVisible(true)] 
public class ServicesTester 
{ 
    public ServicesTester() 
    { 
    } 

    //[ComVisible(true)] 
    public void TestMethod() 
    { 
     MessageBox.Show("You are in TestMEthod Function"); 
    } 
} 

y como he mencionado Solía ​​regasm.exe/TLB/código base para registrarlo

-7

Usted debe aprender más acerca de las herramientas que utiliza. Intenta conectar dos mundos bastante diferentes (.Net, Delphi) usando otra tecnología más (no demasiado simple): COM. Su pregunta muestra claramente que no tiene una buena comprensión de COM y probablemente no de .Net. No hay un ejemplo simple que resuelva exactamente su caso de uso. Tienes que aprender COM, que aprender a hacer que el código .Net esté disponible para COM y luego debes aprender a llamar objetos COM desde Delphi. Ese ES el atajo. ¡No hay más atajos disponibles!

+13

No creo que sea productivo publicar respuestas didácticas, como una bofetada (simbólica) en su mano por parte de su maestra de primaria porque ha sido traviesa. No veo nada malo con la pregunta original. Se le permitió cometer errores, cometió errores, cometí errores, aprendí de ellos y sigo adelante. – costa

2

Una cosa que podría ser un problema si hizo su ensamblaje x64 o AnyCPU. Como Delphi es de 32 bits (x86), necesita hacer su ensamblaje x86 o asegurarse de que regasm.exe lo registre también en el registro de 32 bits. Lo haces utilizando la versión x86 de regasm.exe.

29

Es posible que tenga más suerte saltarse la parte COM mediante el uso de mi project template for unmanaged exports

class MyDllClass 
{ 
    [DllExport] 
    static int MyDllMethod(int i) 
    { 
     MessageBox.Show("The number is " + i.ToString()); 
     return i + 2; 
    } 
} 

En Delphi, que habría que importar este modo:

function MyDllMethod(i : Integer) : Integer; stdcall; extern 'YourAssembly.dll'; 

tuviera que votar tu pregunta abajo, aunque. Por ni siquiera preocuparse tanto por proporcionar código que compilaría. (su método C# no devuelve un valor, pero espera como int)

+0

Hola Robert, no puedo ver la plantilla después de colocar el archivo zip en el lugar correcto (Mis documentos \ Visual Studio 20 ** \ Templates \ ProjectTemplates). Estoy usando VS2010, ¿estás familiarizado con esto? –

+0

¿Descargó el UnmanagedExportLibrary.zip, correcto? La página con las muestras tiene un enlace a DllExport.zip, que es solo la tarea de compilación y algunas bibliotecas, no la plantilla. Si usó la plantilla: vaya a Herramientas/Opciones/Proyectos y Soluciones. Allí encontrará la propiedad "Ubicación de plantillas de proyectos de usuario". Esta es la carpeta en la que VS buscará plantillas de proyectos. –

Cuestiones relacionadas