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

dll 名称为 CTSerialNumChecksum.dll。我可以使用下面的这两行和我可靠的响应轻松地从 asp 调用 dll。写一切工作正常。

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

我知道它是非托管的,因为当我尝试添加对 dll 的引用时它不起作用。我尝试遵循一些有关互操作和编组的教程,但到目前为止我无法使代码正常工作。

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

using System;
using System.Runtime.InteropServices;

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

    }
}

问题:

  1. 我该如何写课程?我发现的大多数例子都不涉及类,.CRC32API 部分, 而那些这样做的人似乎很难
  2. 我可以使用哪种工具来识别哪种类型的dll是特定文件,即非托管c++等?
  3. 另外,我打算使用jQuery稍后进行Ajax调用,以便我可以使用它来验证我的表格预提交。有更好的方法来处理这一点吗?

Dumpbin 调用返回给我这个,不知道为什么我看不到里面的验证函数名称:

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,至少我怀疑它是......

有帮助吗?

解决方案

它是一个 COM 对象。我可以说因为 Server.CreateObject() 在ASP中是实例化COM对象的方式。DLL中的DllRegisterServer等也是明显的标志。

你想要 使用.NET 中的 COM 对象。 您可以通过在编译时生成互操作程序集来完成此操作,方法是运行 tlbimp.exe 工具. 。基本上,这会自动完成您尝试手动执行的操作。然后使用生成的程序集编译代码。

至于 jQuery 部分 - 我认为你应该把它留给一个完全独立的问题。


附:我不知道 CRC32API 的作用是什么,但是 C# 中有可用的 CRC32 实现. 。您可能会考虑在全托管代码中重新实现该 COM 对象中的任何功能。它将消除编译时对 tlbimp.exe 的需要,以及运行时 COM 对象的注册。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top