1

Visual C++ ランタイムをプライベート アセンブリとして配布しています(つまり、msvcp90.dll、msvcm90.dll、msvcr90.dll、および Microsoft.VC90.CRT.manifest を、Microsoft.VC90.CRT.manifest と同じディレクトリにある Microsoft.VC90.CRT フォルダーに配置します)。アプリの実行可能ファイル)。これまでのところ、すべての非開発マシン (数百台) で問題ありませんでした。ただし、これらのアセンブリを完全に見つけることができない特定の問題のあるマシンを追跡してきました。

XP を実行しているため、アプリを起動しようとすると、次のメッセージが表示されます。

アプリケーションの構成が正しくないため、このアプリケーションを開始できませんでした。アプリケーションを再インストールすると、この問題が解決する場合があります。

アプリの exe でDependency Walkerを実行してもらいましたが、msvcp90.dll または msvcr90.dll が見つからないことが示されました。次に、アプリのディレクトリの内容を追跡してもらいました。これにより、「欠落している」DLL が実際にはあるべき場所 (exe に隣接する Microsoft.VC90.CRT ディレクトリ内) にあることが明らかになりましたが、それでもアプリは起動時にそれらが見つからないだけです。

最後の手段として、再配布可能ファイルを直接インストールしてもらいますが、追加のインストーラーを使用せずに DLL を引き続き配布したいので、これは主にトラブルシューティングのためだけです (私たちのアプリはインストールなしで簡単に実行できます)。


おそらく、アプリ独自のマニフェストも含める必要があります。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="OurApp.Name" type="win32"/>
  <description>Our App Description</description>
  <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">
      </assemblyIdentity>
    </dependentAssembly>
  </dependency>
</assembly>

編集: 以前、 が存在しないと述べましたがdependentAssembly、それが生成されていることに気付いたので、上記のマニフェストは、それが作成する実際のマニフェストを反映しています。


プログラムがこれらの依存関係を単に見つけられない原因は何ですか? 他の多くのコンピューターでも問題なく実行できることがわかりましたが、そのほとんどは、これらのランタイムをこれまで見たことがありません。私はおそらく何か基本的なものを台無しにしています (私のマニフェストで最も可能性が高い) が、これまでのところ 99% のクライアント コンピューターで正常に動作します。

おまけとして、この記事はプライベート アセンブリの優れた要約ですが、これまでのところ、問題の解決には役立っていません。

更新: DLL を EXE と同じディレクトリに移動した後も、起動に失敗しました。次に、再配布可能ファイルをインストールした後、正常に起動しました。そのため、ローカル ディレクトリを検索していなかったか、何らかの理由でローカル DLL が受け入れられないと見なされたようです。

4

2 に答える 2

1

同じ Windows マシンに現在インストールされている Visual Studio のバージョンはありますか?

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682586(v=vs.85).aspxをよく見てください。このリンクには、オペレーティング システムが DLL を検索する方法に関する情報が含まれています。その動作を変更する可能性のあるレジストリ キーがいくつかあります。

この依存関係を排除する他のオプションは、プロジェクトで MFC/ATL との静的リンクを使用することです。バイナリは大きくなりますが、この問題をすべて解決できます..

于 2012-02-24T16:23:38.047 に答える
0

私はもっ​​と早くこれに戻るつもりでしたが、それはテストケースを待っているバックバーナーにありました。非常に単純な問題であることが判明しました。間違ったDLLバージョンを探していました。VSによって生成されたマニフェストは、VSから抽出したものと同じバージョンの再配布可能ファイルを使用するように設定されていませんでした。マニフェストの自動生成を無効にし、自分のマニフェストのバージョンを、再配布するDLLのバージョンと一致するように設定するだけで、機能します。

于 2012-04-10T14:46:11.627 に答える