Как получить MSBuild для создания независимой от платформы COMReference? - PullRequest
2 голосов
/ 06 февраля 2012

Я недавно переключил все наши тестовые проекты с 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 Ответ

6 голосов
/ 06 февраля 2012

Казалось бы, правильно, импорт библиотеки типов в Visual Studio всегда будет устанавливать 32-битный флаг в заголовке сборки взаимодействия.Вы можете убедиться в этом, запустив corflags.exe в сгенерированной сборке.

Создание независимой от платформы библиотеки взаимодействия из VS не поддерживается.Вам придется запустить Tlbimp.exe самостоятельно.Используйте командную строку Visual Studio и перейдите в каталог проекта.Затем выполните эту команду:

Tlbimp / machine: Agnostic c: \ windows \ system32 \ wshom.ocx

и добавьте ссылку на сгенерированный Interop.IWshRuntimeLibrary.dllс Project + Добавить ссылку, вкладка Обзор.Это нормально, чтобы проверить DLL в управлении исходным кодом, интерфейсы COM брошены в камень.Установка цели платформы в вашем главном проекте EXE на x86 будет другим обходным путем.

...