Pregunta

Soy un novato en ASP.NET INETEROP funciones, así que lo que tengo aquí es una DLL no administrada que necesito llamar desde mi aplicación ASP.NET MVC.

El nombre de DLL es ctSerialnumChecksum.dll. Puedo llamar fácilmente a la DLL desde ASP usando solo esas dos líneas a continuación y de mi confiable respuesta. escribir todo funciona bien.

set CheckSumObj = Server.CreateObject("CTSerialNumChecksum.CRC32API")
validSno        = CheckSumObj.ValidateSerialNumber(no)

Sé que no está administrado porque cuando trato de agregar referencia al DLL no funciona. Intento seguir algunos tutoriales sobre Interopp y Marshalling, pero hasta ahora no pude hacer que el código funcionara.

Estoy tratando de envolver el objeto en otra clase estática y dejar que el resto de la aplicación llame al código. Así que no estoy seguro de por qué es tan difícil hacer que funcione en ASP.NET o que solo soy un idiota Arggghhh ..

using System;
using System.Runtime.InteropServices;

namespace OnlineRegisteration.Models
{
    public static class SerialNumberChecksum
    {
        [DllImport("CTSerialNumChecksum")]
        public static extern int ValidateSerialNumber(string serialNo);

    }
}

Preguntas:

  1. ¿Cómo escribo la clase? La mayoría del ejemplo que encontré no involucró a la clase, la parte .CRC32API, Y los que lo hacen parecen extraños
  2. ¿Y qué herramienta puedo usar para identificar qué tipo de DLL es un archivo en particular, es decir, C ++ no administrado, etc.?
  3. También tengo la intención de usar jQuery para hacer una llamada AJAX más tarde para poder usar esto para validar mi formulario previo. ¿Hay una mejor manera de manejar esto?

Dumpbin Call me devolvió esto, no estoy seguro de por qué no puedo ver el nombre de la función Validar dentro:

File Type: DLL

  Section contains the following exports for CTSerialNumChecksum.DLL

    00000000 characteristics
    3D75BB53 time date stamp Wed Sep 04 15:50:43 2002
        0.00 version
           1 ordinal base
           4 number of functions
           4 number of names

    ordinal hint RVA      name

          1    0 000015CB DllCanUnloadNow
          2    1 000015D7 DllGetClassObject
          3    2 000015F1 DllRegisterServer
          4    3 00001601 DllUnregisterServer

  Summary

        5000 .data
        2000 .rdata
        2000 .reloc
        2000 .rsrc
        8000 .text

Actualizaciones:

¿Podría ser esto por nombre Mangling? Como es una DLL C ++, al menos lo que sospecho que es de todos modos ...

¿Fue útil?

Solución

Es un objeto COM. Puedo decirlo porque Server.CreateObject() En ASP es la forma de instanciar un objeto COM. El DllRregisterserver y así sucesivamente en la DLL también son signos reveladores.

Tú quieres Use el objeto COM de .NET. Puede hacerlo generando un ensamblaje interops, en el momento de la compilación, ejecutando la herramienta tlbimp.exe. Básicamente, esto sí, automáticamente, lo que estaba tratando de hacer manualmente. Luego compile su código con el ensamblaje resultante.

En cuanto a la parte jQuery, creo que debes dejar eso a una pregunta completamente separada.


PD: No sé qué hace esa cosa de CRC32API, pero Hay implementaciones CRC32 disponibles en C#. Puede considerar la reimplementación de cualquier función que esté en ese objeto COM, en el código totalmente administrado. Eliminaría la necesidad de tlbimp.exe en el momento de la compilación y el registro del objeto COM en tiempo de ejecución.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top