Как получить 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 и добавить ее в систему управления версиями, поскольку она удобна для сервера сборки.

Другие вопросы по тегам