У меня есть два проекта .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 на трех разных компьютерах.
1 ответ
Я решил проблему после того, как понял, что некоторые из файлов .dll имеют неправильную версию. Я использовал ildasm.exe для .dll, открыл манифесты и понял, что некоторые из .dll ссылаются на неправильную версию других .dll-файлов. Таким образом, msbuild не выполнил копию двоичных файлов, как ожидалось. Причина, по которой код работал, когда я вручную копировал отсутствующие файлы .dll, заключалась в том, что API не менялся между двумя версиями.
Похожие вопросы
Новые вопросы
.net
НЕ используйте для вопросов о .NET Core - используйте вместо этого [.net-core]. .NET Framework - это программная среда, предназначенная главным образом для операционной системы Microsoft Windows. Он включает в себя реализацию библиотеки базовых классов, общеязыковой среды выполнения (обычно называемой CLR), общей системы типов (обычно называемой CTS) и динамической среды исполнения. Он поддерживает множество языков программирования, включая C #, VB.NET, F # и C ++ / CLI.