3

私は 2 つのプロジェクト .NET 4.5 C# ソリューションを持っています。1 つのプロジェクト (projectA) は、5 つの参照された .dll (非 COM) ファイルを持つクラス ライブラリです。これらのファイルは 32/64 ビット固有であるため、ビルド パスに 2 つの include/ フォルダー (include/x86/ および include/x64/) があり、それぞれにそれぞれの .dll ファイルがあります。.dll の名前は、32 ビット バージョンと 64 ビット バージョンの間でまったく同じです。もう 1 つのプロジェクト (projectB) は、projectA を参照するコンソール アプリです。x64 モードをデバッグ (またはリリースでも構いません) に構成してビルドすると、すべてが機能します。5 つの .dll すべてが bin/x64/ ディレクトリにコピーされ、プログラムは期待どおりに動作します。ただし、構成を x86 モードに切り替えてビルドすると、5 つの .dll のうち 2 つだけが bin/x86/ ディレクトリにコピーされ、プログラムは明らかに機能しません。FileNotFoundException をスローし、アセンブリが「

不足している .dll ファイルを bin/x86/ フォルダーに手動でコピー (またはビルド後のイベントで xcopy を使用) すると、プログラムは動作します。この問題は、ビルド中に Visual Studio (2012 Update 1) がファイルを正しくコピーしていないことに関係しているようです。projectA の 5 つの参照はすべて [コピー: ローカル] に設定されており、Visual Studio の [プロパティ] ボックスのパスは x86 モードと x64 モードの両方で正しいです。projectA を単独で x86-64 モードでビルドすると、5 つの .dll すべてが正しい bin/ フォルダーに正しくコピーされます。したがって、この問題は projectA を参照する projectB にも対処する必要があります。

projectA.csproj ファイルからの抜粋を次に示します。

<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
   <PlatformTarget>x64</PlatformTarget>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
   <PlatformTarget>x86</PlatformTarget>
</PropertyGroup>

<ItemGroup>
<Reference Include="BaseCommon">
  <HintPath>include\$(Platform)\BaseCommon.dll</HintPath>
</Reference>
<Reference Include="BaseDataAccess">
  <HintPath>include\$(Platform)\BaseDataAccess.dll</HintPath>
</Reference>
<Reference Include="BaseError">
  <HintPath>include\$(Platform)\BaseError.dll</HintPath>
</Reference>
<Reference Include="BaseTof">
  <HintPath>include\$(Platform)\BaseTof.dll</HintPath>
</Reference>
<Reference Include="MassSpecDataReader">
  <HintPath>include\$(Platform)\MassSpecDataReader.dll</HintPath>
</Reference>
<Reference Include="System" />

問題に関するアイデアはありますか?xcopy コマンドを実行できると思いますが、特に x64 モードで正しく動作する場合は、必要ないようです。

3 台の異なるコンピューターで Windows 8 および Windows 7 64 ビットでテスト済み。

4

1 に答える 1

1

一部の .dll ファイルのバージョンが間違っていることに気付いた後、問題を解決しました。.dll で ildasm.exe を使用し、マニフェストを開き、一部の .dll が他の .dll ファイルの間違ったバージョンを参照していることに気付きました。そのため、msbuild は期待どおりにバイナリ ファイルのコピーを実行しませんでした。不足している .dll ファイルを手動でコピーしたときにコードが機能した理由は、API が 2 つのバージョン間で変更されていなかったためです。

于 2013-02-10T21:03:08.057 に答える