0

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

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

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

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

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

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

4

1 回答 1

3

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

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

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


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

于 2010-04-07T21:10:05.467 回答