混合モードライブラリとCRTの依存関係-ヘルプ
-
04-07-2019 - |
質問
さて、たくさんの調査を行って、ほぼすべてのマネージドCPP Redistを試してみた後、アプリの実行ディレクトリにローカルでDLLをコピーしようとしただけでなく、この混合で欠落している依存関係がわからないモードライブラリ。
基本的に大規模なC#アプリケーションがあり、作成した混合モードライブラリを使用しようとしています。開発マシンでは(もちろん)完璧に動作しますが、使用するためにライブラリをロードする必要があるときにデプロイされます。CRT依存関係が欠落しているため例外が発生します(私は推測します)。
依存関係ウォーカーを使用して、参照されているすべてのDLLをチェックし、運が悪かった展開マシン上に存在することを確認しました。登録する必要があるいくつかの依存関係が見つからないのではないかと思っていますが、私はできません何がわかるか。
コードが混合モードライブラリからクラスをインスタンス化しようとすると、次の例外が発生します。
例外の詳細: System.IO.FileLoadException:できませんでした ファイルまたはアセンブリをロードします 'USADSI.MAPI、 バージョン= 1.0.3174.25238、 Culture = neutral、PublicKeyToken = null ' またはその依存関係の1つ。この アプリケーションの起動に失敗しました アプリケーション構成 間違っている。再インストール アプリケーションがこの問題を修正する場合があります。 (HRESULTからの例外:0x800736B1)
/ clr:oldSyntaxを指定してVS2008 SP1を使用してライブラリをコンパイルしています。
中間マニフェストは次のようになります。
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level='asInvoker' uiAccess='false' />
</requestedPrivileges>
</security>
</trustInfo>
<dependency>
<dependentAssembly>
<assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
</dependentAssembly>
</dependency>
</assembly>
必要に応じてさらに情報を提供できますが、残念ながら、混合モードライブラリの作成に精通していないため、これは私を失望させました。
誰かがアドバイスを提供できるなら、私は非常に感謝します!
解決
CRTを展開しましたかターゲットマシン上のライブラリ?ロングショット:32ビットコードに依存しているため、[ビルドプロパティ]タブで[ターゲットプラットフォーム]をx86に設定する必要があります。
編集: Sxstrace.exeユーティリティ、Vistaで利用可能。
他のヒント
通常、プラグマコメントスタイルマニフェストの宣言は、開発者のメンテナンスと全体的なビルドアクションの観点から、エラーがはるかに少ないことです。 XMLマニフェストはひそかにsnafu 。
リンカの動作とCコードの通常のコンパイルとの類似性、およびソースファイルの1つにこれを単純に組み込むという事実により、すべてが少し「一緒」に感じられます;
#pragma comment(linker, \
"\"/manifestdependency:type='Win32' "\
"name='Microsoft.Windows.Common-Controls' "\
"version='6.0.0.0' "\
"processorArchitecture='*' "\
"publicKeyToken='6595b64144ccf1df' "\
"language='*'\"")
VS 2005アプリをターゲットマシンに初めて展開したときに同様の問題が発生しました-MSVCRT80 DLLを持ち込む必要がありました。 2008 VSランタイムライブラリが既にあると言っていますか?
ETA:また、愚かな質問ですが、CRTランタイム(上記にリンク)と.NETランタイムの両方があり、コンパイルしたのと同じバージョン(おそらく3.5)がありますか?あなたはおそらくこれをすでに知っています(特にあなたのスコアを考慮しています)が、それらは2つの異なるものです。
あまり気に入らないが、うまくいくように見える解決策を見つけた。
フォルダをコピーする必要がありました:
Microsoft.VC90.CRT&amp; Microsoft.VC90.MFC
From:Program Files \ Microsoft Visual Studio 9.0 \ VC \ redist \ x86
デプロイされたアプリケーションディレクトリに、なぜこれが機能しているように見え、再配布可能ファイルは何もしませんでした。
編集:マニフェストを見ると、おそらくMFCディレクトリをコピーする必要はありません
この問題を解決する最良の方法は、以下から無料のプロセスモニターをダウンロードすることです。 http://technet.microsoft.com/en-us/sysinternals/bb896645。 aspx
プロセスのみを監視するフィルターを追加すると、プロセスが試行するすべてのファイルアクセスが表示されます。これにより、見つからないDLLが正確に表示されます。
同じ問題に直面したときは常にこれを使用します-スローされた例外のファイル名をマイクロソフトだけが入力した場合、それはすべて簡単になります。