如何将这个非托管代码从asp转移到asp.net 2 / mvc?

时间:2010-04-07 06:38:20

标签: c# interop marshalling com-interop rcw

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

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部分,and those that do seems freaky hard
  2. 我可以使用什么工具来识别 什么类型的DLL特定文件 是,即非托管c ++等?
  3. 我还打算使用jquery 之后做ajax调用,所以我可以使用它 验证我的表格提交前。 有没有更好的方法来处理 此?
  4. 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,至少我怀疑它是无论如何......

1 个答案:

答案 0 :(得分:3)

它是一个COM对象。我可以告诉你,因为ASP中的Server.CreateObject()是实例化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对象。