0

私はASP.net相互運用機能の初心者なので、ここにあるのは、asp.netmvcアプリから呼び出す必要のあるアンマネージdllです。

dll名はCTSerialNumChecksum.dllです。以下の2行だけを使用して、信頼できる応答から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 に答える