У меня есть два проекта .NET 4.5 C #, один проект (projectA) - это библиотека классов, в которой есть 5 файлов .dll (не COM), на которые есть ссылки. Эти файлы специфичны для 32/64-разрядных версий, поэтому у меня есть две папки include / в моем пути сборки (include / x86 / и include / x64 /) с соответствующими файлами .dll в каждой. .Dll имеют одинаковые имена в 32- и 64-разрядных версиях. Другой проект (projectB) - это консольное приложение, которое ссылается на projectA. Когда я настраиваюсь на отладку (или выпуск, не имеет значения) режим x64 и сборку, все работает. Он копирует все 5 .dll в каталог bin / x64 /, и программа работает должным образом. Однако, когда я переключаю конфигурацию в режим x86 и выполняю сборку, только две из пяти .dll копируются в каталог bin / x86 /, и программа явно не работает. Он выдает исключение FileNotFoundException и жалуется, что сборка не загружена, поскольку не может найти ее в каталоге bin /.

Если я вручную скопирую (или использую xcopy в событии post build) отсутствующие файлы .dll в папку bin / x86 /, программа будет работать. Таким образом, похоже, что проблема связана с тем, что Visual Studios (2012 обновление 1) неправильно копирует файлы во время сборки. Для всех 5 ссылок в projectA задано значение «Копировать: локально», и их путь в поле «Свойства» в Visual studios верен как для режимов x86, так и для x64. Когда я создаю projectA отдельно, в любом режиме x86-64, все 5 .dll правильно копируются в правильный bin / папку. Таким образом, проблема также должна касаться проекта B, ссылающегося на projectA.

Вот отрывок из файла 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.

Протестировано с Windows 8 и 64-битной Windows 7 на трех разных компьютерах.

3
Moop 8 Фев 2013 в 07:03
Возможно, я не в себе, но добавление ссылки на проект должно подтянуть необходимые двоичные файлы из этой ссылки.
 – 
Ross Bush
8 Фев 2013 в 07:10
Да, я тоже так думал, но, похоже, это не работает. projectB использует Решение -> Ссылку на проект на projectA и правильно копирует 2 из 5 .dll в папку bin /, а также projectA.dll. Но по какой-то странной причине не удается выполнить остальные 3 .dll.
 – 
Moop
8 Фев 2013 в 07:17

1 ответ

Лучший ответ

Я решил проблему после того, как понял, что некоторые из файлов .dll имеют неправильную версию. Я использовал ildasm.exe для .dll, открыл манифесты и понял, что некоторые из .dll ссылаются на неправильную версию других .dll-файлов. Таким образом, msbuild не выполнил копию двоичных файлов, как ожидалось. Причина, по которой код работал, когда я вручную копировал отсутствующие файлы .dll, заключалась в том, что API не менялся между двумя версиями.

1
Moop 11 Фев 2013 в 01:03