Frage

Ich bin ein Neuling in den ASP.net-Interop-Funktionen, also habe ich hier eine nicht verwaltete DLL, die ich von meiner Asp.net-MVC-App aus aufrufen muss.

Der DLL-Name ist CTSerialNumChecksum.dll.Ich kann die DLL ganz einfach von Asp aus aufrufen, indem ich nur die beiden folgenden Zeilen und meine vertrauenswürdige Antwort verwende.schreibe, alles funktioniert gut.

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

Ich weiß, dass es nicht verwaltet wird, denn wenn ich versuche, einen Verweis auf die DLL hinzuzufügen, funktioniert es nicht.Ich versuche, einige Tutorials zu Interop und Marshalling zu befolgen, aber bisher konnte ich den Code nicht zum Laufen bringen.

Ich versuche, das Objekt in eine andere statische Klasse einzuschließen und den Rest der App einfach den Code aufrufen zu lassen.Ich bin mir also nicht sicher, warum es so schwierig ist, es in asp.net zum Laufen zu bringen, oder dass ich nur ein Idiot bin, arggghhh.

using System;
using System.Runtime.InteropServices;

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

    }
}

Fragen:

  1. Wie schreibe ich die Klasse?Die meisten Beispiele, die ich gefunden habe, betrafen nicht die Klasse, den .CRC32API-Teil, und diejenigen, die es tun, scheinen unglaublich schwer zu sein
  2. Und welches Tool kann ich verwenden, um Welcher DLL-Typ eine bestimmte Datei ist ist, d.h.nicht verwaltetes C++ usw.?
  3. Außerdem beabsichtige ich, jquery zu verwenden, um Machen Sie später einen Ajax-Anruf, damit ich dies verwenden kann um mein Formular vor dem Absenden zu validieren.Gibt es einen besseren Weg, um das?

Der Dumpbin-Aufruf hat mir Folgendes zurückgegeben, ich bin mir nicht sicher, warum ich den Validierungsfunktionsnamen darin nicht sehen kann:

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

Aktualisierung:

Könnte das an einer Namensverfälschung liegen?Da es sich um eine C++-DLL handelt, vermute ich zumindest, dass es sich um eine C++-DLL handelt ...

War es hilfreich?

Lösung

Es ist ein COM-Objekt.Ich kann es sagen, weil Server.CreateObject() in ASP ist die Möglichkeit, ein COM-Objekt zu instanziieren.Der DllRegisterServer usw. in der DLL sind ebenfalls verräterische Anzeichen.

Sie wollen Verwenden Sie das COM-Objekt von .NET. Sie können dies tun, indem Sie zur Kompilierungszeit durch Ausführen eine Interop-Assembly generieren das Tool tlbimp.exe.Im Grunde geschieht automatisch das, was Sie manuell zu tun versucht haben.Kompilieren Sie dann Ihren Code mit der resultierenden Assembly.

Was den jQuery-Teil betrifft – ich denke, Sie sollten das einer völlig separaten Frage überlassen.


PS:Ich weiß nicht, was dieses CRC32API-Ding macht, aber Es sind CRC32-Implementierungen in C# verfügbar..Sie könnten erwägen, die in diesem COM-Objekt enthaltene Funktion in vollständig verwaltetem Code erneut zu implementieren.Dadurch würde die Notwendigkeit von tlbimp.exe zur Kompilierungszeit und die Registrierung des COM-Objekts zur Laufzeit entfallen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top