2

COM 相互運用機能を介してアセンブリを使用しているときに、.NET で構成設定を読み込む際に問題が発生しました。

背景: 一部のサーバーでは、さまざまなタスクを実行する多くの VBScript スクリプトを使用しています。通常、電子メールの送信などの機能を実行します。これを容易にするために、VBScript から作成可能な COM オブジェクトを作成したいと考えました。これは、これらの一般的な機能セットのいくつかに役立ちます。

したがって、相互運用機能を介していくつかの COM インターフェイスを公開する .NET アセンブリを作成しようとしています。私はなんとかこれを機能させましたが、構成設定の一部を (ハードコードではなく) 外部化したいと考えました。

この行を使用して構成を取得しています。

ConfigurationManager.OpenExeConfiguration(this.GetType().Assembly.Location)

これは、テスト プロジェクトからテストし、.NET プロジェクトとして参照している場合は問題なく動作するように見えますが、COM オブジェクトとしてテストすると失敗します。

失敗の理由は、構成ファイルにカスタム セクションがあるためです。

<section name="CustomSection" type="COMObjects.CustomSection, COMObject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=e9e8071519bd2f04"/>

ただし、カスタム セクションを読み込もうとすると、アセンブリ "COMObject" の読み込みに失敗します。私には、アセンブリを GAC に配置していない (また、配置したくない) ため、これは理にかなっています。

このようなシナリオで、構成ファイルで参照されているアセンブリを .NET フレームワークが見つけやすくする方法はありますか?

以下は、バインディングの fuslogvw.exe 出力です。

操作に失敗しました。
バインド結果: hr = 0x80070002。システムは、指定されたファイルを見つけることができません。

アセンブリ マネージャーの読み込み元: C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll
実行可能ファイル C:\Windows\SysWOW64\cscript.exe の下で実行
--- 詳細なエラー ログが続きます。

=== プレバインド状態情報 ===
ログ: ユーザー = My-MACHINE\ME
ログ: DisplayName = COMObject、バージョン = 1.0.0.0、カルチャ = ニュートラル、PublicKeyToken = e9e8071519bd2f03
 (完全指定)
ログ: Appbase = file:///C:/Windows/SysWOW64/
ログ: 初期 PrivatePath = NULL
ログ: 動的ベース = NULL
ログ: キャッシュ ベース = NULL
ログ: AppName = NULL
アセンブリの呼び出し: System.Configuration、Version=2.0.0.0、Culture=neutral、PublicKeyToken=b03f5f7f11d50a3a。

ログ: このバインドはデフォルトのロード コンテキストで開始されます。
ログ: アプリケーション構成ファイルが見つかりません。
ログ: C:\Windows\Microsoft.NET\Framework\v2.0.50727\config\machine.config のマシン構成ファイルを使用しています。
ログ: 以前にも同じバインドが見られ、hr = 0x80070002 で失敗しました。
ERR: 事前ダウンロードチェック中に回復不可能なエラーが発生しました (hr = 0x80070002)。

ありがとう

4

1 に答える 1

3

実行可能ファイル C:\Windows\SysWOW64\cscript.exe の下で実行

このコードは、32 ビット バージョンのスクリプト インタープリターによってアクティブ化されます。CLR がアセンブリを検索する場所は、スタートアップ EXE の場所の影響を受けます。AppBasecscript.exe が保存されている場所であるため、必然的に Windows ディレクトリを指す値が設定されます。アセンブリを見つける唯一の方法は、アセンブリを c:\Windows\SysWow64 にコピーすることです。これは合理的な方法ではありません。このディレクトリはオペレーティング システムによって所有されています。

<probing>プライベート パスは、app.exe.config ファイルの要素によって構成できます。制限があります。AppBase のサブディレクトリのみを選択できます。c:\Windows\SysWOW64 にサブディレクトリを作成するのは合理的ではありません。script.exe.config ファイルを作成すると、cscript によって実行されるすべてのスクリプトに影響します。それは合理的なことではありません。

.NET フレームワークは、このようなアセンブリ解決の問題に対する非常に合理的な代替手段を提供します。あなたはすでにそれを知っています、それはあなたがしたくないことです. このアセンブリは GAC に属します。

于 2012-12-19T16:06:44.797 に答える