2

かなり基本的な(100行以内)Visual C#プロジェクトがありますが、サードパーティのDLL参照がいくつか含まれています。プロジェクトが開発されたコンピューターでプロジェクトを実行すると、プロジェクトは正常に実行されます。

Microsoft Visual C#2010 Expressに移動するProject->Publish <project name>と、setup.exeインストーラーを含むいくつかのファイルがビルドされます。

これらのファイルを別のコンピューターに移動してsetup.exeを実行すると、プログラムが正しくインストールされます。

しかし、私がプログラムを実行すると、それは単に次のように終了します。

ProjectName.exeで問題が発生したため、閉じる必要があります。ご不便をおかけしてしまい申し訳ございません。

コマンドウィンドウも少しの間表示され、エラーが発生しますが、何を言っているのか理解するのは困難です。次のようになります。

未処理の例外:System.Runtime.InteropServices.COMException:CLSID {.......}を持つコンポーネントのCOMクラスファクトリの取得が、次のエラーのために失敗しました:....。

コマンドウィンドウを表示したままにすることができないため、完全なメッセージを取得できません。しかし、これは他のコンピュータがそれらのサードパーティのDLLを持っていないことが原因だと思います。

このエラーが表示されないように、Visual C#2010にDLLを含むすべてをパッケージ化するにはどうすればよいですか?または、それが実際の問題ではない場合、コマンドウィンドウがすぐに消えないようにするにはどうすればよいですか?(必要なDLLの完全なリストはわかりません)

または、DLLがC:\ Windows \ system32に登録されているDLLである場合、プロジェクトはそれをパッケージに組み込むことはありませんか?それが何に依存しているかを確認する方法はありますか?

4

1 に答える 1

3

Visual Studio 2010 Express では、完全に機能するインストーラーは作成されず、ClickOnce インストーラーのみが作成され、機能が制限されたインストーラーも作成されます。この種類のインストーラーは、COM DLL を登録できません。

あなたのケースで間違っていると思われるのは、ターゲット システムに登録されていない COM DLL を使用していることです。独自のプログラムでそれを確認し (クラスを作成して、CreateObject 関数によってスローされる例外をキャッチするなど)、RegSvr32.exe /s を呼び出して登録することができます。または、DLL からオブジェクトを作成する前に、プログラムを初めて起動したときにこれを行うだけです...ただし、試したことはありません。

プログラムを実行する前に、DLL をターゲット システムに手動で登録することもできます。

さらに、.Net が COM DLL を使用する場合、通常、COM DLL をラップして .Net にアクセスできるようにする互換アセンブリを作成します。使用する DLL がこの互換性アセンブリのみの場合は、依存する COM DLL をシステム上で手動で見つけ、それをプロジェクトのファイルに明示的に含める必要がある場合があります。

デバッグするには、CreateObject の周りに try / catch ブロックを配置するだけで十分です。それでも問題が解決しない場合は、例外がアプリケーションによって処理されないときに発生するイベントのイベント ハンドラーを追加してみてください (これは、作成するアプリケーションの種類によって異なる場合があります)。

于 2012-06-01T18:17:32.543 に答える