.NETラッパーを備えたネイティブC++ライブラリがあり、すべてVisual Studio 2003および2005でビルドされています。最近、.NETラッパーライブラリをVS2005に移植しましたが、機能しません。.NETラッパーライブラリは混合モードであり、ネイティブC ++およびマネージ拡張クラスがあり、場所にネイティブアセンブリが少しあります。すべての場合にリリースバイナリを想定します。
VS2003 .NET dllは文句なしに完全に機能しますが、これまでのところVS2005ではどこにも到達できません。ネイティブライブラリ上に他のネイティブアプリケーションを構築しているので、問題はリンカー設定と.NETライブラリを取り巻く動的リンクルールに限定されているようです。
.netライブラリはC++のマネージ拡張(/ clr:oldSyntax)を使用しているため、プロパティシートで一部のオプションが制限されています。
私が抱えていた元々の問題は、ランタイムエラーR6034でしAn application has made an attempt to load the C runtime library incorrectly
た。これは、アセンブリに埋め込まれたマニフェストを含めることで修正されました。このための例外トレースは次のとおりです。
Unhandled Exception: System.IO.FileLoadException: A dynamic link library (DLL) initialization routine failed. (Exception from HRESULT: 0x8007045A)
at Corp.Blah.BlahConsole.Program.Main(String[] args)
マニフェストをアセンブリに埋め込んだ後、新しいエラーが発生します。質問のタイトルに並んでいるエラーは、DependencyWalkerによるものです。全文:
Error: The Side-by-Side configuration information for "s:\release\MDM3NET80.DLL" contains errors. This application has failed to start because the application configuration is incorrect. Reinstalling the application may fix this problem (14001).
Warning: At least one delay-load dependency module was not found.
Warning: At least one module has an unresolved import due to a missing export function in a delay-load dependent module.
Kernel32.dllの一部に関連する遅延ロードの警告は、Windowsのさまざまなバージョンで変更されていますが、私のアプリケーション、特にMPR.DLL、IESHIMS.DLL、およびWER.DLLには関係ありません。これらの警告は重要ではないようです。
小さなコンソールアプリケーションで.NETdllをロードしようとすると、次のようになりますSystem.IO.FileLoadException
。
Unhandled Exception: System.IO.FileLoadException: Could not load file or assembly 'BLAH, Version=5.0.0.22, Culture=neutral, PublicKeyToken=ffbc9a05441709bc' or one of its dependencies. This application has failed to start because the application configuration is incorrect. Reinstalling the application may fix this problem. (Exception from HRESULT: 0x800736B1)
File name: 'BLAH, Version=5.0.0.22, Culture=neutral, PublicKeyToken=ffbc9a05441709bc' ---> System.Runtime.InteropServices.COMException (0x800736B1): This application has failed to start because the application configuration is incorrect. Reinstalling the application may fix this problem. (Exception from HRESULT: 0x800736B1)
at Corp.Blah.BlahConsole.Program.Main(String[] args)
このエラーは開発マシンやその他のマシンで発生するため、VisualStudioが間違ったバージョンのMSCRTdllを使用しようとしているとは思われません。
ビルドされたDLLから次のアセンブリを抽出しました。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity name="Corp.Blah.BlahNet">
</assemblyIdentity>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.762" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b">
</assemblyIdentity>
</dependentAssembly>
</dependency>
</assembly>
示されたCRTdllはx86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700
、他の多くのバージョンとともに、の下のWINSxSディレクトリにあります。私が知る限り、これは、このリンクで提案されているように、実行時に正しいバージョンのライブラリをリンクする必要があることを意味します。
リンカとマニフェストの設定をいじるさまざまな方法を試しました。これには次のものが含まれます。
- マニフェストが埋め込まれている場合とない場合でビルドします。マニフェストを追加すると、R6034エラーは修正されますが、FileLoadException/side-by-sideの問題が発生します。
- MSCRT dllを出力フォルダーに配置し、.libファイルを静的にリンクするのではなく、それらへのリンクを試みます。
- コード生成ランタイムライブラリを/MDから/MTに変更します(/ clr:oldSyntaxプロジェクトではサポートされていません。VS2003をサポートする必要があるため、アップグレードできません)。
- プロパティ->リンカ->マニフェストの生成:はい(デフォルト)、いいえ-(同じ結果)
- .NETラッパーをVS2010に移植し、VS2005ネイティブバイナリに対してリンクしようとしました-同じ問題とエラーメッセージが適用されます。
私は多くの同様の質問やフォーラムの投稿を経験してきましたが、これまでに提供されたソリューションはどれも機能しません。誰か助けてもらえますか?私はこれで少し迷っています。
イベントビューアからの追加情報
システムイベントビューアでは、エラーはソースによって報告されます:SideBySide、全文:
S:\ release\BlahNet.dllのアクティベーションコンテキストの生成に失敗しました。参照エラーメッセージ:操作は正常に完了しました。
デイリーWTFの候補のようです。
更新:運がなくてゼロから始めてみました
VS2005プロジェクトファイルを最初から作成し、ソースをインポートすることで、別の試みを行いました。ここに記載されているように、キー署名システムが故障したとき、私は何かに夢中になっているのではないかと思いました。提案されたキー署名方法を試した後でもFileLoadException
、DLLを使用しようとしても同じ結果が得られます。