Pergunta

Sou um novato nos recursos de interop asp.net, então o que tenho aqui é uma DLL não gerenciada que eu preciso ligar do meu aplicativo ASP.NET MVC.

O nome da DLL é ctseialnumChecksum.dll. Posso chamar a DLL facilmente da ASP usando apenas as duas linhas abaixo e da minha resposta confiável. Escreva tudo está funcionando bem.

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

Sei que não é gerenciado porque, quando tento adicionar referência à DLL, não funciona. Eu tento seguir alguns tutoriais sobre interope e marechalling, mas até agora não consegui fazer o código funcionar.

Estou tentando envolver o objeto em outra classe estática e apenas deixar o restante do aplicativo chamar o código. Portanto, não sei por que é tão difícil fazê -lo funcionar no ASP.net ou que eu sou apenas um idiota Arggghhh ..

using System;
using System.Runtime.InteropServices;

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

    }
}

Perguntas:

  1. Como faço para escrever a aula? A maioria dos exemplos que encontrei não envolveu a classe, a parte .crc32api, E aqueles que fazem parece esquisito
  2. E que ferramenta posso usar para identificar que tipo de DLL é um arquivo específico, ou seja, C ++ não gerenciado, etc?
  3. Além disso, pretendo usar o jQuery para fazer o Ajax Chamada mais tarde, para que eu possa usar isso para validar meu formulário pré-submissão. Existe uma maneira melhor de lidar com isso?

O Dumpbin Call me devolveu isso, não sei por que não consigo ver o nome da função Validate 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

Atualizações:

Isso poderia ser devido ao nome de Mangling? Como é uma DLL C ++, pelo menos o que eu suspeito ser de qualquer maneira ...

Foi útil?

Solução

É um objeto COM. Eu posso dizer porque Server.CreateObject() no ASP é o caminho para instanciar um objeto COM. O DllRegisterServer e assim por diante na DLL, também são sinais reveladores.

Você quer Use o objeto COM do .NET. Você pode fazer isso gerando uma montagem de interop, no momento da compilação, executando a ferramenta tlbimp.exe. Basicamente, isso faz, automaticamente, o que você estava tentando fazer manualmente. Em seguida, compila seu código com o conjunto resultante.

Quanto à parte do jQuery - acho que você deve deixar isso para uma pergunta completamente separada.


PS: Eu não sei o que essa coisa do CRC32API faz, mas Existem implementações CRC32 disponíveis em C#. Você pode considerar reimplementar qualquer função nesse objeto COM, em código completo. Ele eliminaria a necessidade de tlbimp.exe no momento da compilação e o registro do objeto COM em tempo de execução.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top