1

さて、大量の調査を行い、見つけることができるほぼすべての管理された CPP Redist を試し、DLL をアプリの実行ディレクトリにローカルにコピーしようとした後、この混合モード ライブラリに欠けている依存関係を特定できません。

基本的に、大規模な C# アプリケーションがあり、作成した混合モード ライブラリを使用しようとしています。開発マシンでは (もちろん) 完璧に動作しますが、CRT の依存関係がないために例外を使用するためにライブラリをロードする必要がある場合に展開されます (私は推測します)。

依存関係ウォーカーを使用して、参照されているすべての DLL をチェックし、それらが展開マシン上に存在することを確認しました。 .

コードが混合モード ライブラリからクラスをインスタンス化しようとすると、次の例外が発生します。

例外の詳細: System.IO.FileLoadException: ファイルまたはアセンブリ 'USADSI.MAPI、Version=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>

必要に応じてさらに情報を提供できますが、残念ながら私は混合モード ライブラリの作成に精通していないため、これは私を失望させました。

誰かがアドバイスを提供できれば、私は非常に感謝しています!

4

5 に答える 5

4

ターゲット マシンにCRT ライブラリを展開しましたか? ロング ショット: 32 ビット コードに依存しているため、[ビルド] プロパティ タブの [ターゲット プラットフォーム] を x86 に設定する必要があります。

編集: Vista で使用可能なSxstrace.exe ユーティリティを使用して、問題を並べて解決するトラブルシューティングを行います。

于 2008-10-23T19:29:54.793 に答える
2

通常、プラグマ コメントスタイル マニフェストの宣言は、開発者のメンテナンスと全体的なビルド アクションの観点から、はるかにエラーが少ないことがわかりました。XML マニフェストは、悪名高いです。

リンカの動作方法と C コードの通常のコンパイルとの類似性、およびこれをソース ファイルの 1 つに単純に取り込むという事実により、すべてがより「一緒に」感じられます。

#pragma comment(linker, \
    "\"/manifestdependency:type='Win32' "\
    "name='Microsoft.Windows.Common-Controls' "\
    "version='6.0.0.0' "\
    "processorArchitecture='*' "\
    "publicKeyToken='6595b64144ccf1df' "\
    "language='*'\"")
于 2009-06-02T07:50:16.627 に答える
1

ターゲット マシンに VS 2005 アプリを初めて展開したときに、同様の問題が発生しました。MSVCRT80 DLL を持ち込む必要がありました。2008 VS ランタイム ライブラリが既にあるということですか?

ETA: また、ばかげた質問ですが、CRT ランタイム (上記にリンクされています).NET ランタイムの両方を、コンパイルした同じバージョン (おそらく 3.5) で使用していますか? あなたはおそらくすでにこれを知っていますが(特にあなたのスコアを考えると)、これらは2つの異なるものです.

于 2008-10-23T20:38:38.477 に答える
1

あまり好きではありませんが、うまくいくように見える解決策を見つけました。

フォルダーをコピーする必要がありました:

Microsoft.VC90.CRT & Microsoft.VC90.MFC

差出人: Program Files\Microsoft Visual Studio 9.0\VC\redist\x86

デプロイされたアプリケーション ディレクトリに入ると、なぜこれが機能しているように見え、再配布可能ファイルが何もしなかったのかわかりません。

編集: マニフェストを見ると、おそらく MFC ディレクトリをコピーする必要はありません

于 2008-10-23T20:42:58.360 に答える
1

この問題を解決する最善の方法は、 http ://technet.microsoft.com/en-us/sysinternals/bb896645.aspx から無料のプロセス モニターをダウンロードすることです。

プロセスのみを監視するフィルターを追加すると、プロセスが試行するすべてのファイル アクセスが表示されます。これにより、見つからない dll が正確に表示されます。

私はいつも同じ問題に直面したときにこれを使用します - Microsoft だけがスローされた例外にファイル名を入力した場合、それはすべて簡単になります。

于 2008-11-03T23:39:14.977 に答える