代码之家  ›  专栏  ›  技术社区  ›  melaos

如何将此非托管代码从ASP传输到ASP.NET 2/MVC?

  •  0
  • melaos  · 技术社区  · 14 年前

    我是ASP.NET互操作功能的新手,所以这里我有一些非托管的DLL,我需要从我的ASP.NET MVC应用程序调用它们。

    dll名称为ctserialnumchecksum.dll。我可以很容易地从ASP调用DLL,只使用下面的两行和我的可信响应。写的东西都很好用。

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

    我知道它是非托管的,因为当我试图添加对dll的引用时,它不起作用。 我试着学习一些关于互操作和编组的教程,但到目前为止,我还不能让代码工作。

    我试图将对象包装成另一个静态类,让应用程序的其余部分调用代码。所以不知道为什么在ASP.NET中工作如此困难,或者我只是个白痴。

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

    问题:

    1. 我该怎么写这门课?我发现的大多数例子都不涉及类,.crc32api部分, and those that do seems freaky hard
    2. 我能用什么工具来识别 特定文件的DLL类型 是非托管C++等吗?
    3. 另外,我打算使用jquery 稍后执行Ajax调用,这样我可以使用 以验证我的表单预提交。 有更好的办法吗 这个?

    dumpbin调用返回了这个,不知道为什么我看不到里面的validate函数名:

    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
    

    更新:

    这可能是因为名字弄错了吗?因为它是一个C++ DLL,至少我怀疑它是无论如何…

    1 回复  |  直到 14 年前
        1
  •  3
  •   Cheeso    14 年前

    它是一个COM对象。我知道是因为 Server.CreateObject() 在ASP中是实例化COM对象的方法。DLL中的dllregisterserver等也是指示符号。

    你想要的 use the COM object from .NET. 可以通过在编译时通过运行 the tlbimp.exe tool . 基本上,这是自动的,你想手动做的。然后用生成的程序集编译代码。

    至于jquery部分,我认为您应该把它留给一个完全独立的问题。


    PS:我不知道CRC32API的作用,但是 there are CRC32 implementations available in C# . 您可以考虑在所有托管代码中重新实现该COM对象中的任何函数。这样就不需要在编译时使用tlbimp.exe,也不需要在运行时注册COM对象。