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 が受け入れられないと見なされたようです。