独自のC++ COMコンポーネントを使用する大規模なC#(.net 2.0)アプリと、COMからもアクセスされるサードパーティの指紋スキャナーライブラリがあります。運用中に指紋ライブラリからの一部のイベントがC#アプリに起動されないという問題に遭遇しましたが、独自のC++ COMコンポーネントからのイベントは起動され、正常に受信されました。
MSINFO32を使用して、動作中のシステムにロードされたモジュールと障害が発生したシステムにあるモジュールを比較し、STDOLE.DLLがGACに存在せず、したがって障害のあるプロセスにロードされなかったことが原因であると判断しました。
このファイルをGACにドラッグすると、イベントが指紋COMライブラリから正常に戻ってきました。
それでは、stdole.dllは何をしますか?サイズは16kなので、それほど大きくはなりません... STDOLE32のような別のライブラリへの何らかのリンクですか?その不在がなぜこのような奇妙な行動を引き起こすのでしょうか?
Stdole.dllの配布方法は?これはXCOPYデプロイアプリであり、GACは使用しません。リソースとしてパッケージ化し、System.EnterpriseServices.Internal.Publish.GacInstallを使用してGACにあることを確認する必要がありますか?
Stdole.dllはprimary interop Assemblyのようです。 MSDNの Office 2003 Primary Interop Assembliesを参照してください。
この問題についてもここで説明します: Visual Studio 2015がstdole.dllとMicrosoft.AnalysisServices.AdomdClient.dllをプロジェクトに追加する理由は何ですか?
この場合、古いプロジェクトをVS 2015にアップグレードすると、stdole.dllがプロジェクトに含まれ始めます。
ライブラリ参照にプロパティの「相互運用型を埋め込む」オプションがある場合、これが優先され、その後stdole.dllは不要になる場合があります。 Embed Interop Types=true
参照のプロパティ。
これを可能にするライブラリには、Office、Excel、CoreなどのMS Officeライブラリが含まれます。そうでないものの例は、Crystal Reportsです。
Hans Passant強くお勧めしませんEmbed Interop Types=false
here: Visual Studioの埋め込み相互運用型のtrueとfalseの設定の違いは何ですか?
同じ問題がありました。アプリケーションから参照を削除して、再コンパイルしました。合格したすべてのテストを実行しました。その後、dllを使用せずに再デプロイすると、すべて機能しました。
そもそもこれがプロジェクトでどのように参照されたのかわかりません。これはレガシアプリなので、かなり前のことです。
サイモン
私たちのプロジェクトでは、IDispatchはstdole.dllを使用しています。オブジェクトに変更し、IDispatchを削除してから、参照からstdoleを削除します。
私の場合、それはOffice Word Interopへの古い未使用の参照でした...しかし、それを削除するだけでは十分ではありませんでした:発行プロファイルにはまだstdole.dllをコピーする行がありました!
<File Include="bin/stdole.dll"> ...
(「ファイルで検索」を使用して検出された)その行を削除し、リモートサーバーのbinフォルダーからstdole.dllを削除すると、問題が解決しました。
これが誰かの助けになることを願っています。
Stdoleのプロジェクトへの参照も追加する必要がありました。私はそれへの参照を持っていませんが(それは単純な画像アプリです)、私たちのユーザーの2人はそれが欠落しているというエラーを受け取っていました。これは、3.5アプリの場合にのみ.net 2.0を実行していた可能性があります。理由を見つけました。
また、プロジェクトのプロパティタブで公開し、アプリケーションファイルを選択してから、展開するstdoleを含めました。うまくいけばうまくいくでしょう。