0

LogParser.DLL アセンブリを使用したいので、通常のコンソール アプリケーションでテストしたところ、機能し、それをサーバーに入れ、テストのために win 2003 に送信しました (データベースなどのサービスをインストールするための空き容量がありません)。 .. eventViewer ログで常に FileNotFoundException エラーを返しました...

スタック トレースを使用して実際に何が起こっているかを確認しようとしましたが、DLL がまったくインポートされないことがわかりました。Google で検索した後、この Web サイトで答えを見つけました。アセンブリ コマンド、私が書いた場合は tblimp "ファイル名" /out "新しいファイル" でした

私は自分のアセンブリを作成しました。それは.net 4だったので、古いVSに行き、.net 2.0.x互換のDLLを提供するために同じことをしました。それを使用して動作しましたが...

新しいエラーが表示されました:

エラー メッセージ: CLSID {8CFEBA94-3FC2-45CA-B9A5-9EDACF704F66} を持つコンポーネントの COM クラス ファクトリの取得は、次のエラーが原因で失敗しました: 80040154。

            ILogRecordset rs = null;
            try
            {
                ((DebugLogger) _logProviderDebugMode).Log("T1-2", "Debug-EventReaderClass",
                                                          EventLogEntryType.Information);
                LogQueryClass qry = new LogQueryClass();
                COMEventLogInputContextClass eventLogFormat = new COMEventLogInputContextClassClass();
                ((DebugLogger) _logProviderDebugMode).Log("T1-3", "Debug-EventReaderClass",
                                                          EventLogEntryType.Information);
                string query = "select * from security WHERE TimeGenerated >= '" + startDate +
                               "' and TimeGenerated <'" + endDate +
                               "' and (eventid=560 or eventid=540)";
                rs = qry.Execute(query, eventLogFormat);
                ((DebugLogger) _logProviderDebugMode).Log("T1-4", "Debug-EventReaderClass",
                                                          EventLogEntryType.Information);
                for (; !rs.atEnd(); rs.moveNext())
                {
                        //Processes
                }

            }
            catch(Exception ex)
            {
                ((DebugLogger)_logProviderDebugMode).Log(
                        "T1-5\nError Msg: " + ex.Message + "\nStackTrace: " + ex.StackTrace
                        , "Debug-EventReaderClass",
                        EventLogEntryType.Error);
            }
            finally
            {
                ((DebugLogger)_logProviderDebugMode).Log("T1-6", "Debug-EventReaderClass",
                                                          EventLogEntryType.Information);
                if (rs != null)
                    rs.close();
            }

例外をキャッチして、データがインポートされているかどうかを確認しようとしましたが、「最終的に」ブロックに if(rs!=null) がなければ、rs は何も返さないようです。それは、rs が null であることを意味するエラー自体です。

イベントの種類: 情報 イベント ソース: EventLoggerService イベント カテゴリ: なし イベント ID: 0 日付: 2012 年 8 月 5 日 時刻: 2:47:20 AM ユーザー: 該当なし コンピューター: HF-SERVER-PC 説明: Debug-EventReaderClass: T1 -2

クラス変数情報:

_logProvider: FileEventReaderService.Services.Logger.EventLogger _logProviderDebugMode: FileEventReaderService.Services.Logger.DebugLogger _licenceState: Ok _dataBase: deadManN _interval: 5 _timeGap: 1 _previousReadTime: 8/5/2012 2:40:19 AM _lastReadTime: 8/5/2012 2:46:20 AM _parserLock: System.Object _subtleTime: TimerLib.SubtleTime _parserService: FileEventReaderService.Services.Util.ParserService5 _connectionStringBuilder: FileEventReaderService.Services.Util.ConnectionStringBuilder _lastTime: 18 _minutes: 18

詳細については、ヘルプとサポート センター ( http://go.microsoft.com/fwlink/events.asp ) を参照してください。

上記のログは、エラーの前に行った最後のログであり、「catch」ブロックに記録されたログを示しているため、エラーは次のようになります。

        LogQueryClass qry = new LogQueryClass();
        COMEventLogInputContextClass eventLogFormat = new COMEventLogInputContextClassClass();

だから私は再びエラーメッセージの検索を開始し、一人では処理できなかったものをいくつか見つけました。

たとえば、DLL manulay を登録する必要がある、または dllregisterservice を使用する必要がある、またはアプリケーションを 86X CPU タイプ用にのみコンパイルするように設定する必要があると言う人がいますが、私はこれをしたくありません... シングルユーザー用にこれを書いていないからです既知のハードウェアとソフトウェアで...

今、誰も助けることができますか?アプリケーションのセットアップ中にdllを登録するか、問題について役立つ可能性のある何か他のものはありますか?「Interop.MSUtil.dll」ライブラリの

そして、助けてください、それは私にとって非常に重要なことです。それでも、論理的なバグをコンパイルするのではなく、論理的なバグをチェックするだけで数か月が必要です :|

4

2 に答える 2

1

私はサービス、アプリケーションを作成しようとしていましたが、その一部を作成しましたが、問題で話し合ったバグとコメントに陥りました...

時間が経ってしまったので、起こったことすべてをお伝えすることはできませんが、私をここから救った答えをお伝えします...


まず最初に、他のアプリケーションではなく、dll と自分のアプリケーションを処理する必要がありました。たとえば、非表示のコマンドを使用してログ パーサーを実行せず、Diagnostig.Process を介してクエリを引数として使用する必要がありました...

だから私はdllを取ります、

dll だけが、私がテスト用に提供する winアプリケーションで動作しました。O/S とその中にありました。証明書の理由による可能性があります。しかし、他のサーバー OS では動作しませんでした。IO : FileNotFoundExceptionがあることを示すログが表示されるので、try catch ブロックを配置してからスタック トレースを出力すると、アセンブリが見つからないという例外が表示されました。 dll のようなものなので、ステップ 1 :

  • 必要な dll を確認してください。たとえば、古い OS でのサポートを強化するために .net 2.x ベースの .net バージョンが必要でしたが、VS 2010 では .net 4.x ベースの DLL が提供されたので、Visual Studio 2005 を参照します。プログラムファイルで
  • スタート メニューのすべてのプログラム メニューから Visual Studio フォルダーを開き、「visual studio tools」フォルダーに移動し、最後に「visual studio コマンド プロンプト」を実行します。
  • 次に、logparser.dll ファイルを c:\temp\ のような到達可能な場所に置きます。
  • 次のコマンドを実行します。 tlbimp "c:\temp\logparser.dll" /out:"c:\temp\Interop.MSUtil.dll"
  • 「Interop.MSUtil.dll」はアプリケーションが探しているアセンブリ名ですが、logparser.dll の名前を直接変更することはできません。
  • これをプロジェクトに入れ、すべての参照を logparser.dll から Interop.MSUtil.dll に切り替えます (名前空間が異なるためです)。

ここまでいくつかのエラーを修正しましたが、サービスの動作がうまくいかず、ログ パーサーの実行中に新しいエラーが発生し、クラス インスタンスが Null を返すようになりました。エラーは次のとおりです。

エラー メッセージ: CLSID {8CFEBA94-3FC2-45CA-B9A5-9EDACF704F66} を持つコンポーネントの COM クラス ファクトリの取得は、次のエラーが原因で失敗しました: 80040154. StackTrace: at FileEventReaderService.EventReader.ReadEventsAndStoreInDatabase(String startDate, String endDate)

このステップでは何も起こらないかもしれませんが、エラーメッセージに変更があったので、ここに入れました

多くのユーザー向けにアプリケーションをパッケージ化したかったので、すべてのユーザーにコマンドを実行するように指示したわけではなかったので、さらに検索しました。dll の登録について言う人もいますが、logparser.dll をグローバル アセンブリ キャッチ フォルダーに入れることはできません。また、後で、私たちが行う登録がGACにアセンブリを配置することとは異なることを知りました...

また、最初に dll を GAC に配置する必要があるかどうかもわかります。logparser を配置できないため、エクスポートされますが、Introp.MSUtil.dll も、GAC フォルダーに Interop.MSUtil.dll を配置するためのエラーが返されました。エラーは、アセンブリの命名に関するものでした。 、そしていくつかの検索の後、エラーが別のものであることがわかり、アセンブリがペアキーで署名されていない場合に発生します...

cmdを使用してペアキーを作成できます。インストールする各OSにはランダムキーが生成されます。また、特別な証明書の問題のためにこれらのキーをエクスポートおよびインポートできます。当然、これらのコマンドにはネットワークエンジニアリングユーザーがいますが、ソフトウェアもここで使用します... だからステップ2

8007007E / 8007007F エラーが発生した場合は、このセクションをお読みください...これらは当然、アセンブリの登録が原因であり、わかりませんが、DLL が署名されている共有キーも、これらを実行する前に実行できるもう 1 つのことです。 regsvr32 "[dll file address]" は dll を登録します。アプリケーションが dll を直接使用および検索しない場合は、たとえばプロジェクトに登録する前に任意のフォルダーに配置できますが、logparser.dll ではなく Introp.MSUtil.dll を指します。登録にも必要です。次に、logparser.dll で regsvr32 コマンドを実行します (このコマンドはテスト用であり、アプリケーションのセットアップとデプロイには使用しません。/u スイッチを使用して dll の登録を解除することもできます)。さらなるテスト)

  • 次のコマンドでCMDを使用してペアキーファイルを作成します: sn -k [file name]あなたがいるアドレスにファイルを作成します
  • 次にもう一度ステップ 1 に進みますが、古いコマンドの代わりにこの新しいコマンドを使用して、キー ペアを組み合わせて dll を生成します。tlbimp "[logparser.dll address]" /out:"[address]\Interop.MSUtil.dll" /pr imary /keyfile:"[pair key file address]"
  • 以前に作成したものではなく、新しい署名付き dll を使用するようになりました ... ( Interop.MSUtil.dll )

エラーもありました... GAC (Global Assembly Catch) だけでは動作しないことがわかりました。すべてのバグを修正した後、できることに気付きましたが、GAC に Interop.MSUtil.dll を配置する必要はありません。私のセットアップのフォルダー...しかし、この登録事項、regsvr32は問題でしたか? ああ、そうでした。これはアセンブリを GAC に入れるのと同じだと聞きましたが、正しくありませんでした。グローバル アセンブリとしての dll の登録は、regsvr32 を使用して登録するのとは異なりました...自分の dll がすでに登録されています。名前空間またはその中のメイン アセンブリが必要だと思うので、次の手順を実行して、登録されているかどうかを確認できます。

  • スタートメニューに行き、「実行」ツールを開きます
  • dcomcnfgと入力し、Enter キーを押してコンポーネント サービスツールを開きます。
  • 次のディレクトリに移動します: Console Root->Component Services->Computers->My Computer->DCOM Config
  • たとえば、ログ parser.dll が登録されているかどうかを確認するには、「Interop.Msutil」や「MSUtil」などの名前を探します。
  • 存在する場合、dll は登録されています。そうでない場合は、登録されていません。

わかりました、件名に戻りましょう。dll を登録する必要があります。覚えていないエラーが発生します... コマンドを使用して logparser.dll を登録すると、クラスがうまく機能せず、null が返されます。あなたのセットアップは、次のことを行う必要があるので、ステップ3

  • logparser.dll アセンブリ (セットアップではアセンブリではなくファイルとして認識されます) を、セットアップ プロジェクトのアプリケーション フォルダーのように、到達可能なフォルダーに配置します...
  • ソリューション エクスプローラー内のファイルを右クリックし、 [プロパティ]を選択します。
  • 登録セクションをクリックし、ドロップダウンボタンをクリックして、利用可能なすべてのオプションを表示します...
  • リストからvsdrfCOMSelfRegを選択します。このようなオプションは、作成したアセンブリ(Introp.MSUtil.dll)のようなアセンブリには提供されていないため、登録できないことに注意してください。そのdllをregsvr32に登録することもできません...他のオプションテスト時にdllを登録しません

これがお役に立てば幸いです:)

PS: logparser.dll と Interop.MSUtil.dll はプロジェクトごとに自動的に検出されないことに注意してください。セットアップと MSI プロジェクトに手動で追加する必要があります...説明したように、両方の dll も必要です。

これがうまくいくことを願っています...

@Andrii Kalytiiukに感謝します
Hassan Faghihiによる尊敬

于 2012-08-12T04:52:12.023 に答える
1

これは古い質問ですが、このエラーに遭遇し、受け入れられた回答を解析するのがやや難しいことがわかりました。

最終的に、LogParser がインストールされ LogParser.dllコードが実行されているマシンに登録されていることを確認する必要がありました。そうしないと、元の質問に示されているエラーが表示されます。

私の経験から、Interop.MSUtilは代わりではなくLogParser.dllファシリテーターです。

nugetInterop.MSUtilを介して利用できるようになったことにも言及する価値がありますが、インストール後、ソリューションのフォルダーに DLL への参照を手動で追加し、参照を右クリックして に設定する必要があります。packagesEmbed Interop Typesfalse

于 2018-04-06T15:38:20.093 に答える