Как получить MSBuild для создания независимой от платформы COMReference?
Я недавно переключил все наши тестовые проекты с dotnet 4 на dotnet 3.5 (потому что я хочу тестировать код в CLR 2.0 (см. Здесь). Большинство вещей работает нормально, но один тестовый проект имеет зависимость от IWshRuntimeLibrary. Это определяется следующим csproj фрагмент кода:
<COMReference Include="IWshRuntimeLibrary">
<Guid>{F935DC20-1CF0-11D0-ADB9-00C04FD58A0B}</Guid>
<VersionMajor>1</VersionMajor>
<VersionMinor>0</VersionMinor>
<Lcid>0</Lcid>
<WrapperTool>tlbimp</WrapperTool>
<Isolated>False</Isolated>
<EmbedInteropTypes>True</EmbedInteropTypes>
</COMReference>
Мы строим тестовый проект как "AnyCPU". Когда тестовый проект был.Net 4, это, казалось, производило взаимодействие ANYCPU. Теперь это.Net 3.5, dll взаимодействия x86, который вызывает System.BadImageFormatException
во время выполнения на 64-битных платформах. Эта проблема не возникала до понижения тестовых проектов.
1 ответ
Казалось бы, правильно, импорт библиотеки типов в Visual Studio всегда будет устанавливать 32-битный флаг в заголовке сборки взаимодействия. Вы можете убедиться в этом, запустив corflags.exe в сгенерированной сборке.
Создание независимой от платформы библиотеки взаимодействия из VS не поддерживается. Вам придется запустить Tlbimp.exe самостоятельно. Используйте командную строку Visual Studio и перейдите в каталог проекта. Затем выполните эту команду:
Tlbimp / machine: Agnostic c: \ windows \ system32 \ wshom.ocx
И добавьте ссылку на созданный файл Interop.IWshRuntimeLibrary.dll с помощью Project + Add Reference, вкладка Обзор. Это нормально, чтобы проверить DLL в управлении исходным кодом, интерфейсы COM брошены в камне. Установка цели платформы в вашем главном проекте EXE на x86 будет другим обходным путем.
Мне удалось заставить MSBuild сгенерировать независимую от платформы COMReference, явно установив ProcessorArchitecture
собственность Agnostic
в моем файле csproj:
<PropertyGroup>
<ProcessorArchitecture>Agnostic</ProcessorArchitecture>
</PropertyGroup>
Я понял это, посмотрев на задачу ResolveComReference MSBuild в Microsoft.Common.CurrentVersion.targets, которая передает это значение флагу tlbimp.exe /machine.
При этом я решил использовать решение Ханса Пассанта, т. Е. Вручную сгенерировать DLL и добавить ее в систему управления версиями, поскольку она удобна для сервера сборки.